5

我正在尝试制作自己的用户控件并且几乎完成了它,只是想添加一些润色。我希望设计器中的选项“停靠在父容器中”。有谁知道如何做到这一点我找不到一个例子。我认为这与对接属性有关。

4

3 回答 3

16

我还建议查看DockingAttribute

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

这还会在控件的右上角显示“操作箭头”。

早在 .NET 2.0 中就可以使用此选项,如果您要寻找的只是“在父容器中停靠/取消停靠”功能,则要简单得多。在这种情况下,Designer 类是巨大的矫枉过正。

它还提供 和 的DockingBehavior.Never选项DockingBehavior.AutoDockNever不显示箭头并以其默认Dock行为加载新控件,同时AutoDock显示箭头但自动将控件停靠在Fill.

PS:很抱歉死灵一个线程。我一直在寻找类似的解决方案,这是谷歌上出现的第一件事。Designer 属性给了我一个想法,所以我开始四处挖掘并找到了 DockingAttribute,它似乎比具有相同请求结果的公认解决方案要干净得多。希望这将有助于将来的某人。

于 2012-04-06T20:58:30.237 回答
6

我为了实现这一点,你需要实现几个类;首先你需要一个自定义的ControlDesigner然后你需要一个自定义的DesignerActionList。两者都相当简单。

控制设计器:

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如果Dock正在编辑的组件的属性是,则属性本身将返回DockStyle.Fill,否则false,如果DockInParent设置为trueDock则将组件的属性设置为DockStyle.Fill,否则DockStyle.None

这会在设计器中靠近控件右上角显示一个小的“动作箭头”,点击箭头会弹出任务菜单。

于 2009-06-08T12:08:48.683 回答
4

如果您的控件继承自UserControl(或大多数其他可用控件),则只需将Dock属性设置为DockStyle.Fill.

于 2009-06-08T11:47:22.223 回答