如何在WPF中创建KeyEventArgs对象(与SO答案相关)

Osc*_*Ryz 28 c# wpf

我发现这个答案看起来像我需要的:

如何以编程方式在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 }
  );
Run Code Online (Sandbox Code Playgroud)

编译器说:

The best overloaded method match for
'System.Windows.PresentationSource.FromDependencyObject(System.Windows.DependencyObject)'
 has some invalid arguments
Run Code Online (Sandbox Code Playgroud)

ide说:

参数类型IInputElement不能分配参数类型DependencyObject

在StackOverflow中,我找到了几个指向答案的答案,但没有一个解决如何在第一时间创建实例.

我怎样才能做到这一点?

Osc*_*Ryz 53

phewwww

我发现它:Keyboard.PrimaryDevice.ActiveSource必须使用

InputManager.Current.ProcessInput(
    new KeyEventArgs(Keyboard.PrimaryDevice,
        Keyboard.PrimaryDevice.ActiveSource,
        0, Key.Tab)
    {
       RoutedEvent = Keyboard.KeyDownEvent
    }
);
Run Code Online (Sandbox Code Playgroud)

  • 你为什么不接受自己的答案?这非常有用;) (6认同)
  • 该解决方案不适用于单元测试项目。`Keyboard.PrimaryDevice.ActiveSource` 为 null 会导致异常。 (4认同)

Eli*_*gne 14

与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);
Run Code Online (Sandbox Code Playgroud)


Bil*_*ell 11

如果有人试图创建KeyEventArgs用于单元测试,你会发现Keyboard.PrimaryDevice.ActiveSource为null ..并在你尝试使用它时抛出异常.

模拟PresentationSource是一个可行的解决方案(需要sta):

[Test]
[RequiresSTA]
public void test_something()
{
  new KeyEventArgs(
    Keyboard.PrimaryDevice,
    new Mock<PresentationSource>().Object,
    0,
    Key.Back);
}
Run Code Online (Sandbox Code Playgroud)