2012-05-30 16 views
21

Znalazłem ten odpowiedź, która wygląda tak, jak trzeba:Jak utworzyć obiekt KeyEventArgs w WPF (związane z SO odpowiedź)

How can I programmatically generate keypress events in C#?

wyjątkiem faktu, że nie można utworzyć instancja KeyEventArgs (nie wiem jak)

Kod w pytaniu:

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

kompilator mówi:

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

IDE mówi:

Argument typ IInputElement nie jest przypisane do parametru typu DependencyObject

A po drugiej stronie StackOverflow Znalazłem kilka odpowiedzi kierowanie do tej odpowiedzi, ale żaden z nich nie rozwiązuje jak stworzyć wystąpienie na pierwszym miejscu.

Jak mogę to zrobić?

+0

Jeśli ktoś szuka prosty i szybki sposób, aby symulować keyPressed moją odpowiedź na oryginalne pytanie może pomóc: http://stackoverflow.com/a/37029044/2363706 – petric

Odpowiedz

45

phewwww

Znalazłem go: Keyboard.PrimaryDevice.ActiveSource musi być stosowany

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

Dlaczego nie przyjąć twoją własną odpowiedź? To było całkiem przydatne;) –

8

Jeśli ktoś próbuje stworzyć KeyEventArgs do stosowania w teście jednostkowej przekonasz się, że klawiatura. PrimaryDevice.ActiveSource ma wartość NULL .. i zgłasza wyjątek podczas próby jego użycia.

Mocking się PresentationSource jest praktycznym rozwiązaniem (wymaga STA):

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

podobne do odpowiedzi Bill Tarbell użytkownika, można również stworzyć atrapę System.Windows.Interop.HwndSource, tak:

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

Bardzo przydatne! Walczyłem z tym przez chwilę. Dzięki! –

0

Aby jednostki test a viewmodel musiałem użyć kombinacji OskarRyz i Elijah W. Gagne odpowiedzi, aby wykonać tę pracę.

[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 była zerowa, więc musiałem udawać się fikcyjną okna, a następnie Musiałem też RoutedEvent być przypisane.

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