在 Windows 窗体应用程序上停靠和锚定
Posted
技术标签:
【中文标题】在 Windows 窗体应用程序上停靠和锚定【英文标题】:Docking and Anchoring on a Windows Form application 【发布时间】:2009-11-04 11:33:04 【问题描述】:我正在使用 C# 和 .NET Compact Framework 2.0 SP2 为 Windows Mobile 5.0 及更高版本开发应用程序。
我有一个 WinForm,里面有两个面板(upperPanel 和 bottomPanel)。我希望upperPanel 总是填充表单高度的2/3,而bottomPanel 填充表单高度的1/3。两个面板都将完全填满表单的宽度。
我用过这个:
upperPanel.Dock = Fill;
bottomPanel.Dock = Bottom;
但是 upperPanel 完整地填写了表格。
我该怎么做?我希望在不同的外形尺寸和横向或纵向模式下使用相同的gui。
谢谢。
【问题讨论】:
【参考方案1】:您需要做的是先将底部面板放在上面并将其Dock
属性设置为Bottom
。然后将面板的高度设置为窗体高度的 1/3。最后,添加第二个面板并将其Dock
属性设置为Fill
。这里的关键是您要添加将填充最后添加的剩余区域的控件。或者,您可以在 Visual Studio 中使用“置前”和“置后”命令来让设计人员合作。
您可能还需要为表单挂钩OnSizeChanged
事件并重新设置底部面板的高度以考虑布局更改。自从我做紧凑型框架编程以来已经有一段时间了,所以我不确定。
【讨论】:
“这里的关键是您要添加的控件将填充最后添加的剩余区域” 正如您所说,您可以取消停靠,带到前面,然后重新停靠...而不是添加最后一个...很好!【参考方案2】:右击upperPanel并选择Bring To Front。但是,我认为这不会给您想要的结果。调整大小时,底部面板将保持相同的高度,而顶部面板将拉伸以填充表单。
使用您的停靠设置,使用此代码可能会解决问题:
protected override void OnSizeChanged(EventArgs e)
base.OnSizeChanged(e);
this.bottomPanel.Height = Convert.ToInt32((double)this.Height / 3.0);
【讨论】:
我想要的结果在我的解决方案中。在投反对票之前尝试一下。【参考方案3】:将两个面板都设置为“未锚定”。即:移除 Dock-Value 并清除 Anchor 属性。然后,移动控件,使其按照您希望的大小调整大小。
之后,在调整表单大小时,它们应该相对调整大小。
编辑 哎呀,刚刚试了一下,确定它不起作用。我将它与一个自动将控件保持在窗口中心的解决方案混合在一起......
好吧,我猜你必须为表单的Resize
事件创建一个处理程序,并在调整表单大小后手动对齐控件。
【讨论】:
虽然我可以看到我的第一个回复显然没有帮助,但编辑为解决方案提供了有效的提示。因此,对于所有投反对票的人:请在 cmets 中给出一个理由。 你的答案是一个谷歌的答案,但我正在寻找一个没有以编程方式调整大小的解决方案。【参考方案4】:转到工具、其他窗口、文档大纲。找到两个面板,并交换它们的顺序。具有DockStyle.Fill
的控件必须首先出现才能正确停靠。 (或最后.. 不确定它是哪一个,但它是其中之一:p)
这并不能解决总是 1/3 和 2/3 的问题……因为底部面板将具有固定的高度(除非我弄错了)。我想也许TableLayoutPanel
支持这一点......
更新: 如 cmets 所述,该面板在紧凑框架中不存在。所以,我想这个问题最简单的解决方案是尝试使用停靠,但只要表单大小发生变化,就会更新底部面板的高度。
【讨论】:
很可惜,Compact Framework 中没有 TableLayoutPanel。 顺便说一句,您对具有固定高度的底部面板是正确的。 啊,好的。好吧,我从来没有使用过 Compact Framework,只是使用了常规的 WinForms。【参考方案5】:如果您希望它完美地工作,您需要向 Form 的 Resize 事件添加一些代码,然后专门计算出相对大小并在调整大小后将控件放置在正确的位置。
如果您不担心丢失精度并且表格不会移动太多,您可以通过使用一些相对智能的锚定来避免这种情况。本质上,您将不得不选择一个“种植者”(表格中变大的部分,表格越大)。在这种情况下,我可能会将顶部锚定到 Top |左 |右侧和底部到顶部 |左 |对 |底部。这意味着如果表单展开,表单的下半部分会变大。在大多数情况下,这是可以接受的。如果不使用 Resize 事件和一些代码。
【讨论】:
【参考方案6】:最简单的方法是嵌套面板。只需为顶部底部和填充设置面板。然后使用这些面板中的面板来做同样的事情。我在其中遇到的唯一问题是数据网格调整大小,无论如何这总是很痛苦。在这种情况下,您必须使用一些代码在表单调整大小事件上调整数据网格控件的大小。
【讨论】:
【参考方案7】:我想在@jasonh 的回答中加分。
对于占据表单 2/3 的面板,您必须将面板的 AutoScroll 属性设置为 true。
这将使面板在控件大小超过用户可见性时显示滚动,并确保较小面板的可见性,即表单高度的 1/3。
【讨论】:
【参考方案8】:您可以通过使用嵌套面板以及锚定和停靠属性的一些设置来获得所需的设计。按照以下步骤操作: 1) 添加表单并在其上放置一个 Panel1。将其 Dock 属性设置为“Fill”,将 ResizeMode 设置为“Grow&Shrink”。 2) 添加第二个 panel2 并将其 Dock 属性设置为“底部”,设置高度并将 Anchor 属性设置为“顶部,左侧”。 3) 添加第三个面板并将其 Dock 属性设置为“无”,设置高度并将 Anchor 属性设置为“上、下、左、右”。
保存并编译。现在所有面板都将通过调整大小保持它们的相对定位。
【讨论】:
以上是关于在 Windows 窗体应用程序上停靠和锚定的主要内容,如果未能解决你的问题,请参考以下文章
Android animateLayoutChanges 和锚定的 fab 闪烁