C#Windows窗体:Mdi父窗口和子窗体问题

时间:2011-11-28 21:06:10

标签: c# winforms mdichild

我有一个父表单,设置为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. 我有什么方法可以强迫儿童表格留在中心位置。目前,我可以在容器内拖动它。我想阻止用户移动它。我此时唯一可以想到的做法是让孩子无边框,但我不确定这是否有效。

  2. 有什么方法可以让孩子形成模态吗?是的,我知道我可以让孩子形成模态但是它将不再包含在父形式中,这是我想要的。是否有一种方法可以在子表单处于活动状态时禁用父控件?目前我可以打开子表单的多个实例,但我想在任何时候只有一个实例。

  3. 我在父表单上有一些标签,标签总是位于子表单的顶部。有没有办法强迫孩子形成最顶层?我使用过TopMost,这似乎不起作用。

  4. 感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:1)

  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。)

答案 1 :(得分:0)

如何将ControlBoxMinimizeBoxMaximizeBox设置为False并将WindowState设置为Maximized呢?

然后,您可以使用Panel或GroupBox或其他可视化元素,这些元素位于最大化子窗体的中心位置,以便它始终位于屏幕的中心,并且用户无法调整该元素的大小或以其他方式移动它。 / p>

至于只打开一个实例,这只是繁忙的工作:打开表单时,在静态类中注册打开的实例;当它关闭时注销它。在打开表单之前,检查实例是否在静态类中注册;如果是这样,如果没有打开新实例,请将焦点设置在它上面。