Вопрос по wpf, c# – Как создать объект KeyEventArgs в WPF (связан с ответом 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
Иде говорит:
Тип аргументаIInputElement
не присваивается типу параметраDependencyObject
И в StackOverflow я нашел несколько ответов, направленных на этот ответ, но ни один из них не рассматривал, как создать экземпляр в первую очередь.
Как я могу это сделать?
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);
}
unit test модель представления Мне нужно было использовать омбинацию ответа Осара Риза и Элайджи В. Ганьи, чтобы сделать эту работу.
[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 был нулевым, поэтому мне пришлось подделать его с помощью фитивного она, а затем мне таже нужно было назначить RoutedEvent.
System.Windows.Interop.HwndSource, вот так:
var kea = new KeyEventArgs(
Keyboard.PrimaryDevice,
new HwndSource(0, 0, 0, 0, 0, "", IntPtr.Zero), // dummy source
0,
key);