2012-11-06 28 views
0

我有一個名爲ZoneContainer的用戶控件。這有一個財產,其中包含ListBox包含數量ListItem s。每個ListItem包含一個DockPanelVisualTreeHelper找不到DependencyObject的子項,我該如何可靠地找到對象?

我試圖使用下面的代碼來查找ZoneContainer內部存在的子代,但childrenCount每次都是0。

var parent = this as DependencyObject; // I can see that this is populated. 

int childrenCount = VisualTreeHelper.GetChildrenCount(parent); 

是否有另一種方法來查找對象列表中的特定子對象?最終,我試圖找到DockPanel,但即使我知道它們在對象中,但它沒有找到任何兒童。

+0

你是在'ZoneContainer'的構造函數中調用它嗎? – Clemens

+0

@Clemens,是的,我...我想我可以看到你的問題在哪裏。對象尚未創建? – DaveDev

+0

是的,請嘗試在[Loaded](http://msdn.microsoft.com/zh-cn/library/system.windows.frameworkelement.loaded.aspx)事件處理程序中執行此操作。 – Clemens

回答

0

我通過查詢對象而不是爬行可視化樹解決了這個問題。

var header = container.ListBox.Items.Cast<ListBoxItem>() 
    .Select(item => (MyType) item.Content) 
    .FirstOrDefault(myType => myType.dpHeader.Name == "whatever").dpHeader; 
1

這是我潛藏在我的圖書館中的功能。我從來沒有遇到任何問題,但它確實有GetChildrenCount()調用,所以如果這不適合你,你可能會遇到更大的問題。

Public Shared Function FindVisualChild(Of T As DependencyObject)(ByVal element As DependencyObject) As T 
    If element Is Nothing Then 
     Return Nothing 
    ElseIf TypeOf (element) Is T Then 
     Return element 
    Else 
     Dim count = VisualTreeHelper.GetChildrenCount(element) 
     For index As Integer = 0 To count - 1 
      Dim child As DependencyObject = VisualTreeHelper.GetChild(element, index) 
      If TypeOf (child) Is T Then 
       Return child 
      Else 
       Dim grandchild As T = FindVisualChild(Of T)(child) 
       If grandchild IsNot Nothing Then Return grandchild 
      End If 
     Next 
    End If 

    Return Nothing 
End Function 

用法:X = FindVisualChild(中DockPanel中)(ParentObject)

是的,我知道這是VB。這是關於你的一個C#人必須將代碼轉換一次的時間! :)

2

這裏的基本問題是,並非所有孩子的是的VisualTree的一部分
您可以從約什 - 史密斯

這裏有我的擴展,讓所有童車

找到有關這個問題在此 articel更多信息
public static IEnumerable<DependencyObject> getChilds(this DependencyObject parent) 
    { 
     if (parent == null) yield break; 

     //use the logical tree for content/framework elements 
     foreach (object obj in LogicalTreeHelper.GetChildren(parent)) 
     { 
      var depObj = obj as DependencyObject; 
      if (depObj != null) 
       yield return depObj; 
     } 

     //use the visual tree for Visual/Visual3D elements 
     if (parent is Visual || parent is Visual3D) 
     { 
      int count = VisualTreeHelper.GetChildrenCount(parent); 
      for (int i = 0; i < count; i++) 
      { 
       yield return VisualTreeHelper.GetChild(parent, i); 
      } 
     } 
    }