Визуальный и логический обход дерева не восстанавливает несколько уровней
Я изучаю логические и визуальные деревья из одного и того же приложения, но безуспешно изучаю уровни.
Мой код использует общий проводник:
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
тоже). Предложения?