我有多个按钮而不是
this.button1.Click += new System.EventHandler(this.button_Click);
this.button2.Click += new System.EventHandler(this.button_Click);
etc.
this.button10.Click += new System.EventHandler(this.button_Click);
我希望能够在伪代码中执行类似的操作:
this.button*.Click += new System.EventHandler(this.button_Click);
在Javascript中有可能在WPF中出现类似内容吗?
答案 0 :(得分:11)
在WPF中,Button.Click
是routed event,这意味着事件将在可视树中向上路由,直到它被处理完毕。这意味着您可以在XAML中添加事件处理程序,如下所示:
<StackPanel Button.Click="button_Click">
<Button>Button 1</Button>
<Button>Button 2</Button>
<Button>Button 3</Button>
<Button>Button 4</Button>
</StackPanel>
现在所有按钮都会为他们的Click事件共享一个处理程序(button_Click)。
这是一种在同一父容器中处理同一事件的简单方法。如果你想从代码中做同样的事情,你可以使用AddHandler方法,如下所示:
AddHandler(Button.ClickEvent, new RoutedEventHandler( button_Click));
这将为窗口中的每个按钮点击添加一个处理程序。您可能希望为StackPanel指定一个名称(例如“stackPanel1”)并仅为该容器执行此操作:
stackPanel1.AddHandler(Button.ClickEvent, new RoutedEventHandler( button_Click));
答案 1 :(得分:3)
不是制作button1
,button2
等,而是制作按钮列表。
然后你可以写:
myList.ForEach( b => b.Click += button_Click );
从XAML你可以将点击处理程序附加到这样的按钮的父级(我使用StackPanel作为示例):
<StackPanel Button.Click="button_Click">
<Button .... >First button</Button>
<Button .... >Second button</Button>
<Button .... >Third button</Button>
</StackPanel>
这是有效的,因为按钮Click事件是冒泡路由事件。
答案 2 :(得分:1)
您可以使用Linq To VisualTree找到Window / UserControl中的所有按钮,然后迭代此列表添加您的事件处理程序。
var buttons = this.Descendants<Button>().Cast<Button>();
foreach(var button in buttons)
{
button.Click += button_Click;
}
我认为这就像你要得到它一样简洁!