button.PerformClick()
Gibt es eine Möglichkeit, programmgesteuert auf eine WPF-Schaltfläche zu klicken, da es in WPF keine Methode gibt?
144
WPF verfolgt hier einen etwas anderen Ansatz als WinForms. Anstatt die Automatisierung eines Objekts in die API zu integrieren, haben sie für jedes Objekt, das für die Automatisierung verantwortlich ist, eine separate Klasse. In diesem Fall benötigen Sie die ButtonAutomationPeer
, um diese Aufgabe auszuführen.
ButtonAutomationPeer peer = new ButtonAutomationPeer(someButton);
IInvokeProvider invokeProv = peer.GetPattern(PatternInterface.Invoke) as IInvokeProvider;
invokeProv.Invoke();
Hier ist ein Blog-Beitrag zu diesem Thema.
Hinweis: Die IInvokeProvider
Schnittstelle ist in der UIAutomationProvider
Assembly definiert .
UIAutomationProvider
. Dann musste hinzufügenusing System.Windows.Automation.Peers; using System.Windows.Automation.Provider;
((IInvokeProvider) (new ButtonAutomationPeer(someButton).GetPattern(PatternInterface.Invoke)).Invoke();
IInvokeProvider
Schnittstelle in derUIAutomationProvider
Baugruppe definiert .Wie JaredPar sagte, können Sie sich auf Josh Smiths Artikel zur Automatisierung beziehen. Wenn Sie jedoch die Kommentare zu seinem Artikel durchsehen, werden Sie eine elegantere Möglichkeit finden, Ereignisse gegen WPF-Steuerelemente auszulösen
Ich persönlich bevorzuge die oben genannte anstelle von Kollegen aus der Automatisierung.
quelle
new RoutedEventArgs(Button.ClickEvent)
habe aber bei mir nicht funktioniert. Ich musste benutzennew RoutedEventArgs(Primitives.ButtonBase.ClickEvent)
. Ansonsten funktioniert super!Wenn Sie das Klickereignis aufrufen möchten:
Und wenn Sie möchten, sieht der Knopf so aus, als wäre er gedrückt:
und danach ungedrückt:
oder verwenden Sie den ToggleButton
quelle
quelle
Eine Möglichkeit, programmgesteuert auf die Schaltfläche zu "klicken", wenn Sie Zugriff auf die Quelle haben, besteht darin, einfach den OnClick-Ereignishandler der Schaltfläche aufzurufen (oder den mit der Schaltfläche verknüpften ICommand auszuführen, wenn Sie die Dinge auf WPF-y-Weise 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?
quelle
Wie Greg D sagte, besteht eine Alternative zum
Automation
Klicken auf eine Schaltfläche mithilfe des MVVM-Musters (Klickereignis ausgelöst und Befehl ausgeführt) darin, dieOnClick
Methode mithilfe von Reflection aufzurufen :quelle
Wenn Sie das MVVM- Befehlsmuster für die Schaltflächenfunktion verwenden (empfohlene Vorgehensweise), können Sie den Effekt der Schaltfläche auf einfache Weise wie folgt auslösen :
Dies verwendet das Command- Objekt, das die Schaltfläche auslöst, und übergibt den von der XAML definierten CommandParameter .
quelle
Das Problem mit der Automation API-Lösung besteht darin, dass ein Verweis auf die Framework-Assembly
UIAutomationProvider
als Projekt- / Paketabhängigkeit erforderlich ist.Eine Alternative besteht darin, das Verhalten zu emulieren. Im Folgenden gibt es meine erweiterte Lösung, die auch das MVVM-Muster mit seinen gebundenen Befehlen bedingt - implementiert als Erweiterungsmethode :
quelle