【问题标题】:Maintain tab order on keyup and keydown在 keyup 和 keydown 上保持 Tab 键顺序
【发布时间】:2012-03-12 06:53:02
【问题描述】:

我是 WPF 的新手,在我的应用程序中,我想通过导航键(向上/向下箭头键)来保持 Tab 键顺序。所以我在窗口加载事件上迭代网格中的每个控件并添加委托如下

private void Window_Loaded(object sender, RoutedEventArgs e)
        {

            foreach (UIElement element in gridChild.Children)
            {
                if (element.GetType() == typeof(TextBox))
                {
                    TextBox tb1 = (TextBox)element;
                    tb1.PreviewKeyUp += TextBox_KeyDown;
                }
                else if (element.GetType() == typeof(PasswordBox))
                {
                    PasswordBox tb1 = (PasswordBox)element;
                    tb1.PreviewKeyUp += TextBox_KeyDown;
                }
                else if (element.GetType() == typeof(Button))
                {
                    Button tb1 = (Button)element;
                    tb1.PreviewKeyDown += TextBox_KeyDown;
                }
            }
}

处理程序正在跟踪

private void TextBox_KeyDown(Object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Down || (e.Key == Key.Enter && sender.GetType()!=typeof(Button))  )
            {
                e.Handled = true;
                UIElement focusedElement = Keyboard.FocusedElement as UIElement;
                if (focusedElement != null)
                {
                    focusedElement.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
                }



            }
            else if (e.Key == Key.Up)
            {



                e.Handled = true;
                UIElement focusedElement = Keyboard.FocusedElement as UIElement;
                if (focusedElement != null)
                {
                    focusedElement.MoveFocus(new TraversalRequest(FocusNavigationDirection.Previous));
                }
            }
        }

当我使用导航键时它运行良好,除了一个问题。问题是当按下按钮上的向上或向下导航键时,它会跳过一个文本框,该文本框按 Tab 顺序排列。我不确定上面的代码有什么问题。请建议我应该怎么做才能通过导航键保持标签顺序。

【问题讨论】:

    标签: wpf tabs navigation key


    【解决方案1】:

    之所以这样调用 TabOrder,是因为焦点是在使用 Tab 键而不是箭头键的控件之间切换的。您的问题是由于某些控件可能会抑制箭头键事件,例如您的情况下的 TextBox 。但实际上你可以通过这种方式添加事件处理程序来克服这个问题:

    textBox.AddHandler(TextBox.KeyDownEvent, 
                       new KeyEventHandler(TextBox_KeyDown), 
                       handledEventsToo: true);
    

    TextBox 处理箭头键向下事件,因为它在文本导航中使用这些键。因此,TextBox 处理它们(移动插入符号)并设置 e.Handled = true,这会阻止来自 bubbling up 的事件 - 这就是您没有捕获此事件的原因。

    但正如我所说,使用箭头键导航焦点可能会让用户感到沮丧。您可以使用 Tab 键导航。 WPF 完全支持这种方法,甚至自己设置选项卡索引,以便在用户按下 Tab 键时焦点从窗口的左到右移动,然后从窗口的顶部移动到底部。您可以通过将其 IsTabStop 属性设置为 false 来防止使用 Tab 键集中控制。您还可以通过设置元素的TabIndex 属性来定义您自己的标签顺序。完全不需要任何代码来使这种方法起作用。

    您更喜欢这种方法而不是您实现的方法的另一个原因是您的代码难以维护。查看您的 Window_Loaded 处理程序。如果您将来在此窗口中添加一些控件怎么办?您也不必忘记在那里添加代码。如果您的应用程序中出现新窗口怎么办?您将不得不复制此代码块。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多