Как программно нажать кнопку в WPF? - PullRequest
132 голосов
/ 08 апреля 2009

Поскольку в WPF нет метода button.PerformClick(), есть ли способ программно нажать кнопку WPF?

Ответы [ 7 ]

177 голосов
/ 09 апреля 2009

Как сказал JaredPar, вы можете обратиться к статье Джоша Смита, посвященной автоматизации. Однако, если вы посмотрите комментарии к его статье, вы найдете более элегантный способ поднять события против элементов управления WPF

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

Лично я предпочитаю приведенное выше вместо пиров автоматизации.

120 голосов
/ 08 апреля 2009

WPF использует немного иной подход, чем WinForms здесь. Вместо того, чтобы автоматизировать объект, встроенный в API, у них есть отдельный класс для каждого объекта, который отвечает за его автоматизацию. В этом случае вам нужно ButtonAutomationPeer для выполнения этой задачи.

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

Здесь - запись в блоге на эту тему.

Примечание. Интерфейс IInvokeProvider определен в сборке UIAutomationProvider.

28 голосов
/ 16 марта 2011

, если вы хотите вызвать событие клика:

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

19 голосов
/ 14 июня 2012
this.PowerButton.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
5 голосов
/ 08 апреля 2009

Один из способов программно «нажать» кнопку, если у вас есть доступ к источнику, - это просто вызвать обработчик события OnClick кнопки (или выполнить ICommand, связанную с кнопкой, если вы делаете что-то в более WPF). -я манера).

Почему ты это делаешь? Например, вы выполняете какое-то автоматическое тестирование или пытаетесь выполнить то же действие, которое выполняет кнопка из другого раздела кода?

4 голосов
/ 03 сентября 2015

Как сказал Грег Д , я думаю, что альтернативой Automation нажатию кнопки с использованием шаблона MVVM (событие click вызвано и команда выполнена) является вызов метода OnClick с использованием отражения:

typeof(System.Windows.Controls.Primitives.ButtonBase).GetMethod("OnClick", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(button, new object[0]);
0 голосов
/ 14 января 2019

При использовании MVVM Шаблон команды для функции Кнопка (рекомендуемая практика) простой способ вызвать эффект кнопки заключается в следующем:

someButton.Command.Execute(someButton.CommandParameter);

При этом будет использоваться объект Command , который запускается кнопкой и передается CommandParameter , определенный XAML .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...