it-swarm.com.de

Wie programmgesteuert auf eine Schaltfläche in WPF klicken?

Gibt es in WPF keine Möglichkeit, auf eine WPF-Schaltfläche zu klicken, da es keine button.PerformClick()-Methode gibt?

129
tghoang

WPF verfolgt hier einen etwas anderen Ansatz als WinForms. Anstatt die Automatisierung eines Objekts in die API einzubauen, verfügen sie über eine separate Klasse für jedes Objekt, das für die Automatisierung verantwortlich ist. In diesem Fall benötigen Sie die Variable ButtonAutomationPeer, um diese Aufgabe auszuführen.

ButtonAutomationPeer peer = new ButtonAutomationPeer(someButton);
IInvokeProvider invokeProv = peer.GetPattern(PatternInterface.Invoke) as IInvokeProvider;
invokeProv.Invoke();

Hier ist ein Blogbeitrag zum Thema.

Hinweis: Die IInvokeProvider-Schnittstelle ist in der UIAutomationProvider-Assembly definiert.

117
JaredPar

Wie JaredPar sagte, können Sie sich auf Josh Smiths Artikel in Richtung Automation beziehen. Wenn Sie jedoch die Kommentare zu seinem Artikel durchsehen, finden Sie eine elegantere Methode, um Ereignisse gegen WPF-Steuerelemente zu erheben

someButton.RaiseEvent(new RoutedEventArgs(ButtonBase.ClickEvent));

Ich persönlich bevorzuge den oben genannten anstelle von Automatisierungs-Peers.

173
Denis Vuyka

wenn du click event anrufen möchtest:

SomeButton.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));

Und wenn Sie möchten, dass die Schaltfläche so aussieht, als sei sie gedrückt:

typeof(Button).GetMethod("set_IsPressed", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(SomeButton, new object[] { true });

und danach nicht gedrückt:

typeof(Button).GetMethod("set_IsPressed", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(SomeButton, new object[] { false });

oder verwenden Sie den ToggleButton 

27
Sonorx
this.PowerButton.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
19
Mahdi

Wenn Sie Zugriff auf die Quelle haben, können Sie die Schaltfläche programmgesteuert "klicken", indem Sie einfach den OnClick-Ereignishandler der Schaltfläche aufrufen (oder den mit der Schaltfläche verknüpften ICommand ausführen, wenn Sie die Schritte mehr auf WPF-y-Ebene ausführen ).

Warum tust du das? Führen Sie beispielsweise eine Art automatisiertes Testen durch oder versuchen Sie, dieselbe Aktion auszuführen, die die Schaltfläche in einem anderen Codeabschnitt ausführt?

5
Greg D

Wie Greg D sagte, denke ich, dass eine Alternative zu Automation zum Klicken auf eine Schaltfläche mit dem MVVM-Muster (click-Ereignis ausgelöst und Befehl ausgeführt) der Aufruf der OnClick-Methode mit Reflektion ist:

typeof(System.Windows.Controls.Primitives.ButtonBase).GetMethod("OnClick", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(button, new object[0]);
4
Max

Wenn Sie die MVVM - Befehlsmuster für die Funktion Button (empfohlene Übung) verwenden, können Sie den Effekt des Button auf einfache Weise auslösen:

someButton.Command.Execute(someButton.CommandParameter);

Dies wird das Command-Objekt verwenden, das die Schaltfläche auslöst, und das CommandParameter übergeben, das durch XAML definiert wird.

0
KVKConsultancy