Как программно перемещаться по вкладкам элемента WPF UI? - PullRequest
8 голосов
/ 01 мая 2009

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

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

Ответы [ 2 ]

27 голосов
/ 01 мая 2009

Это делается с помощью MoveFocus, как показано в этой статье MSDN, в которой объясняется все о фокусе: Обзор фокуса .

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

// 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);
}
1 голос
/ 01 мая 2009

Вы можете сделать это с помощью вызова 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;
}
...