.NET Windows窗体问题的自定义Designer类

时间:2009-05-26 08:27:14

标签: c# .net winforms custom-controls design-time

我实现了一个继承自DocumentDesigner的自定义设计器类。 .NET Framework中的标准Form类使用FormDocumentDesigner类(也继承自DocumentDesigner),但由于此类是内部的,因此无法从中继承并自定义其行为我使用反射器复制了此类中的逻辑并插入它在我的自定义设计器类中(这样我的表单的默认设计时行为符合标准表单)。

一切正常,除了一件事:在我的自定义设计器类的Initialize方法中,我想插入一个ToolStrip控件,这样每次在设计时打开我的表单时,此控件都是可见且可编辑的。问题是每次关闭并重新打开设计器中的表单时都会调用Initialize方法,这会导致每次创建ToolStrip控件的新实例并将其添加到窗体的Controls集合中。我正在寻找一种方法来检查是否已经在代码中序列化了ToolStrip控件,并避免添加另一个。

到目前为止,我发现我可以使用IDesignerHost的LoadComplete事件,并检查Form的Controls集合中是否有ToolStrip。但是,任何更好的想法都会受到赞赏。

感谢您的时间! : - )

1 个答案:

答案 0 :(得分:1)

好吧,LoadComplete事件是正确的点。我通常检查Loading属性以检查加载时是否发生了Initialize,或者在加载后是否调用了它。

IDesignerHost _host;
Form _form;

public override void Initialize(System.ComponentModel.IComponent component)
{
  _form = component as Form;
  _host = (IDesignerHost)this.GetService(typeof(IDesignerHost));
  if (_host != null)
  {      
   if (_host.Loading)
   {
     _host.LoadComplete += new EventHandler(_host_LoadComplete);
   }
   else
   {
     initializeForm();
   }
  }
}

void _host_LoadComplete(object sender, EventArgs e)
{
  _host.LoadComplete -= new EventHandler(_host_LoadComplete);
  initializeForm();
}

void initializeForm()
{
   if (_form!= null)
   {
      ...
   }
}

另一种方法是创建一个Component,您可以将其放入表单并为该组件创建设计器,而不是重新创建FormDesigner。 从组件设计器中,您可以使用 _host.RootComponent 属性获取父窗体。