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