2010-06-13 2 views
8

J'essaie de déclencher manuellement un événement MouseLeftButtonDown sur un contrôle WPF, car j'utilise le SDK Microsoft Surface, qui ne déclenche pas les événements MouseLeftButtonDown, mais les événements ContactDown. Fondamentalement, j'essaie de pousser l'événement MouseLeftButtonDown vers le contrôle, pour déclencher le comportement correct sur le contrôle, tout en gérant un événement ContactDown.Lancement de l'événement MouseLeftButtonDown par programmation

Je suppose que je dois utiliser la méthode RaiseEvent sur le contrôle pour faire cela avec MouseButtonEventArgs, mais j'ai des problèmes pour trouver les paramètres.

Merci d'avance pour votre aide!

Répondre

5

Vous pouvez usurper des événements de souris et de clé à l'aide de Win32 interop. Recherchez la fonction SendInput au MSDN/pinvoke.net. Notez que cela entraînera le système et les autres applications à penser que la souris a été effectivement cliquée. Si vous voulez simplement lancer un événement WPF, essayez RaiseEvent(new RoutedEventArgs(UIElement.MouseLeftButtonDownEvent)).

+0

Merci pour le conseil. J'obtiens une exception avec cette méthode RaiseEvent que vous avez affichée: L'objet de type "System.Windows.RoutedEventArgs" ne peut pas être converti en type "System.Windows.Input.MouseButtonEventArgs". – RajenK

+0

Essayez 'RaiseEvent (new MouseButtonEventArgs (Mouse.PrimaryDevice, Environment.TickCount, MouseButton.Left));' – devios1

+1

InvalidOperationException se produit avec celui-ci: Chaque RoutedEventArgs doit être associé à un événement RoutedEvent non nul. – RajenK

2

Le souhait de déclencher un certain événement dans un contrôle est souvent un indicateur d'un problème de conception dans le code. Les gestionnaires d'événements doivent déclencher le comportement, ne pas l'exécuter. Je suggère que vous déplaciez le code qui effectue l'action déclenchée par le gestionnaire d'événements MouseLeftButtonDown dans une méthode distincte. La même méthode peut ensuite être appelée à partir du gestionnaire d'événements ContactDown.

+0

Je suis d'accord que ce serait la meilleure solution, mais comme je n'ai pas accès au code source de ce contrôle particulier (uniquement le binaire), je crains que cela ne fonctionne pas. – 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, 
    }; 

C'est ainsi que je déclenche l'événement dans mon code de test.

Questions connexes