WPF,C#:如何处理从动态创建的用户控件引发的事件

时间:2016-01-26 14:20:52

标签: c# wpf dynamic user-controls event-handling

基本上我的程序有两个主要组成部分 1)我的主窗口包含我动态创建的用户控件 2)两种不同类型的用户控件。(ctr1和ctr2)
我希望能够按下ctr1上的按钮,让它冒泡一个事件并让主窗口处理事件,这将创建另一个ctr2实例。我遇到的问题是,老实说,我找不到任何可以提供实际代码示例的好资源。

在ctr1中我有:

    public event RoutedEventHandler MyEvent
    {
        add { AddHandler(MyEvent_randomName, value); }
        remove { RemoveHandler(MyEvent_randomName, value); }
    }

    void RaiseMyEvent()
    {
        RoutedEventArgs newEventArgs = new RoutedEventArgs(ctr1.MyEvent_randomName);
        RaiseEvent(newEventArgs);
    }
    protected override void RaiseEvent_click()
    {
        RaiseMyEvent();
    }  

对于我的mainWindow我有:

 public MainWindow()
    {
        InitializeComponent();
        MainWindow.AddHandler(ctr1.MyEvent_randomName, new RoutedEventHandler(MyButtonHandler));

    }
    void MyButtonHandler(object sender, RoutedEventArgs e)
    {
        MessageBox.Show("My New Clicked Event");
    }

我遇到麻烦的地方是“MainWindow.AddHandler(ctr1.MyEvent_random ......);” 我一直收到错误:
非静态字段,方法或属性'System.Windows.UIElement.AddHandler(System.Windows.RoutedEvent,System.Delegate)'

需要对象引用

对不起,如果这是一个非常初学的问题,但我几天前才开始使用WPF和C#,我还没有找到一个很好的在线教程,可以清楚地解释一切。

2 个答案:

答案 0 :(得分:2)

检查错误:

  

非静态字段,方法或者需要对象引用   属性   “System.Windows.UIElement.AddHandler(System.Windows.RoutedEvent,   System.Delegate)'

您正试图静态访问该方法:

  

MainWindow.AddHandler。 。

当你应该做的时候:

AddHandler . . .

顺便说一句,你可能想看看ICommand和MVVM做你想做的事情,但作为一个初学者,你现在有很多需要学习的东西;)

答案 1 :(得分:0)

你可以试试这个:

在ctr1中

public event EventHandler Ctrl1ClickEvent;

按ctrl1中的按钮

Ctrl1ClickEvent(this, EventArgs.Empty);

在mainWindow

public MainWindow()
{
    InitializeComponent();
    this.ctrl1.Ctrl1ClickEvent  += ctrl1ClickHandler;

}

private void ctrl1ClickHandler(object sender, EventArgs e)
{
     MessageBox.Show("My New Clicked Event");
}