2009-07-24 8 views

答えて

2

XAML

で、次の要素宣言
<ListBox x:Name="LB" Loaded="LB_Loaded" /> 

これを達成するための2つの方法があります考えると、最も簡単には、Silverlightのツールキットが必要です再帰的方法:

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; 
} 

結果をa同様:建物の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; 
    } 
関連する問題