2009-04-30 1 views
8

Может ли кто-нибудь сказать мне, как программно перемещаться по всем вкладкам табуляции элементов пользовательского интерфейса в приложении WPF? Я хочу начать с первой остановки табуляции, чтобы обнюхивать соответствующий элемент, посещать следующую вкладку, обнюхивать соответствующий элемент и так далее, пока не дойду до последней остановки табуляции.Как программно перемещаться по вкладкам элементов элемента интерфейса WPF?

Спасибо, - Майк

ответ

27

Вы что, используя MoveFocus, как показано в этой статье MSDN, которая объясняет все о фокусе: Focus Overview.

Вот пример кода, чтобы перейти к следующему сфокусированному элементу (полученному из этой статьи, слегка измененному).

// MoveFocus takes a TraversalRequest as its argument. 
TraversalRequest request = new TraversalRequest(FocusNavigationDirection.Next); 

// Gets the element with keyboard focus. 
UIElement elementWithFocus = Keyboard.FocusedElement as UIElement; 

// Change keyboard focus. 
if (elementWithFocus != null) 
{ 
    elementWithFocus.MoveFocus(request); 
} 
+0

доброжелательный, большое спасибо! – lamarmora

1

Вы можете сделать это с помощью вызова MoveFocus. Вы можете получить текущий фокус объекта через FocusManager. Следующий код будет перебирать все объекты в окне и добавлять их в список. Обратите внимание, что это физически изменит окно, переключив фокус. Скорее всего, код не будет работать, если окно не активно.

// Select the first element in the window 
this.MoveFocus(new TraversalRequest(FocusNavigationDirection.First)); 

TraversalRequest next = new TraversalRequest(FocusNavigationDirection.Next); 
List<IInputElement> elements = new List<IInputElement>(); 

// Get the current element. 
UIElement currentElement = FocusManager.GetFocusedElement(this) as UIElement; 
while (currentElement != null) 
{ 
    elements.Add(currentElement); 

    // Get the next element. 
    currentElement.MoveFocus(next); 
    currentElement = FocusManager.GetFocusedElement(this) as UIElement; 

    // If we looped (If that is possible), exit. 
    if (elements[0] == currentElement) 
     break; 
} 
+0

Этот код не работал в моем окне WPF. Список заканчивается пустым. Первый вызов GetFocusedElement() выше возвращает null. Я согласен, что этот код точно соответствует документации, но, к сожалению, это не сработало для меня. Я копаю, чтобы понять, почему. –

+1

Где вы звоните Код? Обратите внимание, что окно должно быть активным, поэтому конструктор определенно отсутствует. OnLoad может работать, я использовал Activated, который вызывается каждый раз, когда вы активируете окно. –

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