我如何在 C#/WinForms 中设计一个 UI,它恰好包含几种不同的控件类型,这样如果用户调整窗口大小,只有 ListView 控件会调整大小?
5 回答
有两种主要方法可以使控件根据父容器的大小更改自动调整大小(在您的情况下为 Form):
- 将控件的 Dock 属性设置为 DockStyle.Fill。
- 将 Anchor 属性设置为“上、下、左、右”
将 Dock 属性与 Dock.Fill 一起使用
此方法的优点是它获取整个控件并告诉它始终填充父容器的整个客户区(在您的情况下,表单客户区)。如果你想做一些事情,比如用 ListControl 或 TreeView 或类似的东西填充表单,这很有用。但是,如果您想在使用其他控件的同时缩放单个控件(正如您所指示的那样),它就没有那么有用了。在这种情况下,您需要将这些其他控件上的 Dock 属性设置为 DockStyle.Top 或 DockStyle.Bottom 以使它们浮动在主调整大小控件的上方或下方。
这很麻烦,而且还限制了其他控件的布局选项。您可以通过停靠两个面板控件来缓解该问题,一个在顶部,另一个在窗体底部。这些面板将保持在固定位置,而中间区域(使用 DockStyle.Fill 控件)随父窗体缩放。然后,您可以在这些“页眉”和“页脚”面板中的任何布局配置中放置任何控件。
这种使用停靠面板的复合形式构建非常强大。坦率地说,当他们在 .NET 1.0 WinForms 中引入此功能时,.NET 改变了游戏规则。
将 Anchor 属性与“上、下、左、右”一起使用
如果您只想在表单比例上拥有一个控件,而其他控件则“卡在”边缘,请使用 Anchor 属性。对于要保持在顶部的控件,请将 Anchor 属性设置为“Top, Left”(默认值)。对于要留在底部的控件,请将 Anchor 属性设置为“Bottom, Left”。对于您希望通过窗体/对话框增加宽度的控件(例如单行文本框控件),将 Anchor 属性设置为“左、右”(并根据您是否希望它作为顶部移动来设置顶部或底部或对话框底部发生变化。
如果您希望控件使用窗体在各个方向调整大小,请将 Anchor 属性设置为“上、左、下、右”。对于“主控件”类型的东西非常有用,例如占主导地位的列表框、树形控件或多行文本框。
对于您需要的东西,不要乱用 AutoSize 或 AutoSizeMode ......这些属性控制控件如何根据自己的内容更改大小,而不是如何根据容器的行为调整大小。将 AutoSize/AutoSize 模式视为向内看,而 Anchor/Dock 则是向外看。如果同时使用这两种尺寸调整方法,您会得到一些非常奇怪的行为。一般没用。
将 ListView 停靠在窗体的所有四个边上,并将其他控件停靠在 2 个或更少。
控件上有一个名为“Anchor”的属性(在“布局”类别中),如果将其设置为“上、下、左、右”,它将保持控件与其父容器之间的边距,从而使其随着容器大小的变化而调整大小。
但是,如果仅启用了沿一个轴的锚点之一(例如“左”,而不是“右”),它将再次移动控件,从而保持控件与其容器之间的锁定边距。
简而言之:正如詹姆斯所说,除了它是“锚”而不是“码头”属性。Dock 类似但不完全相同。
如果我们在表单中有多个控件怎么办?
例如:如果一个表格用于在网格中生成一些结果,这些结果与在几个文本框或组合框等中输入的数据有关;我们希望它们相应地调整大小/重新对齐,而不是相互重叠(就像使用停靠填充时发生的那样),尤其是在上下文中使用网格视图或类似控件时。
如果将 ListView 放在 SplitContainer 的一个面板中,并将其余控件放在另一个面板中,则可以通过设置 min 和 maxsize 来限制第二个面板的增长。
如果您的 ListView 停靠为 Full ,那么在调整表单大小时它将占用所有增量。