Для того, чтобы добиться этого, вам нужно реализовать пару классов; сначала вам понадобится пользовательский 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
установлено на true
, свойство Dock
компонента установить DockStyle.Fill
, в противном случае DockStyle.None
.
Это отобразит маленькую «стрелку действия» рядом с верхним правым углом элемента управления в конструкторе, а нажатие стрелки откроет меню задач.