在WPF中,我可以像Javascript / Jquery一样将同一个点击处理程序同时附加到多个按钮吗?

时间:2011-01-24 08:55:22

标签: wpf wpf-controls

我有多个按钮而不是

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中出现类似内容吗?

3 个答案:

答案 0 :(得分:11)

在WPF中,Button.Clickrouted 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)

不是制作button1button2等,而是制作按钮列表。

然后你可以写:

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;
}

我认为这就像你要得到它一样简洁!