在WPF中以程序方式向后制表

本文关键字:方式 程序 WPF | 更新日期: 2023-09-27 18:22:10

我有一个相当简单的WPF应用程序——顶部是一系列文本和组合框(都设置了TabIndex),下面是一个数据网格。用户可以在顶部的所有框中进行制表,然后应用程序向下进入数据网格,在数据网格中制表可以在一行中的单元格中移动。

按键盘上的Shift+Tab键在任何地方都可以正常工作但是我正在尝试添加按钮,允许用户在不使用键盘的情况下来回切换(这将是一个触摸屏应用程序)。

在一个按钮我有。。。

private void ButtonRight_Click(object sender, System.Windows.RoutedEventArgs e)
{
    (Keyboard.FocusedElement as UIElement).MoveFocus( new TraversalRequest(FocusNavigationDirection.Next));
}

哪一个非常适合向前切换,所以你会认为使用FocusNavigationDirection.Previous会起到相反的作用?但它将焦点设置为数据网格中的最后一个单元格,无论按下按钮时焦点是什么!我试过在各种家长和主窗口上调用MoveFocus,但这些都不起作用。

我试过的另一件事是。。。

System.Windows.Forms.SendKeys.SendWait("+{TAB}");

要尝试手动发送Shift+Tab事件。。。它将焦点设置为零!(注意,SendKeys.Send在WPF中不起作用;必须使用SendWait

我也试过。。。

 var shift = new KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource, 0, Key.LeftShift) { RoutedEvent = Keyboard.KeyDownEvent };
 var tab = new KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource, 0, Key.Tab) { RoutedEvent = Keyboard.KeyDownEvent };
 InputManager.Current.ProcessInput(shift);
 InputManager.Current.ProcessInput(tab);

它将焦点设置为应用程序顶部的第一个文本框!

我不知道从这里到哪里去。理想情况下,TraversalRequest(FocusNavigationDirection.Previous)可以正常工作,但事实并非如此。也许这与XAML的布局有关?

在WPF中以程序方式向后制表

原来我在向后切换的按钮上没有将Focusable设置为False(但它是在向前切换的按钮中设置的)。我的错误。