Dado que no hay ningún button.PerformClick()
método en WPF, ¿hay alguna forma de hacer clic en un botón de WPF mediante programación?
144
WPF adopta un enfoque ligeramente diferente al de 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 llevar a cabo esta tarea.
ButtonAutomationPeer peer = new ButtonAutomationPeer(someButton);
IInvokeProvider invokeProv = peer.GetPattern(PatternInterface.Invoke) as IInvokeProvider;
invokeProv.Invoke();
aquí hay una publicación de blog sobre el tema.
Nota: la IInvokeProvider
interfaz se define en el UIAutomationProvider
ensamblaje.
UIAutomationProvider
. Luego tuve que agregarusing System.Windows.Automation.Peers; using System.Windows.Automation.Provider;
((IInvokeProvider) (new ButtonAutomationPeer(someButton).GetPattern(PatternInterface.Invoke)).Invoke();
IInvokeProvider
interfaz se define en elUIAutomationProvider
ensamblaje.Como dijo JaredPar, puede consultar el artículo de Josh Smith sobre Automatización. Sin embargo, si mira los comentarios a su artículo, encontrará una forma más elegante de generar eventos contra los controles de WPF
Personalmente prefiero el de arriba en lugar de los de automatización.
fuente
new RoutedEventArgs(Button.ClickEvent)
no funcionó para mí. Tuve que usarnew RoutedEventArgs(Primitives.ButtonBase.ClickEvent)
. De lo contrario, funciona muy bien!si desea llamar, haga clic en evento:
Y si quieres que el botón parezca presionado:
y sin presionar después de eso:
o use el ToggleButton
fuente
fuente
Una forma de "hacer clic" programáticamente en el botó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 las cosas de la manera más WPF-y )
¿Por qué estás haciendo esto? ¿Está haciendo algún tipo de prueba automatizada, por ejemplo, o está tratando de realizar la misma acción que realiza el botón desde una sección de código diferente?
fuente
Como dijo Greg D , creo que una alternativa a
Automation
hacer clic en un botón usando el patrón MVVM (evento de clic generado y comando ejecutado) es llamar alOnClick
método usando la reflexión:fuente
Cuando se usa el patrón de comando MVVM para la función del botón (práctica recomendada), una manera simple de activar el efecto del botón es la siguiente:
Esto usará el objeto Command que dispara el botón y pasará el CommandParameter definido por XAML .
fuente
El problema con la solución de API de automatización es que requiere una referencia al ensamblaje de Framework
UIAutomationProvider
como dependencia de proyecto / paquete.Una alternativa es emular el comportamiento. A continuación está mi solución extendida que también considera el patrón MVVM con sus comandos vinculados, implementado como método de extensión :
fuente