Como não há button.PerformClick()
método no WPF, existe uma maneira de clicar em um botão WPF programaticamente?
144
O WPF adota uma abordagem ligeiramente diferente da do WinForms aqui. Em vez de ter a automação de um objeto incorporada à API, eles têm uma classe separada para cada objeto responsável por automatizá-lo. Nesse caso, você precisa ButtonAutomationPeer
realizar esta tarefa.
ButtonAutomationPeer peer = new ButtonAutomationPeer(someButton);
IInvokeProvider invokeProv = peer.GetPattern(PatternInterface.Invoke) as IInvokeProvider;
invokeProv.Invoke();
Aqui está um post sobre o assunto.
Nota: a IInvokeProvider
interface é definida na UIAutomationProvider
montagem.
UIAutomationProvider
. Em seguida, tive que adicionarusing System.Windows.Automation.Peers; using System.Windows.Automation.Provider;
((IInvokeProvider) (new ButtonAutomationPeer(someButton).GetPattern(PatternInterface.Invoke)).Invoke();
IInvokeProvider
interface é definida naUIAutomationProvider
montagem.Como JaredPar disse, você pode consultar o artigo de Josh Smith sobre automação. No entanto, se você examinar os comentários de seu artigo, encontrará uma maneira mais elegante de gerar eventos contra os controles do WPF
Pessoalmente, prefiro o acima, em vez de pares de automação.
fonte
new RoutedEventArgs(Button.ClickEvent)
não funcionou para mim. Eu tive que usarnew RoutedEventArgs(Primitives.ButtonBase.ClickEvent)
. Caso contrário, funciona muito bem!se você quiser chamar o evento click:
E se você quiser que o botão pareça estar pressionado:
e não comprimido depois disso:
ou use o ToggleButton
fonte
fonte
Uma maneira de "clicar" programaticamente no botão, se você tiver acesso à fonte, é simplesmente chamar o manipulador de eventos OnClick do botão (ou Executar o ICommand associado ao botão, se você estiver fazendo as coisas da maneira mais WPF-y )
Por que você está fazendo isso? Você está realizando algum tipo de teste automatizado, por exemplo, ou tentando executar a mesma ação que o botão executa em uma seção diferente do código?
fonte
Como Greg D disse, acho que uma alternativa para
Automation
clicar em um botão usando o padrão MVVM (evento de clique gerado e comando executado) é chamar oOnClick
método usando reflexão:fonte
Ao usar o padrão MVVM Command para a função Button (prática recomendada), uma maneira simples de acionar o efeito do Button é a seguinte:
Isso usará o objeto Command que o botão dispara e passa o CommandParameter definido pelo XAML .
fonte
O problema com a solução da API de automação é que ela requer uma referência ao assembly do Framework
UIAutomationProvider
como dependência de projeto / pacote.Uma alternativa é emular o comportamento. A seguir, há minha solução estendida que também condena o padrão MVVM com seus comandos vinculados - implementados como método de extensão :
fonte