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?
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
.
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.
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
this.PowerButton.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
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?
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]);
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.