Silverlight 4 - помощник Visual Tree возвращает 0 дочерних элементов?
У меня есть следующий код, который должен найти элемент внутри чего-то. Проблема в том, что у меня есть 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");
он всегда возвращает ноль. Здесь предполагается, что у меня есть DataGrid с именем SomeDataGrid и CheckBox, определенный в стиле с именем HeaderCheckBox.
После дальнейшей отладки я также обнаружил, что независимо от того, из какого управления я вызываю эти методы расширения, VisualTreeHelper.GetChildrenCount
вызов метода, использованный в последних двух методах в моем коде, всегда возвращает 0??? WTF?
У кого-нибудь есть идеи, как это исправить? Спасибо мартин
1 ответ
Конечно, без проблем. Вот.
Это было сделано с VS2010 и Silverlight 4... на всякий случай.