2015-09-17 3 views
1

Самый простой способ поиска по вертикали и по горизонтали в визуальном дереве?Элемент поиска WPF с помощью VisualTreeHelper по вертикали и горизонтали

Например, я хочу найти элемент управления, которого нет в списке родителей из элемента управления, который запускает поиск.

Вот простой пример (каждый блок представляет некоторый контроль пользовательского интерфейса):

Visual-Tree

Например я начинаю во вложенном управлении (Search-Start) и хочу найти другой вложенный контроль (Должно быть найдено).

Каков наилучший способ для этого? Разбор полного визуального дерева кажется не очень эффективным ... Спасибо!

+1

Что вы имеете в виду с эффективными? Не работает или не самый эффективный способ? Предполагая, что у вас нет знаний о дереве и нет имени элемента для поиска, обход (возможно) всего дерева является единственным, чтобы найти то, что вам нужно. –

+0

Я имею в виду как можно быстрее :) У меня есть только информация, что элемент управления должен быть очень близок к элементу * root *, подобному окну. Элемент управления, который мне нравится искать, - это «RadRibbonView». – BendEg

+1

Возможно, [ширина] сначала (https://en.wikipedia.org/wiki/Breadth-first_search) может быть более эффективным, чем пройденное вами дерево. –

ответ

2

Нет горизонтального поиска, class VisualTreeHelpers кто может вам помочь Navigate on a WPF’s Visual Tree. Через навигацию вы можете выполнять все виды поиска.

Его самый эффективный способ, потому что его класс .Net специально для вашего требования.

Для instens:

// Search up the VisualTree to find DataGrid 
// containing specific Cell 
var parent = VisualTreeHelpers.FindAncestor<DataGrid>(myDataGridCell); 

// Search down the VisualTree to find a CheckBox 
// in this DataGridCell 
var child = VisualTreeHelpers.FindChild<CheckBox>(myDataGridCell); 

// Search up the VisualTree to find a TextBox 
// named SearchTextBox 
var searchBox = VisualTreeHelpers.FindAncestor<TextBox>(myDataGridCell, "SeachTextBox"); 

// Search down the VisualTree to find a Label 
// named MyCheckBoxLabel 
var specificChild = VisualTreeHelpers.FindChild<Label>(myDataGridCell, "MyCheckBoxLabel"); 
+0

Работает отлично. Я использовал «Window parentWindow = Window.GetWindow (текущий);' для поиска * root *, а затем 'FindChild ()', чтобы получить тот, который мне нужен :) Спасибо! – BendEg

Смежные вопросы