我正在尝试创建自己的用户控件并几乎完成它,只是尝试添加一些润色。我希望设计器中的选项“Dock in parent container”。有谁知道如何做到这一点我找不到一个例子。我认为它与Docking属性有关。
答案 0 :(得分:14)
我还建议查看DockingAttribute。
[Docking(DockingBehavior.Ask)]
public class MyControl : UserControl
{
public MyControl() { }
}
这也会在控件的右上角显示“动作箭头”。
这个选项可以追溯到.NET 2.0,如果你所寻找的只是'父容器中的Dock / Undock'功能,它就更简单了。在这种情况下,Designer类是非常矫枉过正的。
它还提供了DockingBehavior.Never
和DockingBehavior.AutoDock
的选项。 Never
未显示箭头并按其默认Dock
行为加载新控件,而AutoDock
显示箭头但会自动将控件停靠在Fill
。
PS:很抱歉有一个线程坏死。我一直在寻找类似的解决方案,这是谷歌首次出现的问题。该 设计师属性给了我一个想法,所以我开始挖掘和 找到了DockingAttribute,它看起来比接受的要清晰得多 具有相同请求结果的解决方案。希望这会有所帮助 将来有人。
答案 1 :(得分: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
),并为该属性创建操作项。如果正在编辑的组件的true
属性为Dock
,则属性本身将返回DockStyle.Fill
,否则为false
,如果DockInParent
设置为{{1} }},组件的true
属性设置为Dock
,否则设置为DockStyle.Fill
。
这将在设计器中显示靠近控件右上角的小“动作箭头”,然后单击箭头将弹出任务菜单。
答案 2 :(得分:3)
如果您的控件继承自UserControl
(或大多数其他可用控件),则只需将Dock
属性设置为DockStyle.Fill
。