2009-11-23 2 views
7

<의 컨트롤리스트를 만드는 신뢰할 수있는 방법을 찾고 있습니다.> 특정 < 패널에 포함 된 컨트롤> 파생 컨트롤 - 직접적인 자식 컨트롤을 포함하며, 아이들의 아이들 등등.
는 < 유형이 컨트롤>의 자식 목록에 추가, 다음 < 패널> 또는 자손이 컨트롤의 자식에 대한 기능을 반복 : Silverlight : 레이아웃에서 컨트롤 유형을 모두 찾으십시오.

가장 확실한 방법

은 재귀 적으로 그것을하는 것이 었습니다.

그러나이 모든 컨트롤을 트리에서 찾을 수 없다는 우려가 있습니다 - 모든 ContentControl에도 < Type> 컨트롤이 포함될 수 있으므로 HeaderedContentControl 또는 하나 이상의 자식/콘텐츠 특성이있는 유사한 컨트롤 .

특정 부모가없는 특정 컨트롤 유형의 인스턴스를 찾을 수 있도록 실제 레이아웃 트리에 대해 검색을 수행 할 수있는 방법이 있습니까?

답변

20

여기 상당히 순진 확장 방법 : -

public static class VisualTreeEnumeration 
{ 
    public static IEnumerable<DependencyObject> Descendents(this DependencyObject root) 
    { 
    int count = VisualTreeHelper.GetChildrenCount(root); 
    for (int i=0; i < count; i++) 
    { 
     var child = VisualTreeHelper.GetChild(root, i); 
     yield return child; 
     foreach (var descendent in Descendents(child)) 
     yield return descendent; 
    } 
    } 
} 

이 방법은이 수행하는이 변경이 진행 중에 트리 회원에 발생하지 가정 것을 다시 그립니다. 이것은 ToList()를 사용하여 사용 중에 완화 될 수 있습니다.

지금 당신은 LINQ를 사용하여 요구 사항에 영향을 줄 수 : -

var qryAllButtons = myPanel.Descendents().OfType<Button>(); 
+0

네, 잘 작동합니다. 고맙습니다. – Jonx

+0

@AnthonyWJones Descendents를 사용할 때 컨트롤이 나를 위해 다시 실행되지 않습니다. 추적 및 VisualTreeHelper.GetChildrenCount (루트)가 0을 반환합니다. 이유는 무엇입니까? –

1

이의 당신이 GRID으로 시작 그리드, stackpanels, 캔버스 등을 포함하는 콤보

을 중첩 된 UserControl이 내부 콤보를 찾으려한다고 가정 해 봅시다
  1. Imports System.Windows.Controls.Primitives (또는 C 번호 사용)
  2. Dim ListOfComboBoxes = MAINGRID.GetVisualDescendants.OfType(Of ComboBox)

그게 전부예요.

+0

'GetVisualDescendants'가 Silverlight 배포판 AFAICT에 없습니다. ([MSDN] (http://google.com/search?q=GetVisualDescendants+site%3Amsdn.microsoft.com+-site%3Asocial.msdn.microsoft.com)에서 간단한 정의는 없습니다.)'System.Windows.Controls .Toolkit' [보인다] (http://stackoverflow.com/a/7442356/256431) 필요합니다. –

+0

System.Windows.Controls.Primitives는 c : \ Program Files (Microsoft) SDKs \ Silverlight \ v5.0 \ Libraries \ Client \ System.Windows.Controls 디렉터리의 System.Windows.Controls에 포함되어 있습니다. dll. –