2011-11-28 195 views
0

我有一个父窗体设置为Mdi容器。我从父窗体中的菜单栏中单击加载名为Plot的子窗体。该代码是:C#窗体窗体:Mdi父窗体和子窗体问题

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,这似乎不起作用。

感谢您的任何帮助,您可能会提供。

+1

这是三次“否”。你真的似乎不想使用MDI。使用另一个窗口模型,如http://sourceforge.net/projects/dockpanelsuite/ –

+0

谢谢你的链接。您可能是对的,但我认为可能有办法 – Zeos6

+0

您无法在父窗体上进行任何控制,如果它们可见,它们将始终显示在子窗体的顶部。看看这个答案,我给了一个simular [问题](http:// stackoverflow。com/a/4130055/479512) –

回答

0

怎么样设置ControlBoxMinimizeBoxMaximizeBox为False,设置WindowStateMaximized

然后,您可以有一个Panel或GroupBox或以最大化的子窗体为中心的其他视觉元素,以便它始终保持在屏幕的中心,并且用户无法调整该元素的大小或以其他方式移动它。至于只打开一个实例,这只是忙碌的工作:当你打开表单时,将打开的实例注册到一个静态类中;当它关闭时取消注册。在打开表单之前,检查一下是否有一个实例在静态类中注册;如果是这样,请将重点放在它上面,如果没有打开一个新的实例。

+0

将检查了这一点。谢谢。 – Zeos6

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

+0

实例检查似乎不适用于我,但我明白了这个概念。我会尽力去玩。谢谢。 – Zeos6