Визуальный и логический обход дерева не восстанавливает несколько уровней

Я изучаю логические и визуальные деревья из одного и того же приложения, но безуспешно изучаю уровни.

Мой код использует общий проводник:

private static void ProcessGenericTree(object current, List<FrameworkElement> leaves, Type treeType) 
        {
            if (current is FrameworkElement)
            {
                if (!leaves.Contains(current as FrameworkElement))
                    leaves.Add(current as FrameworkElement);
            }

            DependencyObject dependencyObject = current as DependencyObject;

            if (dependencyObject != null)
            {
                if (treeType.Equals(typeof(VisualTreeHelper)))
                {
                    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(dependencyObject); i++)
                    {
                        ProcessVisualTree(VisualTreeHelper.GetChild(dependencyObject, i), leaves);
                    }
                }
                else
                {
                    foreach (object child in LogicalTreeHelper.GetChildren(dependencyObject))
                    {
                        ProcessLogicalTree(child, leaves);
                    }
                }
            }
        }

ProcessLogicalTree а также ProcessVisualTree просто повторять (делать что-то до ProcessGenericTree отзыв).

Результат выглядит полным, но когда я пытаюсь получить TextBlock в GridViewColumn Заголовок выглядит так, как будто элемент не существует ни в логическом, ни в списке визуальных листьев FrameworkElement,

Кажется, это визуальный элемент в логический элемент. На самом деле добавление смотреть это TextBlock появляется в Visual Children моего GridView (извлеченный как логический, он стоит в Tab Item не выбран), но мой код не может его получить.

Мой звонок довольно прост:

         ProcessVisualTree(root, _visualElements);
         ProcessLogicalTree(root, _logicalElements);

где корень - главное окно.

Итак, как я могу исследовать свое дерево на самом глубоком уровне? Может быть, повторять через полученные FrameworkElement список? Я думаю, что мой код ProcessGeneric уже делает это.

Обновление: визуализатор WPF показывает такую ​​структуру:

ListView > ScrollViewer > Grid > DockPanel > Grid > ScrollContentPresenter > GridViewHeaderRowPresenter > GridViewColumnHeader > HeaderBorder

GridViewColumnHeader уровень содержит мой TextBlock но визуальное дерево нет.

Обновление 2: используя рекурсию, начиная с главного окна, с видимым элементом, я не могу найти объект с указанным именем с помощью этого кода:

public static T FindVisualChild<T>(DependencyObject depObj) where T : DependencyObject
{
    if (depObj != null)
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
        {
            DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
            if (child != null && child is T)
            {
                return (T)child;
            }

            T childItem = FindVisualChild<T>(child);
            if (childItem != null) return childItem;
        }
    }
    return null;
}

Я уверен, что VisualTreeHelper не может получить элементы внутри свойства Header, но инспектор WPF работает правильно.

Интересно, использует ли он другой подход для обхода дерева (возможно, Properties лайк Header тоже). Предложения?

0 ответов

Другие вопросы по тегам