因此,我使用的是第三方wpf网格控件,该控件经过硬编码,只能接受某些击键来执行快捷反应,而Shift-Tab是其中之一。但是,我的用户群习惯于按下向上箭头和向下箭头,并告诉他们“不”现在不是一种选择。因此,我认为我唯一的选择是向下拦截预览键并发送不同的按键组合。
现在,当用户按下向下箭头时,我将使用在这里找到的以下代码来发送选项卡:
if (e.Key == Key.Down)
{
e.Handled = true;
KeyEventArgs eInsertBack = new KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource, 0, Key.Tab);
eInsertBack.RoutedEvent = UIElement.KeyDownEvent;
InputManager.Current.ProcessInput(eInsertBack);
}
但是,此方法的局限性在于您似乎无法模拟Shift键的按下? WPF似乎在看Keyboard.Modifiers以能够“读取” Shift或Ctrl,但是似乎没有任何工具可以通过编程方式设置Keyboard.Modifiers。有任何帮助吗?
创建这样的MockKeyboardDevice(对Jared Parsons表示敬意:]
https://github.com/VsVim/VsVim/blob/master/Src/VimTestUtils/Mock/MockKeyboardDevice.cs
用法:
var modKey = ModifierKeys.Shift;
var device = new MockKeyboardDevice(InputManager.Current)
{
ModifierKeysImpl = modKey
};
var keyEventArgs = device.CreateKeyEventArgs(Key.Tab, modKey);
...
一个用法示例:
https://github.com/jaredpar/VsVim/blob/master/Test/VimWpfTest/VimKeyProcessorTest.cs
我模拟使用以下内容您所说的还好,这不是您的意思吗?
public Window1()
{
InitializeComponent();
Loaded += new RoutedEventHandler(Window1_Loaded);
}
void Window1_Loaded(object sender, RoutedEventArgs e)
{
WebBrowser1_PreviewKeyDown(this, new KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource, 1, Key.LeftShift));
WebBrowser1_PreviewKeyDown(this, new KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource, 1, Key.Tab));
}
private void WebBrowser1_PreviewKeyDown(object sender, KeyEventArgs e)
{
System.Diagnostics.Debug.WriteLine(e.Key);
}
输出:
LeftShift
Tab