WPF. Как установить фокус на элементе по индексу табуляции? - PullRequest
1 голос
/ 18 февраля 2011

Можно ли получить элемент или установить фокус на нем (например, TextBox) по его индексу табуляции, если элемент является частью DataTemplate и индекс табуляции элемента уникально определен?

1 Ответ

3 голосов
/ 19 февраля 2011

Вы можете VisualTreeHelper найти любой элемент, созданный с помощью шаблонов.
Поэтому вы можете проверить TabIndex любого существующего элемента и найти нужный вам элемент (если ваш индекс табуляции действительно уникален):).Вы также можете назвать свои элементы в DataTemplate и фильтре для имени.

Следующая функция позволяет вам найти все элементы данного типа визуального дерева.

void FindChildFrameworkElementsOfType<T>(DependencyObject parent,IList<T> list) where T: FrameworkElement{             
    DependencyObject child; 
    for(int i=0;i< VisualTreeHelper.GetChildrenCount(parent);i++){             
        child = VisualTreeHelper.GetChild(parent, i); 
        if (child is T) { 
            list.Add((T)child); 
        } 
        FindChildFrameworkElementsOfType<T>(child,list); 
    } 
}

Вызовите егоследующим образом:

List<TextBox>  textBoxList=new List<TextBox>();
FindChildFrameworkElementsOfType<TextBox>(rootObject,textBoxList);

Где rootObject - корневой объект, такой как ваше окно или базовый элемент управления.Вы получите список всех текстовых полей, и этот список может быть проверен для tab-index или любого свойства, которое вы хотите проверить.
Позаботьтесь о том, чтобы дерево было построено перед вызовом этой функции.Кроме того, существуют некоторые обстоятельства, при которых вышеуказанный шаблон не работает, например, при виртуализации пользовательского интерфейса в списках.

...