2010-06-13 8 views
8

Ich versuche manuell ein MouseLeftButtonDown-Ereignis in einem WPF-Steuerelement programmgesteuert auszulösen, da ich das Microsoft Surface SDK verwende, das MouseLeftButtonDown-Ereignisse, aber ContactDown-Ereignisse nicht auslöst. Im Grunde versuche ich das MouseLeftButtonDown-Ereignis auf das Steuerelement zu drücken, um das richtige Verhalten auf dem Steuerelement auszulösen, während ein ContactDown-Ereignis behandelt wird.programmgesteuertes MouseLeftButtonDown-Ereignis

Ich vermute, ich muss irgendwie die RaiseEvent-Methode auf das Steuerelement verwenden, um dies mit MouseButtonEventArgs zu tun, aber ich habe einige Probleme beim Ausfindigmachen der Parameter.

Vielen Dank im Voraus für Ihre Hilfe!

Antwort

5

Sie können Maus- und Schlüsselereignisse mit Win32-Interop spoofieren. Untersuchen Sie die SendInput-Funktion unter MSDN/pinvoke.net.

Beachten Sie, dass dies dazu führt, dass das System und andere Anwendungen glauben, dass die Maus tatsächlich geklickt wurde. Wenn Sie nur ein WPF-Ereignis initiieren möchten, versuchen Sie RaiseEvent(new RoutedEventArgs(UIElement.MouseLeftButtonDownEvent)).

+0

Danke für den Tipp. Ich erhalte eine Ausnahme mit der von Ihnen geposteten RaiseEvent-Methode: Objekt vom Typ 'System.Windows.RoutedEventArgs' kann nicht in den Typ 'System.Windows.Input.MouseButtonEventArgs' konvertiert werden. – RajenK

+0

Try 'Raise (neu MouseButtonEventArgs (Mouse.PrimaryDevice, Environment.TickCount, MouseButton.Left));' – devios1

+1

InvalidOperationException mit, dass man auftritt: Alle RoutedEventArgs eine Nicht-Null-RoutedEvent mit zugeordnet sein muss. – RajenK

2

Der Wunsch, ein bestimmtes Ereignis in einem Steuerelement auszulösen, ist häufig ein Indikator für ein Designproblem im Code. Event-Handler sollten Verhalten auslösen, führen Sie es nicht. Ich würde vorschlagen, dass Sie den Code, der die vom Ereignishandler MouseLeftButtonDown ausgelöste Aktion ausführt, in eine separate Methode verschieben. Dann kann die gleiche Methode vom ContactDown Ereignishandler aufgerufen werden.

+0

Ich stimme zu, dass wäre die beste Lösung, aber da ich keinen Zugriff auf den Quellcode dieses bestimmten Steuerelement (nur die Binärdatei) habe, fürchte ich, dass das nicht funktioniert. – RajenK

2
var grid = new Grid();    

int timestamp = new TimeSpan(DateTime.Now.Ticks).Milliseconds; 
const MouseButton mouseButton = MouseButton.Left; 
var mouseDownEvent = 
    new MouseButtonEventArgs(Mouse.PrimaryDevice, timestamp, mouseButton) { 
     RoutedEvent = UIElement.MouseLeftButtonDownEvent, 
     Source = grid, 
    }; 

So feuere ich das Ereignis in meinem Testcode ab.

Verwandte Themen