2009-04-08 22 views

Respuesta

100

WPF tiene un enfoque ligeramente diferente que WinForms aquí. En lugar de tener la automatización de un objeto integrado en la API, tienen una clase separada para cada objeto que es responsable de automatizarlo. En este caso necesita el ButtonAutomationPeer para realizar esta tarea.

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

Here es una publicación de blog sobre el tema.

Nota: La interfaz IInvokeProvider se define en el ensamblaje UIAutomationProvider.

+2

Slick, no estaba al tanto de esto. Podría ser muy útil para las pruebas automatizadas. Tenga en cuenta que hay un comentario en ese enlace que sugiere utilizar una fábrica proporcionada para obtener el par de automatización en lugar de crear uno usted mismo. –

+2

Si se trata de un botón ToggleButton: IsChecekd = false/true; parece ser suficiente –

+1

Cambiaría la segunda línea a 'IInvokeProvider invokeProv = (IInvokeProvider) peer.GetPattern (PatternInterface.Invoke);' ya que sabe que este molde siempre debe ser válido. – MEMark

5

Una forma de hacer clic en el botón mediante programación, si tiene acceso a la fuente, es simplemente llamar al controlador de eventos OnClick del botón (o ejecutar el ICommand asociado con el botón, si está haciendo cosas en más WPF-y forma).

¿Por qué haces esto? ¿Estás haciendo algún tipo de prueba automática, por ejemplo, o tratando de realizar la misma acción que el botón realiza desde una sección diferente del código?

+0

No es el único solución a mi problema, pero cuando traté de hacer esto, encontré que no es tan fácil como el botón. PerformClick(), así que es un poco curioso ... :) – tghoang

+0

Tuve que hacer clic en el menú de otra ventana en el mismo proyecto, y MyOtherWindow.mnuEntry_Click (Me, New Windows.RoutedEventArgs) lo hizo. Realmente simple –

148

Como JaredPar dijo que puede consultar el artículo de Josh Smith sobre Automatización. Sin embargo, si se mira a través de comentarios a su artículo encontrará forma más elegante de eventos de recaudación contra WPF controles

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

personalmente prefiero la de arriba en lugar de pares de automatización.

+17

La solución RaiseEvent solo plantea el evento. No ejecuta el comando asociado con el botón (como dice Skanaar) –

+3

Si usa XAML, por ejemplo,

+4

Estoy usando VB ... no estoy seguro si el código es diferente para VB versos C#, pero 'nuevo RoutedEventArgs (Button.ClickEvent)' no funcionó para mí. Tuve que usar 'new RoutedEventArgs (Primitives.ButtonBase.ClickEvent)'. De lo contrario, funciona muy bien! – BrianVPS

20

si desea llamar haga clic en evento:

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

Y si desea que el botón parece que se presiona:

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

y sin prensar después de eso:

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

o utilice el ToggleButton

+0

Just Perfect :) gracias por su tiempo y esfuerzo –

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

Como Greg D Dicho esto, creo que una alternativa a Automation hacer clic en un botón mediante el patrón MVVM (click en caso levantó y se ejecuta el comando) es llamar a la OnClick método que utiliza la reflexión:

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

Esta es una buena manera de usar un evento de un elemento hijo para activar un comando en un elemento primario. –

Cuestiones relacionadas