Button1.PerformClick() в wpf

Почему этот код в WPF не работает?

private void button1_Click(object sender, EventArgs e)
    {
        MessageBox.Show("yes");
    }
    private void Form1_Load(object sender, EventArgs e)
    {
        button1.PerformClick();
    }

Мне нужно командовать.

Ответ 1

Чтобы использовать стиль приложения Windows Form, вам необходимо написать следующий метод расширения:

namespace System.Windows.Controls
{
    public static class MyExt
    {
         public static void PerformClick(this Button btn)
         {
             btn.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
         }
    }
}

теперь вы можете использовать его для любой кнопки, предполагая кнопку "btnOK":

btnOK.PerformClick();

Ответ 2

Подождите.. есть простой способ. если имя вашей кнопки button1, а кнопка click1 уже подписана, вы просто вызываете это событие, например

button1_Click(this,null);

Ответ 3

Вместо PerformClick() используйте RaiseEvent()

private void button1_Click(object sender, EventArgs e)
{
    MessageBox.Show("yes");
}
private void Form1_Load(object sender, EventArgs e)
{
    RoutedEventArgs newEventArgs = new RoutedEventArgs(Button.ClickEvent);
    button1.RaiseEvent(newEventArgs);         
}

Ответ 4

Хорошая практика в WPF - использование команд. Это улучшает тестируемость и отделяет пользовательский интерфейс и бизнес-логику.

Сначала вы можете попробовать RoutedUICommand.

<Window x:Class="Test.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:self ="clr-namespace:Test"
    Title="MainWindow" 
    Height="350" Width="525">
<Window.CommandBindings>
    <CommandBinding Command="{x:Static self:MainWindow.RoutedClickCommand}"
                    CanExecute="CommandBinding_CanExecute"
                    Executed="CommandBinding_Executed"/>
</Window.CommandBindings>
<Grid>
    <Button Content="Test" Name="Btn1" Command="{x:Static self:MainWindow.RoutedClickCommand}"/>
</Grid>

В коде за файлом мы должны определить обработчики RoutedClickCommand и Execute | CanExecute:

    public static ICommand RoutedClickCommand = new RoutedUICommand("ClickCommand", "ClickCommand", typeof(MainWindow));

    private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e)
    {
        e.CanExecute = true;
    }

    private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
    {
        MessageBox.Show("ololo");
    }

Итак, когда вам нужна кнопка-логика ( "button1.PerformClick();" в вашем примере), просто поставьте следующую строку:

MainWindow.RoutedClickCommand.Execute(null);

Что касается меня, я предпочитаю другой способ, который предполагает перенос команды в модель представления. Библиотека Composite Application (Prism) помогает мне с классом DelegateCommand. Тогда определение команды в модели представления выглядит так:

    private DelegateCommand<object> _clickCommand;

    public ICommand ClickCommand
    {
        get
        {
            if (this._clickCommand == null)
            {
                this._clickCommand = new DelegateCommand<object>(p =>
                    {
                        //command logic
                    },
                    p =>
                    { 
                        // can execute command logic
                    });
            }
            return this._clickCommand;
        }
    }

И просмотрите XAML и код позади:

<Window x:Class="Test.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:self ="clr-namespace:Test"
    Title="MainWindow" 
    Height="350" Width="525">
<Grid>
    <Button Content="Test" Name="Btn1" Command="{Binding ClickCommand}"/>
</Grid>

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.Model = new SampleModel();
    }

    protected SampleModel Model
    {
        get
        {
            if (this.Model.ClickCommand.CanExecute())
            {
                this.Model.ClickCommand.Execute();
            }
            return (SampleModel)this.DataContext;   
        }
        set 
        {
            this.DataContext = value;
        }
    }
}

Следующая команда вызова кода в режиме обхода нажатием кнопки:

if (this.Model.ClickCommand.CanExecute())
{
 this.Model.ClickCommand.Execute();
}

Ответ 5

Выдержка из Адам Натанс WPF Unleashed, рекомендованный этим blog.
Imho - одна из лучших, если не лучших ссылок WPF.

var bap = new System.Windows.Automation.Peers.ButtonAutomationPeer(someButton);
var iip = bap.GetPattern(System.Windows.Automation.Peers.PatternInterface.Invoke)  
                            as System.Windows.Automation.Provider.IInvokeProvider;
iip.Invoke();

Ответ 6

Я думаю, что кратчайшее и наиболее эффективное решение вашей проблемы было бы просто сделано в одной строке.

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

Это должно работать для WPF С#

Ответ 7

Так как PerformClick - это метод управления кнопками WindowsForms:

http://msdn.microsoft.com/en-us/library/system.windows.forms.button.performclick.aspx

Не используется элемент управления кнопки WPF:

http://msdn.microsoft.com/en-us/library/system.windows.controls.button_methods.aspx

Чтобы автоматизировать щелчок на кнопке, вы можете взглянуть на инфраструктуру автоматизации пользовательского интерфейса:

http://msdn.microsoft.com/en-us/library/ms747327.aspx