Атрибут закрепления пользовательского контроля - PullRequest
3 голосов
/ 08 июня 2009

Я пытаюсь создать свой собственный пользовательский элемент управления и почти закончил его, просто пытаюсь добавить немного блеска. Мне бы хотелось, чтобы в конструкторе была опция «Закрепить в родительском контейнере». Кто-нибудь знает, как это сделать, я не могу найти пример. Я думаю, что это как-то связано с атрибутом стыковки.

Ответы [ 3 ]

14 голосов
/ 07 апреля 2012

Я бы также посоветовал взглянуть на DockingAttribute .

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

Также отображается «стрелка действия» в верхнем правом углу элемента управления.

Эта опция доступна еще в .NET 2.0, и она намного проще, если все, что вам нужно, это функция «Dock / Undock in Parent Container». Классы Designer в этом случае являются огромным излишним.

Он также предоставляет опции DockingBehavior.Never и DockingBehavior.AutoDock. Never не отображает стрелку и загружает новый элемент управления по умолчанию Dock, в то время как AutoDock отображает стрелку, но автоматически прикрепляет элемент управления как Fill.

PS: Извините за некроманизацию потока. Я искал подобное решение, и это было первое, что появилось в Google. Атрибуты дизайнера дали мне идею, поэтому я начал копаться и нашел DockingAttribute, который казался намного чище, чем принято Решение с теми же запрошенными результатами. Надеюсь, это поможет кто-то в будущем.

5 голосов
/ 08 июня 2009

Для того, чтобы добиться этого, вам нужно реализовать пару классов; сначала вам понадобится пользовательский 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.

Это отобразит маленькую «стрелку действия» рядом с верхним правым углом элемента управления в конструкторе, а нажатие стрелки откроет меню задач.

3 голосов
/ 08 июня 2009

Если ваш элемент управления наследуется от UserControl (или большинства других доступных элементов управления), вам просто нужно установить свойство Dock на DockStyle.Fill.

...