Как создать объект KeyEventArgs в WPF (связанный с ответом SO)

Я нашел этот ответ, который выглядит так, как мне нужно:

Как я могу программно генерировать события нажатия клавиш на С#?

За исключением факта, я не могу создать экземпляр 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

Идея говорит:

Тип аргумента IInputElement не присваивается типу параметра DependencyObject

И через StackOverflow я нашел несколько ответов, направляющих на этот ответ, но ни один из них не описывает, как создать экземпляр на первом месте.

Как я могу это сделать?

Ответ 1

phewwww

Я нашел: Keyboard.PrimaryDevice.ActiveSource должен использоваться

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

Ответ 2

Если кто-то пытается создать KeyEventArgs для использования в unit test, вы обнаружите, что Keyboard.PrimaryDevice.ActiveSource имеет значение null.. и выдает исключение, когда вы пытаетесь его использовать.

Отказывание PresentationSource является работоспособным решением (требуется sta):

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

Ответ 3

Как и Билл Тарбелл, вы также можете создать манекен System.Windows.Interop.HwndSource, например:

var kea = new KeyEventArgs(
    Keyboard.PrimaryDevice, 
    new HwndSource(0, 0, 0, 0, 0, "", IntPtr.Zero), // dummy source
    0, 
    key);

Ответ 4

В unit test модель просмотра мне пришлось использовать комбинацию 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.

Ответ 5

var kea = new KeyEventArgs(
    Keyboard.PrimaryDevice,
    new HwndSource(0, 0, 0, 0, 0, "", IntPtr.Zero),
    0,
    Key.Enter)
    {
        RoutedEvent = UIElement.KeyUpEvent
    };