How to programmatically click a button in WPF?

前端 未结 8 913
情深已故
情深已故 2020-11-28 02:00

Since there\'s no button.PerformClick() method in WPF, is there a way to click a WPF button programmatically?

相关标签:
8条回答
  • 2020-11-28 02:02

    if you want to call click event:

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

    And if you want the button looks like it is pressed:

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

    and unpressed after that:

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

    or use the ToggleButton

    0 讨论(0)
  • 2020-11-28 02:03

    WPF takes a slightly different approach than WinForms here. Instead of having the automation of a object built into the API, they have a separate class for each object that is responsible for automating it. In this case you need the ButtonAutomationPeer to accomplish this task.

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

    Here is a blog post on the subject.

    Note: IInvokeProvider interface is defined in the UIAutomationProvider assembly.

    0 讨论(0)
  • 2020-11-28 02:03

    The problem with the Automation API solution is, that it required a reference to the Framework assembly UIAutomationProvider as project/package dependency.

    An alternative is to emulate the behaviour. In the following there is my extended solution which also condiders the MVVM-pattern with its bound commands - implemented as extension method:

    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);
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-28 02:07
    this.PowerButton.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
    
    0 讨论(0)
  • 2020-11-28 02:10

    As Greg D said, I think that an alternative to Automation to click a button using the MVVM pattern (click event raised and command executed) is to call the OnClick method using reflection:

    typeof(System.Windows.Controls.Primitives.ButtonBase).GetMethod("OnClick", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(button, new object[0]);
    
    0 讨论(0)
  • 2020-11-28 02:11

    When using the MVVM Command pattern for Button function (recommended practice), a simple way to trigger the effect of the Button is as follows:

    someButton.Command.Execute(someButton.CommandParameter);
    

    This will use the Command object which the button triggers and pass the CommandParameter defined by the XAML.

    0 讨论(0)
提交回复
热议问题