WPF FocusNavigationDirection, MoveFocus и клавиши со стрелками

У меня есть простое приложение (сетка с 6 кнопками - 2 ряда по 3 - на нем для тестирования), и я обрабатываю клавиши со стрелками влево и вправо следующим образом.

    private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        FocusNavigationDirection focusDirection = new System.Windows.Input.FocusNavigationDirection();

        switch (e.Key)
        {
            case Key.Left:
                focusDirection = System.Windows.Input.FocusNavigationDirection.Left;
                break;
            case Key.Right:
                focusDirection = System.Windows.Input.FocusNavigationDirection.Right;
                break;
            default:
                break;
        }
        TraversalRequest request = new TraversalRequest(focusDirection);

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

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

    }

К сожалению, это ведет себя не так, как я ожидаю, поскольку кажется, что фокус всегда перемещается в направлении, противоположном указанному в FocusNavigationDirection.

Любые мысли о том, почему это будет? Документация MSDN немного расплывчата в отношении того, как "слева от " определено.

На случай, если это необходимо, я также определил позиции табуляции для каждой из кнопок с 1 по 6.


person Martin Smith    schedule 19.04.2011    source источник


Ответы (2)


Зачем вам нужно получить elementWithFocus, когда вы можете использовать «это» (собственная область окна)?

Я немного изменил ваш код, и это сработало для меня:

    private void Window_OnPreviewKeyDown(object sender, KeyEventArgs e)
    {
        switch (e.Key)
        {
            case Key.Left:
                this.MoveFocus(FocusNavigationDirection.Previous);
                break;
            case Key.Right:
                this.MoveFocus(FocusNavigationDirection.Next);
                break;
            default:
                break;
        }
    }

    private void MoveFocus(FocusNavigationDirection direction)
    {
        var request = new TraversalRequest(direction);
        this.MoveFocus(request);
    }
person tridy.net    schedule 01.02.2013

Вы пробовали FocusNavigationDirection.Previous (слева) и FocusNavigationDirection.Next (справа)?

Это может дать более предсказуемое поведение, чем другие значения.

person Doug    schedule 13.07.2011