布局面板

WPF Suite 中的布局面板, 如与 WPF 原有面板名称一致, 则使用方式相同. 拓展的两个布局面板的使用方式也是较符合直觉的.


下面是 WPF Suite 中布局面板的使用说明

StackPanel

堆叠面板, 将子元素排列成垂直或水平的一行.

属性 类型 说明
Orientaion Orientation 元素的布局方向, 默认为垂直方向
Spacing double 面板中各个元素之间的间距, 默认为 0

使用示例

<ws:StackPanel Orientation="Horizontal" Spacing="4">
    <ws:Button Content="Test"/>
    <ws:Button Content="Test"/>
    <ws:Button Content="Test"/>
</ws:StackPanel>

StackPanel 示例效果

WrapPanel

换行面板, 按指定的方向将子元素排列成水平或垂直的一行, 并且在超出面板的边缘处自动换行.

属性 类型 说明
Orientation Orientation 元素的布局方向, 默认为水平方向
ItemWidth double 元素的宽度, 如果值为 NaN, 则是自动宽度, 默认为 NaN
ItemHeight double 元素的高度, 如果值为 NaN, 则是自动高度, 默认为 NaN
HorizontalSpacing double 面板中各个元素之间水平方向上的间距, 默认为 0
VerticalSpacing double 面板中各个元素之间垂直方向上的间距, 默认为 0

使用示例

<ws:WrapPanel Orientation="Horizontal"
              HorizontalSpacing="8"
              VerticalSpacing="4">
    <ws:Button Content="Test"/>
    <ws:Button Content="Test"/>
    <ws:Button Content="Test"/>
    <ws:Button Content="Test"/>
    <ws:Button Content="Test"/>
    <ws:Button Content="Test"/>
    <ws:Button Content="Test"/>
    <ws:Button Content="Test"/>
    <ws:Button Content="Test"/>
    <ws:Button Content="Test"/>
    <ws:Button Content="Test"/>
    <ws:Button Content="Test"/>
    <ws:Button Content="Test"/>
</ws:WrapPanel>

WrapPanel 示例效果

UniformGrid

提供一种在网格(网格中的所有单元格都具有相同的大小)中排列内容的方法.

属性 类型 说明
Columns int 网格中的列数, 默认为 0, 即自适应
Rows int 网格中的行数, 默认为 0 , 即自适应
FirstColumn int 网格在第一行中最开始空出来的单元格数, 默认为 0
HorizontalSpacing double 面板中各个元素之间水平方向上的间距, 默认为 0
VerticalSpacing double 面板中各个元素之间垂直方向上的间距, 默认为 0

使用示例

<ws:UniformGrid HorizontalSpacing="8"
                VerticalSpacing="4">
    <ws:Button Content="Test"/>
    <ws:Button Content="Test"/>
    <ws:Button Content="Test"/>
    <ws:Button Content="Test"/>
    <ws:Button Content="Test"/>
    <ws:Button Content="Test"/>
    <ws:Button Content="Test"/>
    <ws:Button Content="Test"/>
    <ws:Button Content="Test"/>
    <ws:Button Content="Test"/>
</ws:UniformGrid>

UniformGrid 示例效果

RelativePanel

使元素能够相对面板或者其他元素的位置进行布局

附加属性

属性 类型 说明
AlignLeftWithPanel bool 是否将左侧与面板对齐
AlignTopWithPanel bool 是否将上方与面板对齐
AlignRightWithPanel bool 是否将右侧与面板对齐
AlignBottomWithPanel bool 是否将底部与面板对齐
AlignLeftWith UIElement 要与之对齐左侧的目标元素
AlignTopWith UIElement 要与之对齐上方的目标元素
AlignRightWith UIElement 要与之对齐右侧的目标元素
AlignBottomWith UIElement 要与之对齐底部的目标元素
LeftOf UIElement 将当前元素置于哪个元素的左侧(此元素的右侧与目标元素的左侧对齐)
Above UIElement 将当前元素置于哪个元素的上方(此元素的底部与目标元素的上方对齐)
RightOf UIElement 将当前元素置于哪个元素的右侧(此元素的左侧与目标元素的右侧对齐)
Below UIElement 将当前元素置于哪个元素的下方(此元素的上方与目标元素的底部对齐)

