0

我有一个设置为 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 回答 2

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

于 2011-11-29T13:36:28.993 回答
0

ControlBox,MinimizeBoxMaximizeBox设置为 False 并设置WindowStateMaximized呢?

然后,您可以有一个 Panel 或 GroupBox 或其他在最大化子窗体中居中的可视元素,以便它始终保持在屏幕的中心,并且用户无法调整该元素的大小或以其他方式移动它。

至于只打开一个实例,这只是一个忙碌的工作:当你的表单打开时,将打开的实例注册到一个静态类中;当它关闭时取消注册。在打开表单之前,检查静态类中是否注册了实例;如果是,则将焦点放在它上面,如果没有打开一个新实例。

于 2011-11-28T22:06:39.360 回答