【问题标题】:WPF FocusNavigationDirection, MoveFocus and Arrow keysWPF FocusNavigationDirection、MoveFocus 和箭头键
【发布时间】:2011-08-08 19:31:39
【问题描述】:

我有一个简单的应用程序(一个带有 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 Documentation 对“左侧”的定义有点模糊。

如果需要,我还将每个按钮的制表位定义为 1 到 6。

【问题讨论】:

    标签: c# wpf keyboard focusmanager


    【解决方案1】:

    为什么你需要获取elementWithFocus,而你可以使用“this”(窗口自己的范围)?

    我稍微修改了你的代码,它对我有用:

        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);
        }
    

    【讨论】:

      【解决方案2】:

      你试过FocusNavigationDirection.Previous(左)和FocusNavigationDirection.Next(右)吗?

      这可能比其他值提供更可预测的行为。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-21
        • 2011-04-06
        • 2013-08-10
        相关资源
        最近更新 更多