VisualTreeHelper找不到依赖项的孩子,我如何可靠地找到对象



我有一个称为ZoneContainer的USERCONTROL。该属性包含一个包含许多ListItem s的ListBox。每个ListItem都包含一个DockPanel

我正在尝试使用以下代码来查找ZoneContainer中存在的孩子,但childrenCount每次都是0。

var parent = this as DependencyObject; // I can see that this is populated.
int childrenCount = VisualTreeHelper.GetChildrenCount(parent);

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

这里的基本问题是,并非所有孩子都是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);
            }
        }
    }

这是我在库中潜伏的功能。我从来没有遇到过任何麻烦,但是它确实有一个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。现在是你们中的一个人必须一次转换代码了!:)

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

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

相关内容

  • 没有找到相关文章

最新更新