Poiché non esiste un metodo button.PerformClick()
in WPF, esiste un modo per fare clic su un pulsante WPF a livello di codice?Come fare clic in modo programmatico su un pulsante in WPF?
risposta
WPF ha un approccio leggermente diverso rispetto a WinForms qui. Invece di avere l'automazione di un oggetto incorporato nell'API, hanno una classe separata per ogni oggetto responsabile dell'automazione. In questo caso è necessario lo ButtonAutomationPeer
per eseguire questa operazione.
ButtonAutomationPeer peer = new ButtonAutomationPeer(someButton);
IInvokeProvider invokeProv = peer.GetPattern(PatternInterface.Invoke) as IInvokeProvider;
invokeProv.Invoke();
Here è un post sul blog sull'argomento.
Nota: l'interfaccia IInvokeProvider
è definita nell'assembly UIAutomationProvider
.
Un modo per fare clic sul pulsante a livello di codice, se si ha accesso alla fonte, è semplicemente chiamare il gestore di eventi OnClick del pulsante (o Eseguire l'ICommand associato al pulsante, se si stanno facendo cose in più Modo WPF-y).
Perché stai facendo questo? Ad esempio, stai eseguendo una sorta di test automatico o stai cercando di eseguire la stessa azione eseguita dal pulsante da una sezione di codice diversa?
Non è l'unico soluzione al mio problema, ma quando ho provato a farlo, ho scoperto che non è facile come button.PerformClick(), quindi solo un po 'curioso ... :) – tghoang
Ho dovuto fare clic sul menu di un'altra finestra nel stesso progetto, e MyOtherWindow.mnuEntry_Click (Me, New Windows.RoutedEventArgs) lo ha fatto. Davvero semplice –
Come JaredPar ha detto che è possibile fare riferimento all'articolo di Josh Smith all'automazione. Tuttavia, se si guarda attraverso i commenti al suo articolo troverete modo più elegante di eventi di raccolta contro controlli WPF
someButton.RaiseEvent(new RoutedEventArgs(ButtonBase.ClickEvent));
Io personalmente preferisco quello sopra invece di coetanei di automazione.
La soluzione RaiseEvent solleva solo l'evento. Non esegue il comando associato al pulsante (come dice Skanaar) –
Se usi XAML ad esempio , l'evento verrà catturato dal gestore on-click come al solito +1 da me! – metao
Sto usando VB ... non sono sicuro se il codice è diverso per VB verses C#, ma 'new RoutedEventArgs (Button.ClickEvent)' non ha funzionato per me. Ho dovuto usare 'new RoutedEventArgs (Primitives.ButtonBase.ClickEvent)'. Altrimenti, funziona alla grande! – BrianVPS
se si desidera chiamare cliccare evento:
SomeButton.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
E se si desidera che il pulsante sembra che si preme:
typeof(Button).GetMethod("set_IsPressed", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(SomeButton, new object[] { true });
e non pressata dopo che:
typeof(Button).GetMethod("set_IsPressed", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(SomeButton, new object[] { false });
oppure utilizzare il ToggleButton
Semplicemente perfetto :) grazie per il vostro tempo e impegno –
this.PowerButton.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
Come Greg D Detto questo, penso che in alternativa al Automation
a fare clic su un pulsante utilizzando il modello MVVM (clicca evento ha raccolto e comando eseguito) è quello di chiamare il OnClick
metodo che utilizza la riflessione:
typeof(System.Windows.Controls.Primitives.ButtonBase).GetMethod("OnClick", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(button, new object[0]);
Questo è un buon modo per utilizzare un evento da un elemento figlio per attivare un comando su un genitore. –
Slick, non ero a conoscenza di questo. Potrebbe essere molto utile per i test automatici. Nota che c'è un commento su quel link che suggerisce di usare un factory fornito per ottenere il peer di automazione invece di crearne uno tu stesso. –
Se questo è un ToggleButton: button.IsChecekd = false/true; sembra essere sufficiente –
Vorrei cambiare la seconda riga a 'IInvokeProvider invokeProv = (IInvokeProvider) peer.GetPattern (PatternInterface.Invoke);' poiché sai che questo cast dovrebbe sempre essere valido. – MEMark