C# UserControl 事件冒泡

Event bubbling inside UserControl in C#

我创建了一个自定义 UserControl,它是一个内部带有网格的按钮。

从包含它的页面 MainPage.xaml,我需要将一个 Click 事件绑定到 UserControl,EventHandler 的函数必须写在外部,在MainPage(不在 UserControl 内)。

因此,通读 this question,我创建了一个事件和一个触发该事件的 EventHandler 函数。这些在 UserControl 中。 这是 类

UserControl.xaml.cs

public class MyButton : UserControl
{
   public event RoutedEventHandler ButtonClicked;

       private void ButtonClickedHandler()
       {
        //Null check makes sure the main page is attached to the event
        if (this.ButtonClicked != null)
            this.ButtonClicked(this, new RoutedEventArgs());
        Debug.WriteLine("ButtonClickedHandler");
       }
   }

MainPage.xaml.cs

private void MyButton_Click(object sender, RoutedEventArgs e)
        {
            Debug.WriteLine("MyButton_Click");
        }

        private void MyButton_Loaded(object sender, RoutedEventArgs e)
        {
            (sender as MyButton).ButtonClicked += MyButton_Click;
        }

如您所见,我放置了几个 Debug.WriteLine,但它们没有被触发,我不知道我做错了什么。

仅在您的代码中有一个永远不会被任何东西调用的方法不会使您的程序运行。每次单击按钮时,您首先必须调用 ButtonClickedHandler() 方法。
为此,只需在 xaml 文件中为按钮的点击事件注册一个方法。

<Button Content="This Is Your Button" Click="YourButtonClick"/>

然后调用里面的ButtonClickedHandler()方法:

private void YourButtonClick(object sender, RoutedEventArgs e) {
    ButtonClickedHandler();
}

解决问题的更简单方法是使用事件 属性:

UserControl.xaml.cs

public Event RoutedEventHandler ButtonClicked 
{
    add {
        ButtonName.Click += value; //use the name of your button here
    }
    remove {
        ButtonName.Click -= value;
    }
}

然后您可以在主窗口中简单地注册该事件:

private void MyButton_Loaded(object sender, RoutedEventArgs e)
{
    (sender as MyButton).ButtonClicked += MyButton_Click;
}

顺便说一下,我认为最好在您还创建控件的 xaml 文件中注册事件: