Мне интересно, что ваши производные формы не наследуют размер автоматически от их базовой формы, потому что это должно работать без необходимости что-либо с этим делать.
Предполагаемая причина вашей проблемы:
Я подозреваю, что ваша проблема связана с тем, что вы используете конструктор форм Visual Studio для редактирования форм. Всякий раз, когда вы редактировали форму, Windows Forms Designer генерирует необходимый код в методе InitializeComponent
ваших форм. Среди всего сгенерированного кода есть назначения, которые устанавливают размер формы, даже если он идентичен размеру базовой формы. Поэтому вам, возможно, придется вручную закомментировать эти назначения, если вы хотите, чтобы ваша производная форма имела такой же размер, что и базовая форма, даже если вы изменили размер базовой формы после создания производных форм. (Однако я не знаю, может ли это привести к дальнейшим проблемам с позиционированием и расположением элементов управления.)
// Code to be commented out in your derived form's InitializeComponent method:
this.AutoScaleDimensions = new System.Drawing.SizeF(...);
this.ClientSize = new System.Drawing.Size(...);
Как только эти строки будут закомментированы, для производной формы будет использоваться размер, установленный в InitializeComponent
вашей базовой формы.
Обходной путь решения:
Вы можете сделать следующее, чтобы вам не приходилось вручную комментировать сгенерированный дизайнером код каждый раз, когда вы редактировали форму:
Создайте форму, полученную из вашей базовой формы; давайте назовем это FrozenBaseForm
. Вы будете получать все другие формы из этого класса, а не напрямую из базовой формы. Теперь в этом «промежуточном» классе вы определяете новое свойство ClientSize
:
public class FrozenBaseForm : BaseForm
{
new public SizeF ClientSize
{
get { return base.ClientSize; }
set { }
}
}
Это приведет к тому, что все назначения для ClientSize
не будут иметь никакого эффекта и, следовательно, сохранят размер из базовой формы. Это похоже на хак, чтобы сказать правду, но, похоже, работает. Возможно, вам придется скрыть свойство Size
таким же образом.
Как уже было сказано, получайте ваши формы из FrozenBaseForm
вместо BaseForm
напрямую:
public class DerivedForm1 : FrozenBaseForm { ... }
public class DerivedForm2 : FrozenBaseForm { ... }
...
Другой вариант (в крайнем случае, если ничего не помогает):
В качестве последнего средства вы можете просто забыть о Forms Designer и просто определить производные формы вручную в редакторе кода (хотя я лично не хотел бы этого делать):
public class DerivedForm : BaseForm
{
public DerivedForm()
{
// make all necessary changes to the base form:
...
}
}