9

我有一个自定义控件,其公共集合标记为DesignerSerializationVisibility.Content.

当我使用设计器将项目添加到集合中时,它将它们添加到设计器文件并分配所有所需的值,但它为集合的每个元素提供了一个通用名称,例如MyClass1,MyClass2等。我想要每个的“名称”属性item 成为项目的代码名称,以便我可以通过代码中的名称访问项目。

这是 ContextMenuStrip 和 ToolStrip 工作方式的功能。在这些情况下,Name 属性显示为(Name)在属性网格中。

有没有我可以用来获得这个功能的属性或东西?还是我必须编写一个完整的自定义设计器对话框?如果是这样,我可以实现这一目标的最简单方法的例子是什么?

4

2 回答 2

6

您可以尝试从 Component 继承来获得该功能。

在此示例中,我创建了一个名为 的类PanelItem,它将是我自己的 Panel 类在我的集合中使用的类。我添加DesignTimeVisible(false)以便它不会填充设计器中的组件托盘。

另外,我添加了一个Name对设计器隐藏但可以在代码中使用的属性。它似乎在我的测试中起作用:

[DesignTimeVisible(false)]
public class PanelItem : Component  {

  [DefaultValue(typeof(string), "")]
  public string PanelText { get; set; }

  private string name = string.Empty;

  [Browsable(false)]
  [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
  public string Name {
    get {
      if (base.Site != null) {
        name = base.Site.Name;
      }
      return name;
    }
    set {
      name = value;
    }
  }
}

然后是我的自定义面板控件:

public class MyPanel : Panel {
  private List<PanelItem> panelItems = new List<PanelItem>();

  [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
  public List<PanelItem> PanelItems {
    get { return panelItems; }
  }
}

结果:

在此处输入图像描述

于 2012-06-20T23:33:40.490 回答
1

我相信您的自定义控件本身将需要 DesignerSerializer,而仅仅用 the 装饰集合DesignerSerializationVisibility.Content是不够的。

我使用 ILSpy 检查:ToolStrip 将其 DesignerSerializer 设置为内部 ToolStripCodeDomSerializer,我认为它负责生成所涉及的所有代码属性。

我认为实现这将是一项专门的工作。这是帮助您入门的 MSDN 文章:http: //msdn.microsoft.com/en-us/library/ms171834.aspx。您正在寻找 CodeDomSerializer 的实现,我相信:http: //msdn.microsoft.com/en-us/library/system.componentmodel.design.serialization.codedomserializer.aspx

于 2012-06-20T23:09:14.780 回答