设计器和继承的ContextMenuStrip

时间:2013-04-11 06:36:20

标签: winforms designer contextmenustrip

我遇到了问题,设计师没有将继承的ContextMenuStrip添加到components。以下是重现问题的方法:

  1. 创建新项目(Windows窗体应用程序)。
  2. 通过设计师添加到表单ContextMenuStrip,它将生成:

    private void InitializeComponent()
    {
        this.components = new System.ComponentModel.Container();
        this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
        ...
    }
    
  3. 创建MyContextMenuStrip类:

    public class MyContextMenuStrip : ContextMenuStrip
    {
    }
    
  4. 通过设计师编译并添加到表单MyContextMenuStrip,它将生成:

    private void InitializeComponent()
    {
        this.components = new System.ComponentModel.Container();
        this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
        this.myContextMenuStrip1 = new WindowsFormsApplication1.MyContextMenuStrip();
        ...
    }
    
  5. WTF?为什么不将MyContextMenuStrip添加到组件???

    我需要在components中为我的本地化经理提供菜单(自动翻译菜单)。我忘了一些属性,界面或覆盖??

1 个答案:

答案 0 :(得分:1)

Visual Studio未使用MyContextMenuStrip初始化您的Container,因为您的控件没有接受Container作为参数的构造函数。

MyContextMenuStrip中创建一个带System.ComponentModel.IContainer的构造函数,然后使用base关键字将此参数传递给控件的基类:

class MyContextMenuStrip : ContextMenuStrip
{
    public MyContextMenuStrip(System.ComponentModel.IContainer c) : base(c) { }
}

执行此操作后,您会发现当您使用设计器将MyContextMenuStrip添加到表单时,VS会在您的表单的InitializeComponent方法中生成所需的代码:

this.myContextMenuStrip1 = new WindowsFormsApplication1.MyContextMenuStrip(this.components);