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