首页 > 解决方案 > C#将EventHandler放在get语句中

问题描述

我试图在用户控件中放入一个事件处理程序,其中控件中控件的事件处理程序链接到此事件处理程序,如下所示:

    public EventHandler PicDoubleClick
    {
        get
        {
            return pictureBox1.DoubleClick;
        }
        set
        {
            pictureBox1.DoubleClick += value;
            label1.DoubleClick += value;
            label2.DoubleClick += value;
        }
    }

但我在第 5 行收到以下编译错误:

1>C:\Users\jorda\source\repos\Encyclo1\Encyclo1\Pic.cs(20,36,20,47): error CS0079: The event 'Control.DoubleClick' can only appear on the left hand side of += or -=

我希望该属性返回一个事件处理程序。有点像一个没有自己价值的财产,而是别人的财产。

我已经让 set 语句正常工作,尽管它工作异常。但是有没有办法返回事件处理程序?有没有更合适的方法来做到这一点?

标签: c#winformsevents

解决方案


事件应该有add/remove访问者:

public event EventHandler PicDoubleClick
{
    add
    {
        pictureBox1.DoubleClick += value;
        label1.DoubleClick += value;
        label2.DoubleClick += value;
    }
    remove
    {
        pictureBox1.DoubleClick -= value;
        label1.DoubleClick -= value;
        label2.DoubleClick -= value;
    }
}

但是,拦截事件可能是一个更好的主意,因为否则发送者将不是调用者所期望的;IE

void SomeInitMethod() {
   pictureBox1.DoubleClick += (s,a) => OnSomeEvent();
   label1.DoubleClick += (s,a) => OnSomeEvent();
   label2.DoubleClick += (s,a) => OnSomeEvent();
}
public event EventHandler SomeEvent;
protected virtual void OnSomeEvent() {
    SomeEvent?.Invoke(this, EventArgs.Empty);
}

推荐阅读