Winforms: общая форма хоста для различных пользовательских элементов управления? - PullRequest
2 голосов
/ 08 апреля 2011

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

public partial class LookupHostForm<TUserControl> : Form where TUserControl : UserControl

Есть ли способ, которым я могу использовать одну форму для размещения нескольких пользовательских элементов управления, не зная / не заботясь о том, что пользовательский элемент управления знает?есть

Ответы [ 2 ]

1 голос
/ 08 апреля 2011

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

Все, что вам нужно сделать, это добавить свой пользовательский элемент управления в коллекцию элементов управления формы. Это будет иметь именно тот эффект, который вы хотите. Например:

CustomUserControl uc = new CustomUserControl();
myForm.Controls.Add(uc);

Чтобы отменить эффект, вы также можете закрепить пользовательский элемент управления, чтобы заполнить всю клиентскую область формы хоста, или закрепить его со всех четырех сторон. Стыковка приведет к изменению размера пользовательского элемента управления при изменении размера его главной формы. Привязка просто центрирует пользовательский элемент управления в середине его хоста. Используйте соответствующие свойства Dock и Anchor вашего пользовательского элемента управления для достижения этого эффекта.

И, конечно, любой объект формы может сделать это. Я бы выделил класс Form и выставил бы строго типизированный метод для добавления экземпляров моих пользовательских элементов управления в его коллекцию элементов управления. Например:

public class HostForm : Form
{
    public void SetChildControl<TUserControl>(TUserControl ctrl) where TUserControl : UserControl
    {
        // Add the specified user control to the forms controls collection
        this.Controls.Add(ctrl);

        // Dock the user control in its host form
        ctrl.Dock = DockStyle.Fill;
    }
}
1 голос
/ 08 апреля 2011

Вы, конечно, можете делать как вам нужно

Просто добавьте конструктор, который принимает тип или экземпляр UserControl, который вы хотите.Затем добавьте его как дочерний элемент управления формы в конструкторе.Или добавьте виртуальный метод, который создает определенный интересующий элемент управления, и у вас есть производный класс для каждого варианта, который вам нужен, где каждый производный класс переопределяет виртуальный и возвращает правильный тип.Или иметь свойство, которое определяет элемент управления.Много способов сделать это.

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