2012-01-07 159 views
1

我有一个MDI窗体和一些子窗口。我把孩子的窗户停靠在MDI的不同区域,但是当每个窗体上的焦点都丢失时,其他停靠的窗体将重新排列,每一件事情都会爆炸。由于存在疑问混淆,我准备了一组图像来显示反应。MDI窗体对接子窗口

图像1,之前单击任何形式:

enter image description here

镜像2,点击W2后:

enter image description here

所不同的是,当最左侧停靠的窗口获得焦点,它会将其大小更改为MDI窗口的右端,而不提及W1窗口。

我该如何解决这个问题?谢谢。

+0

MDI和对接是反对象,窗口模型强烈支持重叠的孩子。 20年前用户拥有640 x 480分辨率的显示器时产生了很多意义。使用像http://sourceforge.net/projects/dockpanelsuite/ – 2012-01-07 14:49:37

+0

这样的停靠库我知道这不是正确的方法,但我想尝试。我曾与dockpanelsuit合作过,这很棒,但我对自己的东西更加自在。感谢您的回复。 – MahanGM 2012-01-07 15:51:46

+0

更好的是,停止使用MDI。正如汉斯所说,它不是专为对接而设计的,它会一路战斗。如果你想发明你自己的车轮,如果你放弃MDI风格并且只使用普通的对接儿童就会容易得多。 – 2012-01-07 15:53:54

回答

0

您是否尝试过修改子窗体(W2)的Resize方法的大小?

//something like this 
    private void W2_Resize(object sender, EventArgs e) 
    { 
     Size pSize = this.ClientSize; 
     // Resize the form 
    } 

或者meybe使用Focus方法。 我不知道它是否会导致perfomence问题,但。

+0

我没有,但我认为它会留在以前的风格。我会试一试。 – MahanGM 2012-01-07 15:49:16

1

还有另一个解决方案。一个非常快速的例子是:

  • 创建一个新窗口窗体(Form1)。将其isMidiContainer属性设置为true。
  • 现在,在其上放置一个面板(Panel1)并将其浮动属性设置为右侧,然后设置宽度。
  • 在窗体上放置另一个面板(panel2),并将其底座设置为右侧。现在这两个面板彼此相邻。

现在创建2个新的窗体窗体(窗体2和窗体3)。

现在,在Form1的主,只是下面的InitializeComponent(),添加:

Form2 f2 = new Form2(); 
f2.TopLevel = false; 
f2.Dock = DockStyle.Fill; 
panel1.Controls.Add(f2); 
f2.Show(); 

Form3 f3 = new Form3(); 
f3.TopLevel = false; 
f3.Dock = DockStyle.Fill; 
panel2.Controls.Add(f3); 
f3.Show(); 

这是一个有点不同的方法,但它应该工作得很好。

+0

感谢您在这么长时间后的回复。本月早些时候我研究了“Form.TopLevel”,并解决了这个问题。 – MahanGM 2013-01-22 14:39:56

+0

酷豆。现在其他人可以看到他们是否有同样的问题:)。 – 2013-01-22 14:50:24