Почему этот код в WPF не работает?
private void button1_Click(object sender, EventArgs e) { MessageBox.Show("yes"); } private void Form1_Load(object sender, EventArgs e) { button1.PerformClick(); }
Мне нужно командовать.
Почему этот код в WPF не работает?
private void button1_Click(object sender, EventArgs e) { MessageBox.Show("yes"); } private void Form1_Load(object sender, EventArgs e) { button1.PerformClick(); }
Мне нужно командовать.
Чтобы использовать стиль приложения 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();
Подождите.. есть простой способ. если имя вашей кнопки button1, а кнопка click1 уже подписана, вы просто вызываете это событие, например
button1_Click(this,null);
Вместо 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);
}
Хорошая практика в 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();
}
Выдержка из Адам Натанс 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();
Я думаю, что кратчайшее и наиболее эффективное решение вашей проблемы было бы просто сделано в одной строке.
button1.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
Это должно работать для WPF С#
Так как 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
Чтобы автоматизировать щелчок на кнопке, вы можете взглянуть на инфраструктуру автоматизации пользовательского интерфейса: