button1.PerformClick () в wpf - PullRequest
       9

button1.PerformClick () в wpf

14 голосов
/ 19 января 2011

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

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

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

Ответы [ 7 ]

24 голосов
/ 16 августа 2011

Чтобы использовать стиль приложения 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();
10 голосов
/ 28 ноября 2012

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

button1_Click(this,null);
5 голосов
/ 18 июля 2013

Вместо 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);         
}
3 голосов
/ 08 августа 2014

Отрывок из Адам Натанс WPF Unleashed , рекомендованный этим блогом .
Имхо одним из лучшихне лучшие ссылки 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();
3 голосов
/ 19 января 2011

Хорошей практикой в ​​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);

Что касается меня, я предпочитаю другой способ, который предполагает перенос команды в модель представления.Библиотека составных приложений (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();
}
2 голосов
/ 03 февраля 2016

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

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

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

1 голос
/ 19 января 2011

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

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

Не для элемента управления WPF Button:

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

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

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

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