9

としてマークされたパブリック コレクションを持つカスタム コントロールがありDesignerSerializationVisibility.Contentます。

デザイナーを使用してアイテムをコレクションに追加すると、アイテムがデザイナー ファイルに追加され、すべての必要な値が割り当てられますが、コレクションの各要素に、、などの一般的な名前が付けられますMyClass1MyClass2それぞれの「名前」プロパティが必要ですitem をアイテムのコード名にして、コード内の名前でアイテムにアクセスできるようにします。

これは、ContextMenuStrip と ToolStrip の機能です。そのような場合、Name プロパティは(Name)プロパティ グリッドのように表示されます。

この機能を得るために使用できる属性または何かがありますか? または、カスタム デザイナー ダイアログ全体を作成する必要がありますか? もしそうなら、これを達成するための最も簡単な方法の例は何ですか?

4

2 に答える 2

6

コンポーネントから継承して、その機能を取得してみてください。

この例では、という名前のクラスを作成しました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 が必要になると思います。コレクションを で装飾するだけではDesignerSerializationVisibility.Content十分ではありません。

ILSpy を使用して確認しました。ToolStrip には内部の ToolStripCodeDomSerializer に設定された DesignerSerializer があり、関連するすべてのコード プロパティを生成する責任があると思います。

これを実装するのは少し専門的な作業になると思います。開始するための 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 に答える