如何在WPF中创建KeyEventArgs对象(与SO答案相关)
我发现这个答案看起来像我需要的:
如何以编程方式在C#中生成按键事件?
除了事实我无法创建KeyEventArgs
的实例(我不知道如何)
有问题的代码是:
var key = Key.Insert; // Key to send var target = Keyboard.FocusedElement; // Target element var routedEvent = Keyboard.KeyDownEvent; // Event to send target.RaiseEvent( new KeyEventArgs( Keyboard.PrimaryDevice, PresentationSource.FromVisual(target), //<--- HERE, I can't 0, key) { RoutedEvent=routedEvent } );
编译器说:
The best overloaded method match for 'System.Windows.PresentationSource.FromDependencyObject(System.Windows.DependencyObject)' has some invalid arguments
意思是说:
参数类型为DependencyObject
参数类型IInputElement
不可分配
在StackOverflow中,我找到了几个指向答案的答案,但没有一个解决如何在第一时间创建实例。
我怎样才能做到这一点?
phewwww
我发现它:必须使用Keyboard.PrimaryDevice.ActiveSource
InputManager.Current.ProcessInput( new KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource, 0, Key.Tab) { RoutedEvent = Keyboard.KeyDownEvent } );
与Bill Tarbell的答案类似,您也可以创建一个虚拟的System.Windows.Interop.HwndSource ,如下所示:
var kea = new KeyEventArgs( Keyboard.PrimaryDevice, new HwndSource(0, 0, 0, 0, 0, "", IntPtr.Zero), // dummy source 0, key);
如果有人试图创建KeyEventArgs以用于unit testing,您会发现Keyboard.PrimaryDevice.ActiveSource为null ..并在您尝试使用它时抛出exception。
模拟PresentationSource是一个可行的解决方案(需要sta):
[Test] [RequiresSTA] public void test_something() { new KeyEventArgs( Keyboard.PrimaryDevice, new Mock().Object, 0, Key.Back); }
为了对一个视图模型进行unit testing,我不得不使用OscarRyz和Elijah W. Gagne的组合来完成这项工作。
[TestMethod] public void method_event_expected() { this.objectUnderTest.TestMethod( new KeyEventArgs(Keyboard.PrimaryDevice, new HwndSource(0, 0, 0, 0, 0, "", IntPtr.Zero), 0, Key.Oem3) { RoutedEvent = Keyboard.KeyDownEvent }); Assert.IsTrue(...) }
Keyboard.PrimaryDevice.ActiveSource为null所以我不得不用虚拟窗口伪造它然后我还需要分配RoutedEvent。
var kea = new KeyEventArgs( Keyboard.PrimaryDevice, new HwndSource(0, 0, 0, 0, 0, "", IntPtr.Zero), 0, Key.Enter) { RoutedEvent = UIElement.KeyUpEvent };