5

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

4

3 に答える 3

16

DockingAttributeも参照することをお勧めします。

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

これにより、コントロールの右上隅に「アクション矢印」も表示されます。

このオプションは .NET 2.0 までさかのぼって利用できます。探しているのが「親コンテナーのドッキング/ドッキング解除」機能だけであれば、はるかに簡単です。その場合、デザイナークラスは非常にやり過ぎです。

DockingBehavior.Neverまた、およびのオプションも提供しますDockingBehavior.AutoDockNeverは矢印を表示せず、デフォルトのDock動作で新しいコントロールをロードしAutoDockますが、矢印は表示しますが、コントロールを as として自動的にドッキングしFillます。

PS: スレッドの壊滅について申し訳ありません。私は同様のソリューションを探していましたが、これが Google で最初に表示されたものでした。Designer の属性からアイデアが得られたので、いろいろ調べてみたところ、同じ要求結果を持つ受け入れられたソリューションよりもはるかにクリーンに見える DockingAttribute を見つけました。うまくいけば、これは将来誰かを助けるでしょう。

于 2012-04-06T20:58:30.237 に答える
6

これを実現するには、いくつかのクラスを実装する必要があります。最初にカスタム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)が含まれ、そのプロパティのアクションアイテムが作成されます。編集中のコンポーネントのプロパティが、そうでないtrue場合はプロパティ自体が返され、がに設定されている場合はコンポーネントのプロパティがに設定され、それ以外の場合はに設定されます。DockDockStyle.FillfalseDockInParenttrueDockDockStyle.FillDockStyle.None

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

于 2009-06-08T12:08:48.683 に答える
4

コントロールが (または利用可能な他のほとんどのコントロール) から継承する場合は、プロパティをUserControlに設定するだけです。DockDockStyle.Fill

于 2009-06-08T11:47:22.223 に答える