Существует 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;
}
Так что я не уверен, в каком метод для использования и хотел бы получить дополнительную ясность по этому вопросу.