In WPF can I attach the same click handler to multiple buttons at once like I can in Javascript/Jquery?

后端 未结 3 1392
死守一世寂寞
死守一世寂寞 2020-12-10 18:56

I have multiple buttons instead of doing

this.button1.Click += new System.EventHandler(this.button_Click);
this.button2.Click += new System.EventHandler(this         


        
相关标签:
3条回答
  • 2020-12-10 19:29

    Instead of making button1, button2 etc, make a List of buttons.

    Then you can write:

    myList.ForEach( b => b.Click += button_Click );
    

    From XAML you can attach the click handler to the parent of the buttons something like this (I use a StackPanel as an example):

    <StackPanel Button.Click="button_Click">
      <Button .... >First button</Button>
      <Button .... >Second button</Button>
      <Button .... >Third button</Button>
    </StackPanel>
    

    This works because the buttons Click event is a bubbling routed event.

    0 讨论(0)
  • 2020-12-10 19:39

    In WPF, Button.Click is a routed event, which means that the event is routed up the visual tree until it's handled. That means you can add an event handler in your XAML, like this:

    <StackPanel Button.Click="button_Click">
        <Button>Button 1</Button>
        <Button>Button 2</Button>
        <Button>Button 3</Button>
        <Button>Button 4</Button>
    </StackPanel>
    

    Now all the buttons will share a single handler (button_Click) for their Click event.

    That's an easy way to handle the same event across a group of controls that live in the same parent container. If you want to do the same thing from code, you can use the AddHandler method, like this:

    AddHandler(Button.ClickEvent, new RoutedEventHandler( button_Click));
    

    That'll add a handler for every button click in the window. You might want to give your StackPanel a name (like, "stackPanel1") and do it just for that container:

    stackPanel1.AddHandler(Button.ClickEvent, new RoutedEventHandler( button_Click));
    
    0 讨论(0)
  • 2020-12-10 19:43

    You could use Linq To VisualTree to locate all the buttons in your Window / UserControl, then iterate over this list adding your event handler.

    var buttons = this.Descendants<Button>().Cast<Button>();
    foreach(var button in buttons)
    {
      button.Click += button_Click;
    }
    

    I think that is about as concise as you are going to get it!

    0 讨论(0)
提交回复
热议问题