在开发复杂的用户界面时,经常需要展示多个控件,例如编辑数据记录时需要展示多个字段。用户可能需要根据内容的多少调整这些编辑控件的大小。虽然可以使用SplitContainer控件来实现这一点,但SplitContainer只能使两个控件可调整大小。为了实现多个编辑控件的可调整大小,可能需要使用多个SplitContainer并将它们嵌套在一起。但这会导致控件结构变得复杂,尤其是当GUI设计发生变化时,调整起来会更加困难。
MultiSplitContainer是一个容器,可以将所有编辑控件放入其中,每个控件都可以调整大小。当然,也可以为某些控件禁用调整大小的功能,例如标签、DateTimePicker等。
在单列或单行模式下,MultiSplitter布局中的所有编辑控件,除了可选的一个带有Dockstyle.Fill的控件外,都会像SplitContainer一样布局,但有更多的面板。
当单列或单行模式关闭时,MultiSplitter的行为就像一个带有可调整大小编辑控件的FlowLayoutPanel。MultiSplitter只支持TopDown或LeftToRight的FlowDirection(不支持BottomUp/RightToLeft)。
在TopDown模式下,还可以调整“扩展”的大小,这意味着所有编辑控件的宽度。这在垂直排列的控件中表现为列宽。
没有分割条。布局尊重编辑控件的Margin属性,在两个控件之间的空间中,MouseMove事件会达到MultiSplitContainer。在这一点上,它检测附近的编辑控件,并将其光标设置为HSplit(垂直调整大小)或VSplit(水平调整大小)。
MultiSplitContainer继承自FlowLayoutPanel。在单列或单行模式下,它会修改编辑控件的宽度/高度,以创建类似停靠的布局。在SingleColumnOrRow.Off模式下,布局完全由基类完成。
FlowLayoutPanel已经实现了IExtenderProvider接口,这使得它可以为其包含的控件添加虚拟“属性”。尽管这些属性是在MultiSplitContainer中实现的,但它们在设计器中显示为包含控件的属性。
总是有两个面板在变化。在SplitContainer中这是显而易见的,但在MultiSplitContainer中有许多“SplitterPanel”,用户无法直接看到当他放大一个时,哪个是会缩小的另一个面板。因此,实现了一个小的Ownerdrawing来标记调整大小时的两个控件。
禁用可调整大小的功能非常简单,只需将控件的最小/最大大小设置为当前大小的值即可。由于在设计器中输入这些值并不舒服,为控件添加了Extender属性“SizeDynamic”,它设置了这些值。
由于编辑控件并没有真正停靠,可以轻松地将它们拖到(或从)其他面板。在真正的停靠场景中,必须先取消停靠,然后才能这样做。
编译项目并将MultisplitContainer拖到表单上。将一些编辑控件拖到它上面,文本框(多行开启或关闭)、组合框、标签(自动调整大小开启或关闭)。
Margin, IsFilling, SizeDynamic
TopDown, Expansion, SingleColumnOrRow, AutoScroll, AutoSize, Dock
嗯,必须承认:示例应用程序并不是真正的美观。但它展示了一些功能:
FlowDirection.LeftToRight (MultisplitContainer.TopDown=False),这对于显示一行控件很有用,如带有Multiline.Off的文本框、组合框、DateTimePicker。Multisplitter是docked.Top与AutoSize.True。控件会自动布局在3行中,当表单扩大宽度时,MultisplitContainer会缩小其高度,以便2行控件就足够了。这是典型的FlowLayoutPanel行为。
MultisplitContainer.TopDown=True。在这种模式下,也可以显示多行控件,并在垂直方向上调整它们的大小。也可以在水平方向上调整它们的大小,但如果这样做,每个控件都会增长/缩小 - 这就像垂直流布局中的列宽。称这个属性为“扩展”,因为当TopDown=False时,它的作用是相应的。
MultisplitContainer.SingleColumnOrRow设置为True。并且设置了一个编辑控件为“FillingControl”。现在它的行为非常类似于SplitContainer。所有空间都被填充,如果调整一个控件的大小,FillingControl会补偿增长/缩小,以便所有控件在不使用滚动条的情况下保持在视图中。
如果没有设置FillingControl,控件可以增长得比MultisplitContainer大,并且会出现垂直滚动条。
正如看到的,几乎每个编辑控件都需要一个标题标签才能有意义。在示例应用程序中,通过将标题标签和编辑控件一起放在一个小面板上来帮助自己,标签停靠在左侧,编辑控件停靠填充。这仍然有点难以理解。应该创建一个“CaptionPanel”,它提供一个标题,并可以接收一个编辑控件,并且它会在剩余空间中自动居中布局编辑控件。