使用上述附加属性, 确定某个元素的横向位置与纵向位置, 即可对齐进行布局. 如果同时制定了单个维度的两个方向, 例如左和右, 那么该元素会按照指定的要求进行拉伸.

示例

<ws:RelativePanel VerticalAlignment="Center"
                  HorizontalAlignment="Center">
    <Border x:Name="firstBD"
            ws:RelativePanel.AlignHorizontalCenterWithPanel="True"
            BorderBrush="Red"
            BorderThickness="2"
            Width="50"
            Height="50"/>
    <Border x:Name="secondBD"
            ws:RelativePanel.RightOf="firstBD"
            BorderBrush="Green"
            BorderThickness="2"
            Width="50"
            Height="30"/>
    <Border x:Name="thirdBD" ws:RelativePanel.RightOf="secondBD"
            BorderBrush="#00a2ea"
            BorderThickness="2"
            Width="50"
            Height="60"/>
    <Border x:Name="forthBD"
            ws:RelativePanel.Below="firstBD"
            BorderBrush="#9c4e9a"
            BorderThickness="2"
            Width="60"
            Height="55"/>
    <Border ws:RelativePanel.RightOf="forthBD"
            ws:RelativePanel.Below="thirdBD"
            BorderBrush="#ffca0a"
            BorderThickness="2"
            Width="76"
            Height="55"/>
</ws:RelativePanel>

RelativePanel 示例效果1

FlexPanel

弹性面板, 可以理解为增强的 WrapPanel, 可以指定元素的空间分布与对齐方式.

要理解弹性面板, 需要知道在弹性面板中的两个方向 “主轴” 与 “交叉轴”(或”侧轴”), 当设置面板的方向为行, 即水平时, 主轴就是水平方向, 交叉轴就是另一个方向, 即垂直方向.

关于弹性布局, 请参考: flex 布局的基本概念 - CSS 层叠样式表 MDN

属性 类型 说明
Direction FlexDirection 布局方向, 默认为行, 也就是水平方向
Wrap FlexWrap 换行行为, 默认为不换行
MainAlignment FlexMainAlignment 元素在主轴上的对齐方式, 默认是对齐到开头
CrossAlignment FlexCrossAlignment 内容在交叉轴上的对其方式, 默认是拉伸
ItemsAlignment FlexItemsAlignment 元素自身的对齐方式, 默认是拉伸
UniformGrow double 统一的大小增长系数
UniformShrink double 统一的大小收缩系数
MainSpacing double 元素在主轴上的间距
CrossSpacing double 元素在交叉轴上的间距

附加属性

属性 类型 说明
Order int 元素的排序位置
Grow double 元素自身的大小增长系数
Shrink double 元素自身的大小收缩系数
Basis double 指定自身在主轴上的初始大小

FlexDirection 定义

描述
Row 在行上布局, 也就是水平方向
RowReversed 在行上布局, 但一行内的元素顺序会反过来
Column 在列上布局, 也就是垂直方向
ColumnReversed 在列上布局, 但一行内的元素顺序会反过来

FlexWrap 定义

描述
NoWrap 不换行
Wrap 换行
WrapReverse 换行, 但是行与行之间的顺序会反过来

FlexMainAlignment 定义

描述
Start 对齐元素到行的开头
End 对齐元素到行的结尾
Center 对齐元素到行的中间
SpaceBetween 对齐元素到行的两边
SpaceAround 环绕对齐元素, 行的两侧会留有间距
SpaceEvenly 平分对齐元素, 每个元素两边都会有相同的外间距

FlexCrossAlignment 定义

描述
Start 对齐行到开头
End 对齐行到结尾
Center 对齐行到中间
Stretch 拉伸行的高度, 以填充满整个面板
SpaceBetween 对齐行到两边
SpaceAround 环绕对齐行, 行的两边会留有间距
SpaceEvenly 平分对齐行, 每个元素两边都会有相同的外间距

FlexItemsAlignment 定义

描述
Start 对齐元素到开头
End 对齐元素到结尾
Center 对齐元素到中间
Baseline 对齐元素到基线 (此值无效)
Stretch 拉伸元素的高度, 以填充满整个面板

