Відповіді:
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
зборі.
Як сказав ДжаредПар, ви можете звернутися до статті Джоша Сміта щодо автоматизації. Однак якщо ви подивитесь на коментарі до його статті, ви знайдете більш елегантний спосіб підняття подій проти контролю 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 .
Проблема з рішенням 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);
}
}
}