为什么WPF中的代码不起作用?
private void button1_Click(object sender, EventArgs e) { MessageBox.Show("yes"); } private void Form1_Load(object sender, EventArgs e) { button1.PerformClick(); }
我需要命令。
答案 0 :(得分:24)
要使用Windows窗体应用程序的样式,您需要编写以下扩展方法:
namespace System.Windows.Controls
{
public static class MyExt
{
public static void PerformClick(this Button btn)
{
btn.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
}
}
}
现在你可以将它用于任何按钮,假设一个名为“btnOK”的按钮:
btnOK.PerformClick();
答案 1 :(得分:9)
button1_Click(this,null);
答案 2 :(得分:5)
取代 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 :(得分:3)
WPF中的好习惯是使用命令。它提高了可测试性并分离了UI和业务逻辑。
首先,您可以尝试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();
}
答案 4 :(得分:3)
此Adam Nathans推荐的 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();
答案 5 :(得分:2)
我认为解决问题的最短,最有效的解决方案只需一行即可完成。
button1.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
这应该适用于WPF C#
答案 6 :(得分:1)
因为PerformClick是WindowsForms Button控件的一个方法:
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
要自动执行按钮单击,您可能需要查看UI自动化框架: