UserControl с заголовком и содержимым - разрешить удаление элементов управления на панели содержимого и предотвращение удаления элементов управления в заголовке во время разработки - PullRequest
0 голосов
/ 08 июня 2018

Я написал User Control (ууу!).Но я хочу, чтобы он вел себя как контейнер.Но ждать!Я знаю о

[Designer("System.Windows.Forms.Design.ParentControlDesigner, System.Design", 
    typeof(IDesigner))]

Трюк.

Проблема в том, что я не хочу, чтобы весь мой контроль вел себя как контейнер, а только одна часть.Одна - де-факто - панель;)

Для более широкого контекста: я написал элемент управления с сеткой, некоторыми общими кнопками, надписями и функциями.Но он также имеет часть, где пользователь должен отбросить свои пользовательские кнопки / элементы управления в любом случае.Только в этой конкретной части контроля, больше нигде.

У кого-нибудь была идея?

1 Ответ

0 голосов
/ 09 июня 2018

Вы должны сделать следующее:

  • Для вашего пользовательского элемента управления вам нужно создать новый дизайнер, который включает внутреннюю панель во время разработки, вызвав EnableDesignModemethod.
  • Для внутренней панели вам необходимо создать конструктор, который отключает перемещение, изменение размера и удаляет некоторые свойства из конструктора.
  • Вы должны зарегистрировать дизайнеров.

Ваш пользовательский контроль

[Designer(typeof(MyUserControlDesigner))]
public partial class MyUserControl : UserControl
{
    public MyUserControl()
    {
        InitializeComponent();
        TypeDescriptor.AddAttributes(this.panel1,
            new DesignerAttribute(typeof(MyPanelDesigner)));
    }
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public Panel ContentsPanel
    {
        get { return panel1; }
    }
}

Дизайнер для внутренней панели

public class MyPanelDesigner : ParentControlDesigner
{
    public override SelectionRules SelectionRules
    {
        get
        {
            SelectionRules selectionRules = base.SelectionRules;
            selectionRules &= ~SelectionRules.AllSizeable;
            return selectionRules;
        }
    }
    protected override void PostFilterAttributes(IDictionary attributes)
    {
        base.PostFilterAttributes(attributes);
        attributes[typeof(DockingAttribute)] = 
            new DockingAttribute(DockingBehavior.Never);
    }
    protected override void PostFilterProperties(IDictionary properties)
    {
        base.PostFilterProperties(properties);
        var propertiesToRemove = new string[] {
            "Dock", "Anchor", "Size", "Location", "Width", "Height",
            "MinimumSize", "MaximumSize", "AutoSize", "AutoSizeMode",
            "Visible", "Enabled",
        };
        foreach (var item in propertiesToRemove)
        {
            if (properties.Contains(item))
                properties[item] = TypeDescriptor.CreateProperty(this.Component.GetType(),
                    (PropertyDescriptor)properties[item],
                    new BrowsableAttribute(false));
        }
    }
}

Конструктор для вашего пользовательского элемента управления

public class MyUserControlDesigner : ParentControlDesigner
{
    public override void Initialize(IComponent component)
    {
        base.Initialize(component);
        var contentsPanel = ((MyUserControl)this.Control).ContentsPanel;
        this.EnableDesignMode(contentsPanel, "ContentsPanel");
    }
    public override bool CanParent(Control control)
    {
        return false;
    }
    protected override void OnDragOver(DragEventArgs de)
    {
        de.Effect = DragDropEffects.None;
    }
    protected override IComponent[] CreateToolCore(ToolboxItem tool, int x,
        int y, int width, int height, bool hasLocation, bool hasSize)
    {
        return null;
    }
}

Пример

Вы можете прочитать сообщение в блоге об этомтема здесь и клонирование или загрузка рабочего примера:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...