在Windows窗体应用程序上停靠和锚定

我正在使用C#.NET Compact Framework 2.0 SP2Windows Mobile 5.0及更高版本开发应用程序。

我有一个内部有两个面板的WinForm(upperPanel和bottomPanel)。 我希望upperPanel总是填充表单高度的2/3,而bottomPanel填充表单高度的1/3。 两个面板都将填充完整forms的宽度。

我用过这个:

upperPanel.Dock = Fill; bottomPanel.Dock = Bottom; 

但是upperPanel完整地填充了表单。

我怎样才能做到这一点? 我想要的不仅仅是 不同的形状因素风景或者模式的gui。

谢谢。

您需要做的是先将底部面板放在第一位,然后将其Dock属性设置为Bottom 。 然后将面板的高度设置为窗体高度的1/3。 最后,添加第二个面板并将其Dock属性设置为Fill 。 这里的关键是你要添加控件,它将填充最后添加的剩余区域。 或者,您可以使用Visual Studio中的Bring to Front和Send to Back命令来让设计人员进行合作。

您可能还需要挂钩表单的OnSizeChanged事件,并重新设置底部面板的高度以考虑布局更改。 自从我做了紧凑的框架编程以来已经有一段时间了,所以我不确定。

右键单击upperPanel并选择Bring To Front。 但是,我不认为这会给你想要的结果。 resize时,底部面板将保持相同的高度,而上部面板将拉伸以填充表单。

使用您的停靠设置,使用此代码可能会做到这一点:

  protected override void OnSizeChanged(EventArgs e) { base.OnSizeChanged(e); this.bottomPanel.Height = Convert.ToInt32((double)this.Height / 3.0); } 

将两个面板设置为“未锚定”。 即:删除Dock-Value并清除Anchor属性。 然后,移动控件,使其大小与您希望它们的大小相同。

之后,在调整表单大小时,它们应该相对resize。

编辑
哎呀,只是试了一下,确定它不起作用。 我把它与一个自动将控件集中在窗口中心的解决方案混合在一起……

好吧,我猜你必须为表单的Resize事件创建一个处理程序,并在Resize表单Resize后手动对齐控件。

转到工具,其他Windows,文档大纲。 找到两个面板,并交换它们的顺序。 具有DockStyle.Fill的控件必须首先使其正确停靠。 (或者最后……永远不确定它是哪一个,但它是其中之一:p)

这不会解决总是1/3和2/3的问题,但是……因为底部面板将具有固定的高度(除非我弄错了)。 我想也许TableLayoutPanel支持这个……

更新:如评论中所述,该小组在紧凑框架中不存在。 所以,我想这个问题最简单的解决方案就是尝试使用对接,但只要表单大小发生变化,就会更新底部面板的高度。

如果你想让它完美地工作,你需要在Form的Resize事件中添加一些代码,然后专门计算出相对大小,并在resize后将控件放在正确的位置。

如果你不担心失去精确度并且表格不会移动很多,你可以通过使用一些相对聪明的锚点来避免这种情况。 基本上你将不得不选择一个“种植者”(forms的一部分越大,forms越大)。 在这种情况下,我可能会将顶部锚定到Top | 左| 正确和底部到顶部| 左| 对| 底部。 这意味着如果表单扩展,表单的下半部分将变大。 大多数情况下这是可以接受的。 如果不使用Resize事件和一些代码。

最简单的方法是嵌套面板。 只需设置顶部底部的面板并填充。 然后使用这些面板中的面板来做同样的事情。 我在其中遇到的唯一问题是数据网格大小调整,无论如何总是很痛苦。 在这种情况下,您必须使用一些代码来调整窗体resize事件上的datagrid控件的大小。

我想补充一点@jasonh的答案。

对于占用表单2/3的面板,您必须将面板的AutoScroll属性设置为true。

这将使面板在控件尺寸超出用户可见性时显示滚动,并确保较小面板的可见性,即面板高度的1/3。

您可以使用嵌套面板以及使用锚定和停靠属性进行少量设置来获得所需的设计。遵循以下步骤:1)添加表单并在其上放置Panel1。 将其Dock属性设置为“Fill”,将ResizeMode设置为“Grow&Shrink”。 2)添加第二个panel2并将其Dock属性设置为’Bottom’,设置高度并将Anchor属性设置为’Top,Left’。 3)添加第三个面板并将其Dock属性设置为“None”,设置高度并将Anchor属性设置为“Top,Bottom,Left,Right”。

保存并编译。 现在所有的面板都会通过resize来保持相对定位。