Когда использовать разные реализации обработчиков событий в WPF - PullRequest
0 голосов
/ 03 апреля 2020

Существует Parent Window и Child UserControl (предположим, всплывающее окно), который имеет несколько кнопок. Эти кнопки используют одинаковые события MouseEnter и MouseLeave.

Я хочу реализовать эти события мыши в MainWindow (родитель). После некоторых исследований я нашел несколько способов достижения этого.

В дочернем UserControl Control1.xaml (То же в каждом методе)

  <Button 
     x:Name = "TestButton1"
     MouseEnter = "TestButton_MouseEnter"
  \>

  <Button 
     x:Name = "TestButton2"
     MouseEnter = "TestButton_MouseEnter"
  \>

В MainWindow.xaml (То же в каждом методе)

  <UserControl: Control1
     x:Name = "control1Popup"
  />

Метод 1:

В дочернем UserControl Control1.xaml.cs

Button focusedButton;
public static readonly RoutedEvent TestMouseEnterEvent
     = EventManager.RegisterRoutedEvent("TestMouseEnter", RoutingStrategy.Bubble, typeof(MouseEventHandler), typeof(Button));

// expose Button mouse enter event
public event MouseEventHandler TestMouseEnter
{
    add { AddHandler(TestMouseEnterEvent, value); }
    remove { RemoveHandler(TestMouseEnterEvent, value); }
}

private void TestButton_MouseEnter(object sender, MouseEventArgs e)
{
    focusedButton = sender as Button;
    MouseEventArgs mouseEvent = new MouseEventArgs(Mouse.PrimaryDevice, 0) { RoutedEvent = TestMouseEnterEvent};
    RaiseEvent(mouseEvent);
}

В MainWindow.xaml.cs

  //Constructor
  public MainWindow () {
    InitializeComponent();

    this.control1Popup.TestMouseEnter += (sender, e) => 
    {
       this.TestButton_MouseEnter (this.controlPopup.focusedButton, e);
    };
  }

  private void TestButton_MouseEnter(object sender, MouseEventArgs e)
  {
    // Do action
  }

Метод 2:

В дочернем UserControl Control1.xaml.cs

  Button focusedButton;
  public event MouseEventHandler TestMouseEnter

  private void TestButton_MouseEnter(object sender, MouseEventArgs e)
  {
    focusedButton = sender as Button;
    if (TestMouseEnter != null) 
    {
       TestMouseEnter (focusedButton, new MouseEventArgs(Mouse.PrimaryDevice, 0));
    }
  }

В MainWindow.xaml.cs

  //Constructor
  public MainWindow () {
    InitializeComponent();

    this.control1Popup.TestMouseEnter += this.TestButton_MouseEnter;
  }

  private void TestButton_MouseEnter(object sender, MouseEventArgs e)
  {
    // Do action
  }

Метод 3

Без использования этих обработчиков событий я мог бы сделать следующее:

В MainWindow.xaml.cs

  //Constructor
  public MainWindow () {
    InitializeComponent();

    this.control1Popup.TestButton1.MouseEnter += this.TestButton_MouseEnter;
    this.control1Popup.TestButton2.MouseEnter += this.TestButton_MouseEnter;
  }

Так что я не уверен, в каком метод для использования и хотел бы получить дополнительную ясность по этому вопросу.

...