自动生成设计器集合项的代码隐藏名称

Tre*_*ott 9 c# designer winforms

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

当我添加使用设计项目的集合,它把它们添加到设计文件和分配所有所需的值,但它给人的集合中的每个元素的总称,如MyClass1,MyClass2等我想每个"名称"属性item成为项目的代码名称,以便我可以在代码中按名称访问该项目.

这是ContextMenuStrip和ToolStrip如何工作的功能.在这些情况下,Name属性显示(Name)在属性网格中.

是否有可用于获取此功能的属性或内容?或者我是否必须编写一个完整的自定义设计器对话框?如果是这样,那么我可以用最简单的方法实现这个目标的例子是什么?

Lar*_*ech 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;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

  [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
  public List<PanelItem> PanelItems {
    get { return panelItems; }
  }
}
Run Code Online (Sandbox Code Playgroud)

导致:

在此输入图像描述