自分のユーザーコントロールを作成しようとしていて、ほぼ完成しました。私はデザイナーのオプションを "親コンテナにドッキング"したいと思います。誰もこれを行う方法を知っていますか?私は例を見つけることができません。私はそれがDocking Attributeと関係があると思います。ユーザーコントロールのドッキング属性
答えて
これを達成するには、いくつかのクラスを実装する必要があります。まず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
を返し、DockInParent
がtrue
に設定されている場合、コンポーネントのDock
性さもなければDockStyle.None
、DockStyle.Fill
に設定されています。
これは、デザイナーのコントロールの右上隅に近い小さな「アクション矢印」を表示し、矢印をクリックするとタスクメニューが表示されます。
コントロールがUserControl
(または他のほとんどのコントロールが使用可能)から継承される場合は、Dock
プロパティをDockStyle.Fill
に設定する必要があります。
また、DockingAttributeを見ることをお勧めします。
[Docking(DockingBehavior.Ask)]
public class MyControl : UserControl
{
public MyControl() { }
}
これは、コントロールの右上隅に 'action arrow'も表示します。
このオプションは、.NET 2.0と同様に利用できます。あなたが探しているのは、「親コンテナ内のドック/元に戻す」機能であれば、はるかに簡単です。その場合、デザイナーのクラスは大過剰です。
また、DockingBehavior.Never
とDockingBehavior.AutoDock
というオプションがあります。 Never
は矢印を表示せず、デフォルトのDock
の動作で新しいコントロールを読み込みます。AutoDock
は矢印を表示しますが、コントロールは自動的にFill
にドッキングします。
PS:申し訳ありません。私も同様のソリューションを探していましたが、これがGoogleで最初に現れたのです。 デザイナーの属性は私に考えを与えてくれたので、私は掘り起こし始めました。 はDockingAttributeを見つけました。これは、同じ要求された結果を持つ ソリューションよりはるかにクリーンでした。うまくいけば、これは将来の誰か 助けるでしょう。コントロールのドック・プロパティと間違っ
いただきましたか? – tanascius