[C#] WPF에서 버튼을 프로그래밍 방식으로 클릭하는 방법은 무엇입니까?

button.PerformClick()WPF 에는 방법 이 없으므로 프로그래밍 방식으로 WPF 버튼을 클릭하는 방법이 있습니까?



답변

WPF는 여기서 WinForms와 약간 다른 접근 방식을 취합니다. API에 내장 된 객체를 자동화하는 대신 자동화를 담당하는 각 객체에 대해 별도의 클래스가 있습니다. ButtonAutomationPeer이 경우이 작업을 수행하기 위해 가 필요합니다 .

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

여기에 주제에 대한 블로그 게시물입니다.

참고 : IInvokeProvider인터페이스는 UIAutomationProvider어셈블리에 정의되어 있습니다.


답변

JaredPar가 말했듯이 자동화에 대한 Josh Smith의 기사를 참조 할 수 있다고 말했습니다. 그러나 그의 기사에 대한 의견을 살펴보면 WPF 컨트롤에 대해 이벤트를 발생시키는 더 우아한 방법을 찾을 수 있습니다

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

나는 개인적으로 자동화 피어 대신 위의 것을 선호합니다.


답변

클릭 이벤트를 호출하려는 경우 :

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

버튼을 누르는 것처럼 보이는 경우 :

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

그리고 그 후에 누르지 않은 :

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

또는 ToggleButton을 사용하십시오


답변

this.PowerButton.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));


답변

소스에 액세스 할 수있는 경우 버튼을 프로그래밍 방식으로 “클릭”하는 한 가지 방법은 버튼의 OnClick 이벤트 핸들러를 호출하거나보다 WPF-y 방식으로 작업을 수행하는 경우 버튼과 관련된 ICommand를 실행하는 것입니다. ).

왜 이런 짓을하는? 예를 들어 일종의 자동 테스트를 수행 중입니까, 아니면 다른 코드 섹션에서 버튼이 수행하는 것과 동일한 작업을 수행하려고합니까?


답변

그렉 D가 말했다, 나는 대안을 생각 Automation부르는하기 위해 MVVM 패턴 (클릭 이벤트가 발생하고 명령이 실행)되어 사용 버튼을 클릭 OnClick반사를 사용하는 방법 :

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


답변

사용하는 경우 MVVM 에 대한 명령 패턴 버튼 기능 (권장 연습), 간단한 방법은 효과 트리거 할 버튼은 다음과 같다 :

someButton.Command.Execute(someButton.CommandParameter);

버튼이 트리거 하는 Command 객체를 사용 하고 XAML에 의해 정의 된 CommandParameter를 전달합니다 .