我创建了一个自定义UserControl
,它是一个内置网格的按钮。
从包含它的页面MainPage.xaml
,我需要将Click
事件绑定到UserControl,并且必须在MainPage中将EventHandler
的函数写在外面(不在UserControl内。)
因此,通过this question阅读,我创建了一个触发事件的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
,但他们没有被触发,我也不知道自己做错了什么。
答案 0 :(得分:1)
只需在代码中使用一个永远不会被任何东西调用的方法,就不会使您的程序正常工作。每次点击按钮时,您首先必须调用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;
}
}
然后您只需在MainWindow中注册该事件:
private void MyButton_Loaded(object sender, RoutedEventArgs e)
{
(sender as MyButton).ButtonClicked += MyButton_Click;
}
顺便说一句,我认为最好在xaml文件中注册事件,你也可以在其中创建控件: