c#中UserControl中的冒泡事件

本文关键字:事件 UserControl | 更新日期: 2023-09-27 18:01:45

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

从包含它的页面,MainPage.xaml,我需要将Click事件绑定到UserControl,并且EventHandler的函数必须在MainPage(而不是在UserControl中)之外编写。

那么,通读这个问题,我已经创建了一个Event和一个触发事件的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,但它们没有被触发,我不知道我做错了什么。

c#中UserControl中的冒泡事件

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

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

然后调用ButtonClickedHandler()方法:

private void YourButtonClick(object sender, RoutedEventArgs e) {
    ButtonClickedHandler();
}
解决这个问题的一个更简单的方法是使用event属性:

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文件中注册事件,您还可以在其中创建控件: