Ponieważ button.PerformClick()
w WPF nie ma metody, czy istnieje sposób na programowe kliknięcie przycisku WPF?
144
WPF przyjmuje tutaj nieco inne podejście niż WinForms. Zamiast automatyzacji obiektu wbudowanej w API, mają oddzielną klasę dla każdego obiektu, która jest odpowiedzialna za jego automatyzację. W takim przypadku potrzebujesz ButtonAutomationPeer
do wykonania tego zadania.
ButtonAutomationPeer peer = new ButtonAutomationPeer(someButton);
IInvokeProvider invokeProv = peer.GetPattern(PatternInterface.Invoke) as IInvokeProvider;
invokeProv.Invoke();
Tutaj wpis na blogu na ten temat.
Uwaga: IInvokeProvider
interfejs jest zdefiniowany w UIAutomationProvider
zestawie.
UIAutomationProvider
. Potem trzeba było dodaćusing System.Windows.Automation.Peers; using System.Windows.Automation.Provider;
((IInvokeProvider) (new ButtonAutomationPeer(someButton).GetPattern(PatternInterface.Invoke)).Invoke();
IInvokeProvider
interfejs jest zdefiniowany wUIAutomationProvider
zestawie.Jak powiedział JaredPar, możesz odnieść się do artykułu Josha Smitha na temat automatyzacji. Jeśli jednak przejrzysz komentarze do jego artykułu, znajdziesz bardziej elegancki sposób zgłaszania zdarzeń względem kontrolek WPF
Osobiście wolę ten powyżej zamiast rówieśników automatyzacji.
źródło
new RoutedEventArgs(Button.ClickEvent)
nie działa dla mnie. Musiałem użyćnew RoutedEventArgs(Primitives.ButtonBase.ClickEvent)
. W przeciwnym razie działa świetnie!jeśli chcesz wywołać zdarzenie kliknięcia:
A jeśli chcesz, żeby przycisk wyglądał tak, jakby był wciśnięty:
a potem nieprasowane:
lub użyj ToggleButton
źródło
źródło
Jednym ze sposobów programowego „kliknięcia” przycisku, jeśli masz dostęp do źródła, jest po prostu wywołanie procedury obsługi zdarzeń OnClick przycisku (lub wykonanie polecenia ICommand skojarzonego z przyciskiem, jeśli robisz rzeczy w sposób bardziej WPF-y ).
Dlaczego to robisz? Czy na przykład przeprowadzasz jakieś automatyczne testy lub próbujesz wykonać tę samą czynność, którą wykonuje przycisk z innej sekcji kodu?
źródło
Jak powiedział Greg D , myślę, że alternatywą dla
Automation
kliknięcia przycisku za pomocą wzorca MVVM (wywołanie zdarzenia kliknięcia i wykonanie polecenia) jest wywołanieOnClick
metody za pomocą odbicia:źródło
Podczas korzystania ze wzorca polecenia MVVM dla funkcji przycisku (zalecana praktyka), prosty sposób wywołania efektu przycisku jest następujący:
Spowoduje to użycie obiektu Command, który wyzwala przycisk i przekaże CommandParameter zdefiniowany przez XAML .
źródło
Problem z rozwiązaniem Automation API polega na tym, że wymagało ono odwołania do zestawu Framework
UIAutomationProvider
jako zależności projektu / pakietu.Alternatywą jest naśladowanie zachowania. Poniżej znajduje się moje rozszerzone rozwiązanie, które również przewodzi wzorzec MVVM z powiązanymi poleceniami - zaimplementowanymi jako metoda rozszerzająca :
źródło