理解WPF布局
在windows forms提供的布局系统中,空间使用硬编码的坐标系统被固定到窗口的某个位置,为了让控件适应窗口的大小,唯一可做的就是设置Anchoring和Docking属性,使其固定到窗体的某个位置
这种方式对于一些简单的布局场合的工作似乎也不错,但是对于一些稍微复杂的场合,比如,按比例分配控件的空间或者是动态用户界面的创建的情形,将很难适应用户界面,。
WPF布局原理
WPF的窗口,在既Windows类,是一个内容控件,该控件派生自ContentControl。内容控件有一个Content属性,该属性有一个限制,只能放置一个用户界面元素,或者是一串字符串,为了在窗口
上放置多个界面控件,通常在窗口上放置一个容器控件。比如,在vs自动生成Windows1.xaml时,会自动创建一个<Grid>元素来放置用户界面。
在WPF应用程序中,内容控件的布局逻辑基于使用的容器控件。一般WPF窗口遵循以下几个原则:
元素不应该指定确定的尺寸大小,通常应该使其大小自动适应的内容,比如,按钮根据所添加的文本来扩展其大小。可以通过设置maximun和minimun尺寸来限制控件可接收的尺寸大小。
元素不应该使用屏幕坐标来指定其位置,通常是基于其尺寸来进行排列其位置
布局容器将在其子元素之间共享其可用空间。通常有容器尝试为其每个子元素分配合适的尺寸。
布局容器允许嵌套。比如,由vs 自动生成的Windows.xaml中,包含一个<Grid>元素,可以在该容器中在放入stackpanel等容器控件形成一个嵌套的布局界面。
建议开发人员严格遵守这些规则,灵活地使用WPF的布局系统将能开发出更灵活、更强大的用户界面。
布局过程
测试尺寸(Measure):该阶段容器将遍历其子元素并且询问它们所需要的最佳尺寸。
排列元素(Arrange):这个核心阶段,容器将在合适的位置放置子元素。
有时,元素并不能获取到合适的尺寸,此时容器将裁剪掉部分元素的可视区域来进行显示,在自定义布局面板时,开发人员通常需要处理这两个阶段。panel抽象基类提供了两个方法。即MeasureOverride和ArrangeOverride
方法,通过重载这两个方法可以编写自定义的布局面板
注意:
布局容器没有提供任何滚动条的支持,如果需要在布局面板中添加滚动支持,需要使用一个专门的内容控件ScrollViewer。
所有WPF的布局容器控件都是派生自抽象基类System.Windows.Controls.Panel,该类具有一些基本的布局成员。在WPF中,有抽象基类panels派生了如下几个布局的面板类。
这个几个面板类是WPF中布局系统的核心,如下
面板名称 | 说明 |
stackpanel | 使用水平或垂直堆叠的方式放置元素,该面板非常简单,但是非常有用,适合于一些小范围的布局 |
WarpPanel | 当水平方向时,从左到右的布局子元素,当可用的宽度不够时,则开始一个新的行在进行从左到右的排列当垂直方向时,从上到下排列子元素,当高度不够时,则开启一个新的列从上到下进行排列。 |
DockPanel | 使子元素依赖于容器的特定边缘,比如左、右、上、下边缘等,该面板通常用于全局布局。比如,在一个Windows上先使用DockPanel划分几个大的区域,然后就可以使用Grid进行详细的布局 |
Grid | Grid是WPF中最强最好用的布局控件。该控件类似于一个不可见的HTML表格,将于元素放置在特定的行和列中。这是最灵活和最通用的布局控件。 |
UniformGrid | 放置子元素在一个不可见的表格中,但是强制所有的单元格都具有相同的尺寸,如果要开发一个五子棋游戏, 可以考虑使用这个控件,但是在用户界面的布局中,使用的比较少 |
Canvas | 使用固定的坐标来绝对定位子元素,这与传统的Windows Forms布局方式类似,但是没有提供Anchoring和Docking特性,在处理图形图像场合,使用这个控件非常有用,但是在动态用户来说,这个控件将会事半功倍 |
Border | 在一个子元素的周围绘制边框、背景。 |