接口事件定义中断UserControl Designer

时间:2014-07-08 20:35:44

标签: c# winforms c#-4.0

我有一个定义事件的界面:

public interface IControl
{
    event EventHandler Load;
}

我正在使用UserControl来实现此接口,因为它已经有了Load事件,我希望它通过IControl接口向其他实体公开。 C#很好用,所有内容都可以构建并运行良好。但是,拥有此表单的Designer遇到错误。

Method not found: 'Void MyControls.IControl.add_Load(System.EventHandler)'.

表单设计师似乎期待Load的两种不同实现,一种用于UserControl,一种用于接口。

我知道一个解决方案是在我的界面上更改事件的签名,然后在UserControl本身添加一个处理界面事件的处理程序。然而,看起来很奇怪,这个问题会出现。如果C#很好用,为什么设计师会惊慌失措呢?

这是Windows窗体的限制,还是有办法解决这个问题?

实施例

这将破坏父Form的设计者,它将显示上面的错误:

public interface IControl
{
    // the interface defines Load
    event EventHandler Load;
}

// the control implements the interface, but UserControl defines Load,
// so I dont have to explicitly put an implementation of Load in MyControl
public class MyControl : UserControl, IControl
{
    public MyControl()
    {
        InitializeComponent();
    }
}

public class MyOtherClass
{
    private bool _controlLoaded;

    public MyOtherClass(IControl control)
    {
        // the Load event is exposed to other entities through the interface
        control.Load += control_Load;
    }

    private void control_Load(object sender, EventArgs e)
    {
        _controlLoaded = true;
    }
}

可以避免此问题的解决方案:

public interface IControl
{
    // change this from Load to Loaded
    event EventHandler Loaded;
}

public class MyControl : UserControl, IControl
{
    public event EventHandler Loaded;

    public MyControl()
    {
        InitializeComponent();

        // add an event handler for Load
        Load += this_Load;
    }

    private void this_Load(object sender, EventArgs e)
    {
        // indirectly fire Loaded
        if (Loaded != null)
        {
            Loaded(sender, e);
        }
    }
}

public class MyOtherClass
{
    private bool _controlLoaded;

    public MyOtherClass(IControl control)
    {
        control.Loaded += control_Loaded;
    }

    private void control_Loaded(object sender, EventArgs e)
    {
        _controlLoaded = true;
    }
}

虽然我知道解决问题的方法,但我很好奇是否有人知道任何其他解决方案,或者是否有人知道此问题的原因或细节。

1 个答案:

答案 0 :(得分:0)

抱歉,我无法在声誉中添加评论:)

我确实完成了你的结构,然后我添加了一个只有用户控件MyControl

的表单

我可以编辑它并做我需要的。

我也以这种方式编辑了表单构造函数

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        new MyOtherClass(myControl1);
    }

}

它按预期工作。

我正在使用VS2010