我有以下代码应该在某物内部找到一个元素。问题是我有一个 DataGrid,它的第一列的标题中有一个 CheckBox。复选框本身定义在一个样式中,该样式存在于<controls:ChildWindow.Resources>
父子窗口的字典中。
在运行时,如果网格的绑定集合的所有元素都被“选中”,那么我需要选中该死的复选框。但是,由于复选框存在于样式中,因此不容易访问,因此我需要遍历整个 DOM 以找到特定的复选框。
这是实现 DOM 遍历的代码。它是作为 FrameworkElement 的扩展方法实现的,因此我可以从任何继承自的控件调用 FindElement 或 GetChildren 方法FrameworkElement
:
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");
它总是返回一个空值。这里的假设是我有一个名为 SomeDataGrid 的 DataGrid 和一个在名为 HeaderCheckBox 的样式中定义的 CheckBox。
经过进一步调试,我还发现无论我从哪个控件调用这些扩展方法,VisualTreeHelper.GetChildrenCount
我代码中最后两个方法中使用的方法调用总是返回 0 ??? 怎么回事?
任何人都知道如何解决这个问题?谢谢,马丁