Come creare un object KeyEventArgs in WPF (correlato a una risposta SO)

Ho trovato questa risposta che assomiglia a ciò di cui ho bisogno:

Come posso generare a livello di codice eventi di keypress in C #?

Tranne il fatto che non riesco a creare un’istanza di KeyEventArgs (non so come)

Il codice in questione è:

  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 } ); 

Il compilatore dice:

 The best overloaded method match for 'System.Windows.PresentationSource.FromDependencyObject(System.Windows.DependencyObject)' has some invalid arguments 

L’ide dice:

Il tipo di argomento IInputElement non è assegnabile al tipo di parametro DependencyObject

E attraverso StackOverflow ho trovato diverse risposte che indirizzano a quella risposta, ma nessuna di esse si occupa di come creare l’istanza al primo posto.

Come lo posso fare?

phewwww

L’ho trovato: deve essere usato Keyboard.PrimaryDevice.ActiveSource

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

Simile alla risposta di Bill Tarbell, puoi anche creare un file System.Windows.Interop.HwndSource fittizio, in questo modo:

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

Se qualcuno sta provando a creare KeyEventArgs per l’uso in un unit test , scoprirai che Keyboard.PrimaryDevice.ActiveSource è null .. e genera un’eccezione quando provi ad usarlo.

Prendere in giro una PresentationSource è una soluzione praticabile (richiede sta):

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

Per testare un modello di visuale ho dovuto usare una combinazione di OscarRyz ed Elijah W. Gagne per far funzionare questo lavoro.

  [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 era nullo quindi ho dovuto fingere con una finestra fittizia e quindi avevo anche bisogno di assegnare l’object RoutedEvent.

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