在C#中的UserControl内冒泡

时间:2016-08-10 09:36:31

标签: c# xaml user-controls uwp

我创建了一个自定义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,但他们没有被触发,我也不知道自己做错了什么。

1 个答案:

答案 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文件中注册事件,你也可以在其中创建控件: