Пользовательский элемент управления GroupBox с другими элементами управления внутри - PullRequest
2 голосов
/ 30 июня 2011

Мне не нравились доступные решения, поэтому я начал создавать собственный интерфейс мастера.Я использую GroupBox для каждого шага мастера, но поскольку каждый шаг (каждый GroupBox) должен иметь одинаковую структуру и стиль, я решил использовать пользовательские элементы управления.

Теперь мне нужен пользовательский GroupBox, который имеет следующие элементы:

  • FlowLayoutPanel, чтобы разработчик мог поместить в нее нужные элементы управления, используя конструктор.(Например, два элемента управления TextBox, чтобы пользователь мог ввести имя пользователя и пароль.)

  • Метка в этой FlowLayoutPanel для описания шага.

  • Кнопка для возврата.

  • Еще одна панель FlowLayout, в которую пользователь может добавлять пользовательские кнопки.

Вот предварительный просмотр:

Preview of what the custom GroupBox should look like.

Задача № 1

Когда я создаю новый UserControl и наследую GroupBox, я не могу получить GroupBox, который я могу поместить, и поместить в него материал,Все, что я вижу в конструкторе, это сообщение:

The error.

Задача № 2

Поскольку я не мог заставить его наследовать GroupBox так, как хотел, япопытался сделать это, поместив GroupBox в пользовательский UserControl.(Я не хочу этого. Я просто сделал это, чтобы предоставить несколько скриншотов.) После этого мне пришлось включить EnableDesignMode на FlowLayoutPanels, чтобы разработчик мог добавить в них элементы управления с помощью дизайнера.Проблема в том, что они также стали подвижными и изменяли размеры (я не хочу этого. Они правильно привязаны, и их не следует перемещать или изменять размер.), И когда вы пытаетесь их переместить, вы получаете «Ссылка на объект не установлена ​​на экземпляробъект."что делает его более уродливым:

Movers and resizers on the FlowLayoutPanels.

Задача № 3

Я хочу, чтобы элементы в главной FlowLayoutPanel были центрированы.Чтобы сделать это, мне нужно было поместить элемент управления (метку описания) и изменить его размер до ширины FlowLayoutPanel, чтобы элементы управления после него были центрированы.(Обходной путь, если вы спросите меня. Делать это с помощью TableLayoutPanel выглядело проще, но их ячейки могут содержать только один элемент. Вы можете добавить Panel, чтобы ячейка содержала больше элементов, но тогда вы теряете центрирование.) Проблема в том, что мне нужно установитьПривязка к None для каждого элемента управления, который я добавляю.Могу ли я подключить что-нибудь (например, OnDesignerControlAdded ???), чтобы автоматически установить привязку добавленного элемента управления на None?

Control positions with different Anchor values.

Все ваши ответы помогут мне построить проект с открытым исходным кодом Маг на GitHub и многих других проектах с открытым исходным кодом на его основе.Заранее благодарим за все ваши усилия.

1 Ответ

3 голосов
/ 22 августа 2011

Быстрый ответ на задачу № 1:

Создайте свой групповой ящик (GroupBox1) на форме или пользовательском контроле (это не имеет значения).

Перейдите к InitializeComponent () в файле designer.cs и скопируйте весь код, связанный с групповым ящиком и его дочерними элементами управления.

Добавить новый пользовательский элемент управления с именем CustomGroupBox в проект.

Измените его для наследования от GroupBox:

public partial class CustomGroupBox : GroupBox

Вставьте весь скопированный код в конструктор CustomGroupBox (или в новый метод, который вы вызываете из конструктора после InitializeComponent (), если хотите быть аккуратным).

Удалить все вхождения this. из вставленного кода. Заменить все вхождения GroupBox1 на this.

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

например.

    public FlowLayoutPanel FLP
    { 
        get { return flowLayoutPanel1; } 
    }

И, конечно, добавьте свой CustomDesigner

    public class CustomGroupBoxDesigner : ControlDesigner
    {
        public override void Initialize(IComponent component)
        {
            base.Initialize(component);
            var c = component as CustomGroupBox;
            EnableDesignMode(c.FLP, "FLP");
        }
    }

и применить атрибут

[Designer(typeof(CustomGroupBoxDesigner))]
public partial class CustomGroupBox : GroupBox
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...