0

我有一个名为ZoneContainer. 这有一个属性,它包含一个ListBox包含多个ListItems 的属性。每个 ListItem 包含一个DockPanel.

我正在尝试使用以下代码来查找内部存在ZoneContainerchildrenCount每次都为 0 的孩子。

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

int childrenCount = VisualTreeHelper.GetChildrenCount(parent);

是否有另一种方法可以在对象列表中找到特定的子对象?最终我试图找到 DockPanel,但它没有找到任何孩子,即使我知道他们在对象中。

4

3 回答 3

2

这里的基本问题是并非所有孩子都是 VisualTree 的一部分可以在Josh Smith
的这篇文章中找到有关此问题的更多信息

这是我获得所有孩子的扩展

    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);
            }
        }
    }
于 2014-09-02T14:04:12.220 回答
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(Of DockPanel)(ParentObject)

是的,我知道它是VB。现在是你们中的一个 C# 人员必须转换代码一次的时候了!:)

于 2012-11-06T09:43:15.340 回答
0

我通过查询对象而不是爬取可视化树解决了这个问题。

var header = container.ListBox.Items.Cast<ListBoxItem>()
    .Select(item => (MyType) item.Content)
    .FirstOrDefault(myType => myType.dpHeader.Name == "whatever").dpHeader;
于 2012-11-26T09:25:33.407 回答