Ответы:
WPF использует немного иной подход, чем WinForms здесь. Вместо того, чтобы автоматизировать объект, встроенный в API, у них есть отдельный класс для каждого объекта, который отвечает за его автоматизацию. В этом случае вам нужно ButtonAutomationPeer
выполнить эту задачу.
ButtonAutomationPeer peer = new ButtonAutomationPeer(someButton);
IInvokeProvider invokeProv = peer.GetPattern(PatternInterface.Invoke) as IInvokeProvider;
invokeProv.Invoke();
Вот пост в блоге на эту тему.
Примечание: IInvokeProvider
интерфейс определен в UIAutomationProvider
сборке.
UIAutomationProvider
. Затем пришлось добавитьusing System.Windows.Automation.Peers; using System.Windows.Automation.Provider;
((IInvokeProvider) (new ButtonAutomationPeer(someButton).GetPattern(PatternInterface.Invoke)).Invoke();
IInvokeProvider
интерфейс определен в UIAutomationProvider
сборке.
Как сказал JaredPar, вы можете обратиться к статье Джоша Смита, посвященной автоматизации. Однако, если вы посмотрите комментарии к его статье, вы найдете более элегантный способ поднять события против элементов управления WPF.
someButton.RaiseEvent(new RoutedEventArgs(ButtonBase.ClickEvent));
Я лично предпочитаю тот, что выше, а не пирам автоматизации.
new RoutedEventArgs(Button.ClickEvent)
у меня не работает. Я должен был использовать new RoutedEventArgs(Primitives.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
Один из способов программно «щелкнуть» по кнопке, если у вас есть доступ к источнику, - просто вызвать обработчик события OnClick кнопки (или выполнить ICommand, связанный с кнопкой, если вы делаете что-то более в духе WPF-y). ).
Почему вы это делаете? Например, вы выполняете какое-то автоматическое тестирование или пытаетесь выполнить то же действие, которое выполняет кнопка из другого раздела кода?
Как сказал Грег Д. , я думаю, что альтернативой 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, который запускает кнопка, и передавать параметр CommandParameter, определенный в XAML .
Проблема с решением Automation API заключается в том, что для него требовалась ссылка на сборку Framework UIAutomationProvider
как зависимость проекта / пакета.
Альтернатива - подражать поведению. Ниже приведено мое расширенное решение, которое также учитывает MVVM-шаблон с его связанными командами, реализованными как метод расширения :
public static class ButtonExtensions
{
/// <summary>
/// Performs a click on the button.<br/>
/// This is the WPF-equivalent of the Windows Forms method "<see cref="M:System.Windows.Forms.Button.PerformClick" />".
/// <para>This simulates the same behaviours as the button was clicked by the user by keyboard or mouse:<br />
/// 1. The raising the ClickEvent.<br />
/// 2.1. Checking that the bound command can be executed, calling <see cref="ICommand.CanExecute" />, if a command is bound.<br />
/// 2.2. If command can be executed, then the <see cref="ICommand.Execute(object)" /> will be called and the optional bound parameter is p
/// </para>
/// </summary>
/// <param name="sourceButton">The source button.</param>
/// <exception cref="ArgumentNullException">sourceButton</exception>
public static void PerformClick(this Button sourceButton)
{
// Check parameters
if (sourceButton == null)
throw new ArgumentNullException(nameof(sourceButton));
// 1.) Raise the Click-event
sourceButton.RaiseEvent(new RoutedEventArgs(System.Windows.Controls.Primitives.ButtonBase.ClickEvent));
// 2.) Execute the command, if bound and can be executed
ICommand boundCommand = sourceButton.Command;
if (boundCommand != null)
{
object parameter = sourceButton.CommandParameter;
if (boundCommand.CanExecute(parameter) == true)
boundCommand.Execute(parameter);
}
}
}