2009-07-24 55 views

回答

2

鑑於XAML以下元素聲明

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

有兩種方法來實現這一點,最簡單的要求Silverlight工具包:

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; 
    } 
相關問題