使用示例, 居中对齐

<Border BorderThickness="1"
        BorderBrush="Gray">
    <ws:FlexPanel MainAlignment="Center"
                  MainSpacing="4">
        <ws:Button Content="Test"/>
        <ws:Button Content="Test"/>
        <ws:Button Content="Test"/>
    </ws:FlexPanel>
</Border>

FlexPanel 示例效果1

使用示例, 两端对齐

<Border BorderThickness="1"
        BorderBrush="Gray">
    <ws:FlexPanel MainAlignment="SpaceBetween"
                  MainSpacing="4">
        <ws:Button Content="Test"/>
        <ws:Button Content="Test"/>
        <ws:Button Content="Test"/>
        <ws:Button Content="Test"/>
    </ws:FlexPanel>
</Border>

FlexPanel 示例效果2

使用示例, 两端对齐, 并使第一个元素占满剩余空间

<Border BorderThickness="1"
        BorderBrush="Gray">
    <ws:FlexPanel MainAlignment="SpaceBetween"
                  MainSpacing="4">
        <ws:Button ws:FlexPanel.Grow="1" Content="Test"/>
        <ws:Button Content="Test"/>
        <ws:Button Content="Test"/>
        <ws:Button Content="Test"/>
    </ws:FlexPanel>
</Border>

FlexPanel 示例效果3

使用示例, 自动换行, 并使每一个元素都尽可能的占满剩余空间

<Border BorderThickness="1"
        BorderBrush="Gray">
    <ws:FlexPanel MainAlignment="SpaceBetween"
                  MainSpacing="4"
                  CrossSpacing="4"
                  UniformGrow="1"
                  Wrap="Wrap">
        <ws:Button Content="Test"/>
        <ws:Button Content="Test"/>
        <ws:Button Content="Test"/>
        <ws:Button Content="Test"/>
        <ws:Button Content="Test"/>
        <ws:Button Content="Test"/>
        <ws:Button Content="Test"/>
        <ws:Button Content="Test"/>
        <ws:Button Content="Test"/>
        <ws:Button Content="Test"/>
        <ws:Button Content="Test"/>
    </ws:FlexPanel>
</Border>

FlexPanel 示例效果4

MasonryPanel

砌筑面板, 简单的瀑布流布局实现.

属性 类型 说明
Orientation Orientation 布局方向, 也就是元素堆叠方向, 默认为垂直
Flows int 流的数量, 默认为 1, 当值为 1 时, 行为与 StackPanel 相同
FlowSpacing 流与流之间的间距, 默认为 0  
ItemSpacing 元素与元素之间的间距, 默认为 0  

使用示例

<Border BorderThickness="1"
        BorderBrush="Gray">
    <ws:MasonryPanel Flows="3"
                     FlowSpacing="4"
                     ItemSpacing="4">
        <Border Background="RosyBrown" Height="60"/>
        <Border Background="AntiqueWhite" Height="50"/>
        <Border Background="Pink" Height="40"/>
        <Border Background="RoyalBlue" Height="65"/>
        <Border Background="CadetBlue" Height="74"/>
        <Border Background="Beige" Height="42"/>
        <Border Background="NavajoWhite" Height="67"/>
        <Border Background="DarkTurquoise" Height="89"/>
        <Border Background="Violet" Height="42"/>
        <Border Background="PaleGoldenrod" Height="54"/>
        <Border Background="Lavender" Height="66"/>
        <Border Background="NavajoWhite" Height="38"/>
    </ws:MasonryPanel>
</Border>

MasonryPanel 示例效果

BoxPanel

盒子面板, 每个成员都占用整个容器的空间.

该面板常用于替换掉 Grid, 如果你只想要多个元素重合在同一个空间中, 用 BoxPanel 可以提升些许性能

使用示例

<Border BorderThickness="1"
        BorderBrush="Gray"
        Height="100">
    <ws:BoxPanel>
        <TextBlock Text="Hello" VerticalAlignment="Top"/>
        <TextBlock Text="World" VerticalAlignment="Bottom"/>
    </ws:BoxPanel>
</Border>

BoxPanel 示例效果