Как создать объект 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
};