如何在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 };