2009-06-08 10 views
3

自分のユーザーコントロールを作成しようとしていて、ほぼ完成しました。私はデザイナーのオプションを "親コンテナにドッキング"したいと思います。誰もこれを行う方法を知っていますか?私は例を見つけることができません。私はそれがDocking Attributeと関係があると思います。ユーザーコントロールのドッキング属性

+1

いただきましたか? – tanascius

答えて

5

これを達成するには、いくつかのクラスを実装する必要があります。まずControlDesignerカスタムが必要です。カスタムDesignerActionListが必要になります。どちらもかなりシンプルです。

ControlDesigner:

public class MyUserControlDesigner : ControlDesigner 
{ 

    private DesignerActionListCollection _actionLists; 
    public override System.ComponentModel.Design.DesignerActionListCollection ActionLists 
    { 
     get 
     { 
      if (_actionLists == null) 
      { 
       _actionLists = new DesignerActionListCollection(); 
       _actionLists.Add(new MyUserControlActionList(this)); 
      } 
      return _actionLists; 
     } 
    } 
} 

DesignerActionList:

public class MyUserControlActionList : DesignerActionList 
{ 
    public MyUserControlActionList(MyUserControlDesigner designer) : base(designer.Component) { } 

    public override DesignerActionItemCollection GetSortedActionItems() 
    { 
     DesignerActionItemCollection items = new DesignerActionItemCollection(); 
     items.Add(new DesignerActionPropertyItem("DockInParent", "Dock in parent")); 
     return items; 
    } 

    public bool DockInParent 
    { 
     get 
     { 
      return ((MyUserControl)base.Component).Dock == DockStyle.Fill; 
     } 
     set 
     { 
      TypeDescriptor.GetProperties(base.Component)["Dock"].SetValue(base.Component, value ? DockStyle.Fill : DockStyle.None); 
     } 
    }  
} 

最後に、あなたがコントロールにデザイナーを添付する必要があります。

[Designer("NamespaceName.MyUserControlDesigner, AssemblyContainingTheDesigner")] 
public partial class MyUserControl : UserControl 
{ 
    // all the code for your control 

簡単な説明

コントロールにはDesignerという属性が関連付けられており、カスタムデザイナーが指摘しています。そのデザイナーの唯一のカスタマイズは公開されているDesignerActionListです。カスタムアクションリストのインスタンスを作成し、それを公開されたアクションリストコレクションに追加します。

カスタムアクションリストにはboolプロパティ(DockInParent)が含まれ、そのプロパティのアクションアイテムが作成されます。プロパティ自体が編集されている成分のDockプロパティがDockStyle.Fillであればfalseさもなければ、trueを返し、DockInParenttrueに設定されている場合、コンポーネントのDock性さもなければDockStyle.NoneDockStyle.Fillに設定されています。

これは、デザイナーのコントロールの右上隅に近い小さな「アクション矢印」を表示し、矢印をクリックするとタスクメニューが表示されます。

3

コントロールがUserControl(または他のほとんどのコントロールが使用可能)から継承される場合は、DockプロパティをDockStyle.Fillに設定する必要があります。

14

また、DockingAttributeを見ることをお勧めします。

[Docking(DockingBehavior.Ask)] 
public class MyControl : UserControl 
{ 
    public MyControl() { } 
} 

これは、コントロールの右上隅に 'action arrow'も表示します。

このオプションは、.NET 2.0と同様に利用できます。あなたが探しているのは、「親コンテナ内のドック/元に戻す」機能であれば、はるかに簡単です。その場合、デザイナーのクラスは大過剰です。

また、DockingBehavior.NeverDockingBehavior.AutoDockというオプションがあります。 Neverは矢印を表示せず、デフォルトのDockの動作で新しいコントロールを読み込みます。AutoDockは矢印を表示しますが、コントロールは自動的にFillにドッキングします。

PS:申し訳ありません。私も同様のソリューションを探していましたが、これがGoogleで最初に現れたのです。 デザイナーの属性は私に考えを与えてくれたので、私は掘り起こし始めました。 はDockingAttributeを見つけました。これは、同じ要求された結果を持つ ソリューションよりはるかにクリーンでした。うまくいけば、これは将来の誰か 助けるでしょう。コントロールのドック・プロパティと間違っ

関連する問題