【发布时间】:2014-09-17 16:18:57
【问题描述】:
我有一个相当简单的 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 的布局方式有关?
【问题讨论】:
-
您是否在您正在单击的按钮上将 Focusable 设置为 false,该按钮触发了对 MoveFocus 的调用,以确保它不会获得键盘焦点并且您只是从该按钮导航?
-
刚刚尝试了一个简单的演示,它应该可以正常工作。确保单击的按钮不应该是可聚焦的。
-
是的,被点击的按钮都有
Focusable作为False和IsTabStop作为False编辑:哎呀!向后选项卡的按钮没有设置Focusable!感谢您的帮助。
标签: c# wpf navigation wpfdatagrid keyboard-events