У меня большое количество пользовательских элементов управления, которые очень похожи. У них много общего поведения. Я использовал базовый класс, который имеет общие вещи, а затем специализировал класс по мере необходимости.
class BaseControl : UserControl
{
// common
}
class RedControl : BaseControl
{
// specialized
}
class BlueControl : BaseControl
{
// specialized
}
и т.д ...
Это работает довольно хорошо, пока мне не нужно было начинать вставку или изменение макета дочерних элементов управления, содержащихся в BaseControl. Например, RedControl необходимо добавить кнопку на определенную панель базового элемента управления. В другом случае мне нужно изменить размер или расположение других базовых дочерних элементов управления.
Когда я попробовал следующий код, я не увидел ни одной кнопки во время выполнения ...
public partial class RedControl : BaseControl
{
public RedControl()
{
InitializeComponent();
addButtonToBase(); // no button shows up
this.PerformLayout();
}
void addButtonToBase()
{
Button button = new Button();
button.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)));
button.Location = new System.Drawing.Point(3, 3);
button.Size = new System.Drawing.Size(23, 23);
button.Text = "My Button";
baseSplitContainer.Panel1.Controls.Add(button); // protected child control in base
}
// ...
}
Я могу сделать отображение кнопки дочерним по отношению к baseSplitContainer, если я сделаю виртуальный addButtonToBase () и вручную добавлю его в сгенерированный код в InitalizeComponent () BaseControl.
Макет BaseControl все еще продолжался, и вам разрешено вызывать виртуальные функции в конструкторах в C # .Net ....
Так что, хотя это работает, это не очень хорошее решение. Во-первых, когда я редактирую BaseControl в конструкторе VS, вызов addBaseControl () в IntializeComponent удаляется,
Для другого вызова виртуальных функций в конструкторах кажется опасным.
Я думаю, мне нужно, чтобы макет базового элемента управления повторился в производном элементе ...
Я пытался это сделать, но либо сделал это неправильно, либо не получится ...
Кстати, я знаю, что WPF хорош в этом. Не могу использовать его из-за ограничений на другие системы.