Silverlight 4 - Visual Tree помощник возвращает 0 дочерних элементов? - PullRequest
0 голосов
/ 03 августа 2011

У меня есть следующий код, который должен найти элемент внутри чего-то.Проблема в том, что у меня есть 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 Ответ

0 голосов
/ 04 августа 2011

Конечно, нет проблем. Вот оно.

Это было сделано с VS2010 и Silverlight 4 ... на всякий случай.

...