Silverlight 4 - Visual Tree helper返回0个子元素

本文关键字:返回 0个 元素 helper Tree Visual Silverlight | 更新日期: 2023-09-27 18:04:29

我有下面的代码,应该找到一个元素内部的东西。问题是我有一个DataGrid,它的第一列在标题中有一个CheckBox。复选框本身是在样式中定义的,它存在于父/子窗口的<controls:ChildWindow.Resources>字典中。

在运行时,如果网格的绑定集合的所有元素都被"选中",那么我需要选中这个该死的复选框。但是,由于复选框存在于样式中,因此不容易访问,因此我需要遍历整个DOM以找到特定的复选框。

这是生成DOM遍历的代码。它是作为FrameworkElement的扩展方法实现的,所以我可以从继承FrameworkElement的任何控件调用FindElement或GetChildren方法:

public static class FrameworkElementExtensions
{
    public static FrameworkElement FindElement(this FrameworkElement parentFrameworkElement, string childFrameworkElementNameToSearch)
    {
        FrameworkElement childFrameworkElementFound = null;
        parentFrameworkElement.SearchElements(ref childFrameworkElementFound, childFrameworkElementNameToSearch);
        return childFrameworkElementFound;
    }
    public static List<FrameworkElement> GetChildren(this FrameworkElement parentElement)
    {
        List<FrameworkElement> childFrameworkElementsFound = new List<FrameworkElement>();
        parentElement.GetChildren(childFrameworkElementsFound);
        return childFrameworkElementsFound;
    }
    public static void SearchElements(this FrameworkElement parentFrameworkElement, ref FrameworkElement childFrameworkElementToFind, string childFrameworkElementName)
    {
        int childrenCount = VisualTreeHelper.GetChildrenCount(parentFrameworkElement);
        if (childrenCount > 0)
        {
            FrameworkElement childFrameworkElement = null;
            for (int i = 0; i < childrenCount; i++)
            {
                childFrameworkElement = (FrameworkElement)VisualTreeHelper.GetChild(parentFrameworkElement, i);
                if (childFrameworkElement != null && childFrameworkElement.Name.Equals(childFrameworkElementName))
                {
                    childFrameworkElementToFind = childFrameworkElement;
                    return;
                }
                childFrameworkElement.SearchElements(ref childFrameworkElementToFind, childFrameworkElementName);
            }
        }
    }
    public static void GetChildren(this FrameworkElement parentFrameworkElement, List<FrameworkElement> allChildFrameworkElement)
    {
        int childrenCount = VisualTreeHelper.GetChildrenCount(parentFrameworkElement);
        if (childrenCount > 0)
        {
            for (int i = 0; i < childrenCount; i++)
            {
                FrameworkElement childFrameworkElement = (FrameworkElement)VisualTreeHelper.GetChild(parentFrameworkElement, i);
                    allChildFrameworkElement.Add(childFrameworkElement);
                    childFrameworkElement.GetChildren(allChildFrameworkElement);
            }
        }
    }
}

所以手头的问题是,当我沿着SomeDataGrid.FindElement("HeaderCheckBox");的行调用一些东西时,它总是返回null。这里的假设是,我有一个名为SomeDataGrid的数据网格和一个在名为HeaderCheckBox的样式中定义的CheckBox。

在进一步调试后,我还发现无论我从哪个控件调用这些扩展方法,在我的代码中最后两个方法中使用的VisualTreeHelper.GetChildrenCount方法调用总是返回0 ??WTF ?

有谁知道如何解决这个问题吗?谢谢,马丁

Silverlight 4 - Visual Tree helper返回0个子元素

当然,没问题。

它是用VS2010和Silverlight 4…以防万一。