Puisqu'il n'y a pas de button.PerformClick()
méthode dans WPF, existe-t-il un moyen de cliquer sur un bouton WPF par programme?
144
WPF adopte ici une approche légèrement différente de celle de WinForms. Au lieu d'avoir l'automatisation d'un objet intégrée à l'API, ils ont une classe distincte pour chaque objet qui est responsable de l'automatiser. Dans ce cas, vous avez besoin du ButtonAutomationPeer
pour accomplir cette tâche.
ButtonAutomationPeer peer = new ButtonAutomationPeer(someButton);
IInvokeProvider invokeProv = peer.GetPattern(PatternInterface.Invoke) as IInvokeProvider;
invokeProv.Invoke();
Voici un article de blog sur le sujet.
Remarque: l' IInvokeProvider
interface est définie dans l' UIAutomationProvider
assemblage.
UIAutomationProvider
. Puis a dû ajouterusing System.Windows.Automation.Peers; using System.Windows.Automation.Provider;
((IInvokeProvider) (new ButtonAutomationPeer(someButton).GetPattern(PatternInterface.Invoke)).Invoke();
IInvokeProvider
interface est définie dans l'UIAutomationProvider
assemblage.Comme JaredPar l'a dit, vous pouvez vous référer à l'article de Josh Smith sur l'automatisation. Cependant, si vous regardez à travers les commentaires de son article, vous trouverez un moyen plus élégant de déclencher des événements contre les contrôles WPF
Personnellement, je préfère celui ci-dessus aux pairs d'automatisation.
la source
new RoutedEventArgs(Button.ClickEvent)
n'a pas fonctionné pour moi. J'ai dû utilisernew RoutedEventArgs(Primitives.ButtonBase.ClickEvent)
. Sinon, ça marche très bien!si vous souhaitez appeler l'événement de clic:
Et si vous voulez que le bouton ait l'air d'avoir été enfoncé:
et non pressé après cela:
ou utilisez le bouton ToggleButton
la source
la source
Une façon de "cliquer" par programme sur le bouton, si vous avez accès à la source, consiste simplement à appeler le gestionnaire d'événements OnClick du bouton (ou à exécuter l'ICommand associée au bouton, si vous faites les choses de la manière plus WPF-y ).
Pourquoi fais-tu ça? Faites-vous une sorte de test automatisé, par exemple, ou essayez-vous d'effectuer la même action que le bouton effectue à partir d'une section de code différente?
la source
Comme l'a dit Greg D , je pense qu'une alternative au fait
Automation
de cliquer sur un bouton à l'aide du modèle MVVM (événement de clic déclenché et commande exécutée) est d'appeler laOnClick
méthode en utilisant la réflexion:la source
Lors de l'utilisation du modèle de commande MVVM pour la fonction Button (pratique recommandée), un moyen simple de déclencher l'effet du Button est le suivant:
Cela utilisera l' objet Command que le bouton déclenche et transmettra le CommandParameter défini par le XAML .
la source
Le problème avec la solution d'API Automation est qu'elle nécessitait une référence à l'assembly Framework en
UIAutomationProvider
tant que dépendance projet / package.Une alternative consiste à émuler le comportement. Dans ce qui suit, il y a ma solution étendue qui conditionne également le modèle MVVM avec ses commandes liées - implémentées comme méthode d'extension :
la source