2009-07-24 2 views

답변

2

<ListBox x:Name="LB" Loaded="LB_Loaded" /> 

이를 달성하는 방법은 두 가지가 있습니다은 가장 쉬운 실버 라이트 툴킷이 필요합니다

using System.Windows.Controls.Primitives; 

private void LB_Loaded() 
{ 
    var itemsPanel = LB.GetVisualChildren().OfType<Panel>().FirstOrDefault(); 
} 

을 아니면 VisualTreeHelper를 사용하여 다음을 쓸 수 있습니다 재귀 적 방법 :

T GetFirstChildOfType<T>(DependencyObject visual) where T:DependencyObject 
{ 
    var itemCount = VisualTreeHelper.GetChildrenCount(visual); 
    if (itemCount < 1) 
    { 
    return null; 
    } 

    for (int i = 0; i < itemCount; i++) 
    { 
    var dp = VisualTreeHelper.GetChild(visual, i); 
    if (dp is T) 
    { 
     return (T)dp; 
    } 
    } 
    for (int i = 0; i < itemCount; i++) 
    { 
    var dp = GetFirstChildOfType<T>(VisualTreeHelper.GetChild(visual, i)); 
    if (dp != null) return dp; 
    } 
    return null; 
} 

유사한 방식 : terphi의 솔루션에

void ItemsPanelSample_Loaded(object sender, RoutedEventArgs e) 
{ 
    var itemsPanel = GetFirstChildOfType<Panel>(LB); 
} 
0

건물, 내가 유형에 대한 검색이 목록 상자는 무엇을하는 복수의 여러 인스턴스를 가질 때 당신은뿐만 일반적으로 찾고있는 요소의 목록을 반환하도록 변경 를 찾고 있습니다. 또한로드 된 이벤트에서 문제를 발견했지만 대신 디스패처를 사용하여 테스트 할 때마다 항목을 찾습니다. 생성자

private List<TextBlock> TextBlockList; 

,리스트 박스와 데이터 소스를 연관 후 :

Dispatcher.BeginInvoke(delegate { TextBlockList = GetFirstChildOfType<TextBlock>(listBox1); }); 


    List<T> GetFirstChildOfType<T>(DependencyObject visual) where T : DependencyObject 
    { 
     DependencyObject ControlCandidate; 
     List<T> TempElements; 
     List<T> TargetElementList = new List<T>(); 


     var itemCount = VisualTreeHelper.GetChildrenCount(visual); 
     if (itemCount > 0) 
     { 
      for (int i = 0; i < itemCount; i++) 
      { 
       ControlCandidate = VisualTreeHelper.GetChild(visual, i); 
       if (ControlCandidate is T) 
        TargetElementList.Add((T)ControlCandidate); 
      } 

      for (int i = 0; i < itemCount; i++) 
      { 
       TempElements = GetFirstChildOfType<T>(VisualTreeHelper.GetChild(visual, i)); 
       if (TempElements.Count > 0) 
        TargetElementList.AddRange(TempElements); 
      } 
     } 

     return TargetElementList; 
    } 
관련 문제