C # Windows Form: проблемы родительской и дочерней форм Mdi - PullRequest
0 голосов
/ 29 ноября 2011

У меня есть родительская форма, которая установлена ​​как контейнер Mdi. Я загружаю дочернюю форму с именем Plot из строки меню, щелкаю в родительской форме. Код:

protected void menuPlot_Click(object sender, EventArgs e)
{
    // ... load form with Plot settings in center of parent form

    // ... create a new instance of the Plot settings child form
    PlotSettings plotSettings = new PlotSettings();

    // ... set Welcome as the parent form for the Plot settings child window
    plotSettings.MdiParent = this;

    // ... display and position Plot settings child form
    plotSettings.StartPosition = FormStartPosition.CenterScreen;  // center child form 
    plotSettings.Show();  //  display child form
}

Это хорошо работает, за исключением следующих вопросов:

  1. Могу ли я заставить детскую форму оставаться в центре? В настоящее время я могу перетащить его внутрь контейнера. Я хотел бы предотвратить перемещение пользователя. Единственный способ, которым я могу думать о doin git в это время, - это сделать ребенка без границ, но я не уверен, сработает ли это.

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

  3. У меня есть несколько меток на родительской форме, и метки всегда располагаются поверх дочерней формы. Есть ли способ заставить дочернюю форму быть самой верхней? Я использую TopMost, и это не похоже на работу.

Спасибо за любую помощь, которую вы можете оказать.

Ответы [ 2 ]

1 голос
/ 29 ноября 2011
  1. Используйте дочернее событие формы LocationChanged и введите код для центрирования формы.

    this.Left = ((this.ParentForm.ClientRectangle.Width - this.Width) / 2);
    this.Top = ((this.ParentForm.ClientRectangle.Height - this.Height) / 2);
    
  2. Чтобы иметь только один экземпляр формы, проверьте его существование, используя:

    if (!this.MdiChildren.Any<Form>(item => item is Form1))
    {
    
    }
    
  3. Вы могли бы перерисовать графику вручную в окне формы MDI, но в противном случае я бы не стал размещать там элементы управления. (Вам необходимо переопределить OnPaint и OnPaintBackgound.)

0 голосов
/ 29 ноября 2011

Как насчет установки ControlBox, MinimizeBox и MaximizeBox на False и установки WindowState на Maximized?

Тогда вы можете иметь Panel или GroupBox или другой визуальный элемент, которыйцентрирован внутри развернутой дочерней формы, так что он всегда будет оставаться в центре экрана, и пользователь не сможет изменить размер этого элемента или переместить его другим способом.

Что касается открытия только одного экземпляра, это просто заняторабота: когда ваша форма открыта, зарегистрируйте открытый экземпляр в статическом классе;когда он закрыт, отмените регистрацию.Перед открытием формы проверьте, зарегистрирован ли экземпляр в статическом классе;если это так, установите фокус на нем, если нет, откройте новый экземпляр.

...