web-dev-qa-db-fra.com

Comment cliquer par programme sur un bouton dans WPF?

Puisqu'il n'y a pas de méthode button.PerformClick() dans WPF, existe-t-il un moyen de cliquer sur un bouton WPF par programme?

129
tghoang

WPF adopte une approche légèrement différente de celle de WinForm. Au lieu d'avoir l'automatisation d'un objet intégrée à l'API, ils ont une classe distincte pour chaque objet chargé de l'automatiser. Dans ce cas, vous avez besoin de la variable ButtonAutomationPeer pour accomplir cette tâche.

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

Ici est un article de blog sur le sujet.

Remarque: L’interface IInvokeProvider est définie dans l’assemblage UIAutomationProvider.

117
JaredPar

Comme JaredPar l'a dit, vous pouvez vous référer à l'article de Josh Smith sur l'automatisation. Toutefois, si vous parcourez les commentaires de son article, vous découvrirez un moyen plus élégant de créer des événements contre les contrôles WPF

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

Personnellement, je préfère celui ci-dessus à la place des pairs automatisés.

173
Denis Vuyka

si vous souhaitez appeler l'événement click:

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

Et si vous voulez que le bouton ressemble à celui que vous appuyez:

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

et non exprimé après cela:

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

ou utilisez le ToggleButton 

27
Sonorx
this.PowerButton.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
19
Mahdi

Une manière 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 la commande IC associée au bouton, si vous agissez de la manière plus WPF-y ).

Pourquoi fais-tu ça? Faites-vous une sorte de test automatisé, par exemple, ou essayez-vous d'exécuter la même action que le bouton effectue à partir d'une section de code différente?

5
Greg D

Comme Greg D dit, je pense qu’une alternative à Automation de cliquer sur un bouton en utilisant le modèle MVVM (événement de clic déclenché et commande exécutée) est d’appeler la méthode OnClick en utilisant la réflexion:

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

Lorsque vous utilisez la structure de commande MVVM pour la fonction Bouton (méthode recommandée), voici une méthode simple pour déclencher l'effet de la Bouton:

someButton.Command.Execute(someButton.CommandParameter);

Cela utilisera l'objet Command que le bouton déclenche et transmettra le CommandParameter défini par le XAML.

0
KVKConsultancy