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 ?
有谁知道如何解决这个问题吗?谢谢,马丁
当然,没问题。
它是用VS2010和Silverlight 4…以防万一。