2009-04-08 13 views

risposta

100

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.

+2

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. –

+2

Se questo è un ToggleButton: button.IsChecekd = false/true; sembra essere sufficiente –

+1

Vorrei cambiare la seconda riga a 'IInvokeProvider invokeProv = (IInvokeProvider) peer.GetPattern (PatternInterface.Invoke);' poiché sai che questo cast dovrebbe sempre essere valido. – MEMark

5

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?

+0

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

+0

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 –

148

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.

+17

La soluzione RaiseEvent solleva solo l'evento. Non esegue il comando associato al pulsante (come dice Skanaar) –

+3

Se usi XAML ad esempio

+4

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

20

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

+0

Semplicemente perfetto :) grazie per il vostro tempo e impegno –

17
this.PowerButton.RaiseEvent(new RoutedEventArgs(Button.ClickEvent)); 
3

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]); 
+0

Questo è un buon modo per utilizzare un evento da un elemento figlio per attivare un comando su un genitore. –

Problemi correlati