名称 说明
Canvas 使用固定坐标绝对定位元素
StackPanel 在水平或竖直方向放置元素
DockPanel 根据外部容器边界,自动调整元素
WrapPanel 在可换行的行中放置元素
Grid 根据不可见的表格在行和列中排列元素,最常用
UniformGid 在不可见的相同尺寸的表格中放置元素
ScrollViewer 滚动条,页面元素超出父控件区域的情况使用
Viewbox 内容修饰器,方便拉伸和缩放

1、Canvas布局

<Canvas>
<Rectangle Canvas.Left="50" Canvas.Top="50" Width="50" Height="50" Fill="Red" />
<Rectangle Canvas.Left="120" Canvas.Top="50" Width="50" Height="50" Fill="Yellow" />
<Rectangle Canvas.Left="190" Canvas.Top="50" Width="50" Height="50" Fill="Green" /> <Rectangle Canvas.Left="50" Canvas.Top="150" Width="50" Height="50" Fill="Red" Panel.ZIndex="2"/>
<Rectangle Canvas.Left="75" Canvas.Top="170" Width="50" Height="50" Fill="Yellow" Panel.ZIndex="1" />
<Rectangle Canvas.Left="100" Canvas.Top="190" Width="50" Height="50" Fill="Green" Panel.ZIndex="1"/>
</Canvas>

通过 Canvas.Left、Canvas.Top、Canvas.Right、Canvas.Bottom设置控件显示位置,通过Panel.ZIndex设置显示优先层级。

Canvas的强大之处,当然不仅仅只是简单显示。

<Canvas>
<Canvas.Resources>
<PathGeometry x:Key="path" Figures="M 10,100 C 35,0 135,0 160,100 180,190 285,200 310,100" />
<Storyboard x:Key="pathStoryboard">
<MatrixAnimationUsingPath
DoesRotateWithTangent="True"
PathGeometry="{StaticResource path}"
RepeatBehavior="Forever"
Storyboard.TargetName="ButtonMatrixTransform"
Storyboard.TargetProperty="Matrix"
Duration="0:0:5" />
</Storyboard>
</Canvas.Resources> <Canvas.Triggers>
<EventTrigger RoutedEvent="Control.Loaded">
<BeginStoryboard Storyboard="{StaticResource pathStoryboard}" />
</EventTrigger>
</Canvas.Triggers> <Path
Data="{StaticResource path}"
Stroke="Black"
StrokeThickness="1" /> <Ellipse
Width="20"
Height="20"
Fill="Red">
<Ellipse.RenderTransform>
<MatrixTransform x:Name="ButtonMatrixTransform" />
</Ellipse.RenderTransform>
</Ellipse>
</Canvas>

使用Canvas可以让小球沿着path路径运行,若使用其他布局控件,则会出现定位问题。在对显示位置有精确要求的地方,可以考虑使用Canvas布局。比如这种显示报表。

2、StackPanel布局

<StackPanel Orientation="Vertical">
<Rectangle Margin="5" Width="50" Height="50" Fill="Red" />
<Rectangle Margin="5" Width="50" Height="50" Fill="Yellow" />
<Rectangle Margin="5" Width="50" Height="50" Fill="Green" />
<TextBlock Margin="5" Text="Orientation=&quot;Vertical&quot;" HorizontalAlignment="Center"></TextBlock>
</StackPanel>
<StackPanel Orientation="Horizontal">
<Rectangle Margin="5" Width="50" Height="50" Fill="Red" />
<Rectangle Margin="5" Width="50" Height="50" Fill="Yellow" />
<Rectangle Margin="5" Width="50" Height="50" Fill="Green" />
<TextBlock Margin="5" Text="Orientation=&quot;Vertical&quot;" VerticalAlignment="Center"></TextBlock>
</StackPanel>

StackPanel面板控件有定义附加属性,通过Orientation可以控制布局是左右还是上下分布,FlowDirection属性可以调整显示左右,即从左至右,或从右至左。

StackPanel内部控件,可以通过VerticalAlignment、HorizontalAlignment、Margin来控制显示位置。

一般使用在布局几个关联性较强的控件之间(个人使用习惯,欢迎指正),如页面顶部导航条中多个图标按钮分布、文本输入时TextBlock(标题)+TextBox(内容)的组合等等。

3、DockPanel布局

<DockPanel>
<Button Content="Left" DockPanel.Dock="Left" />
<Button Content="Top" DockPanel.Dock="Top" />
<Button Content="Right" DockPanel.Dock="Right" />
<Button Content="Bottom" DockPanel.Dock="Bottom" />
<Button Content="Nomal" />
</DockPanel>

<DockPanel LastChildFill="False">
<Button Content="Left" DockPanel.Dock="Left" />
<Button Content="Top" DockPanel.Dock="Top" />
<Button Content="Right" DockPanel.Dock="Right" />
<Button Content="Bottom" DockPanel.Dock="Bottom" />
<Button Content="不填充" />
</DockPanel>

DockPanel通过附加属性DockPanel.Dock控制内容停靠上下左右方向上,最后一个通过LastChildFill控制是否填充剩余空间(默认填充)。

DockPanel在生产用软件中有这个不错的使用场景,类似VS的停靠。对于工业生产软件多个流程模块的调用和隐藏比较适用。

4、WrapPanel布局

<WrapPanel Orientation="Vertical">
<Rectangle Margin="5" Width="50" Height="50" Fill="Red" />
<Rectangle Margin="5" Width="50" Height="50" Fill="Yellow" />
<Rectangle Margin="5" Width="50" Height="50" Fill="Green" />
<Rectangle Margin="5" Width="50" Height="50" Fill="Red" />
<Rectangle Margin="5" Width="50" Height="50" Fill="Yellow" />
<Rectangle Margin="5" Width="50" Height="50" Fill="Green" />
<Rectangle Margin="5" Width="50" Height="50" Fill="Red" />
<Rectangle Margin="5" Width="50" Height="50" Fill="Yellow" />
</WrapPanel>

<WrapPanel>
<Rectangle Margin="5" Width="50" Height="50" Fill="Red" />
<Rectangle Margin="5" Width="50" Height="50" Fill="Yellow" />
<Rectangle Margin="5" Width="50" Height="50" Fill="Green" />
<Rectangle Margin="5" Width="50" Height="50" Fill="Red" />
<Rectangle Margin="5" Width="50" Height="50" Fill="Yellow" />
<Rectangle Margin="5" Width="50" Height="50" Fill="Green" />
<Rectangle Margin="5" Width="50" Height="50" Fill="Red" />
<Rectangle Margin="5" Width="50" Height="50" Fill="Yellow" />
</WrapPanel>

WrapPanel可以根据所在容器大小,自动换行显示,类似windows 文件管理平铺时的效果。

WrapPanel是最常用作Items控件的项目面板。在ListBox显示方式不满足需求的情况下,可以定义如下样式:

<ListBox>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>

5、Grid布局

<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="60"></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition MaxWidth="60"></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<Border Grid.Row="0" Grid.Column="0" Background="Red"/>
<Border Grid.Row="0" Grid.Column="1" Background="Yellow"/>
<Border Grid.Row="0" Grid.Column="2" Background="Green"/>
<Border Grid.Row="1" Grid.ColumnSpan="2" Grid.Column="0" Background="Beige"/>
</Grid>

Grid是最常用的一种布局面板,通过Grid.RowDefinitions设置行数量,通过Grid.ColumnDefinitions设置列数量。元素通过Grid.Row和Grid.Column列定位到指定行列单元格中,也可以通过Grid.RowSpan和Grid.ColumnSpan显示在多个单元格中。

Grid的行列宽高是可以随意设置的,可以直接设置数值Width="100"、设置自适应Width="Auto"、设置比例Width="1*",再通过MinWidth,MaxWidth等控制行列高度宽度灵活显示。

第一种,固定长度——宽度不够,会裁剪,不好用。单位pixel。 
第二种,自动长度——自动匹配列中最长元素的宽度。 
第三种,比例长度——*表示占用剩余的全部宽度;两行都是*,将平分剩余宽度;像上面的一个2*,一个*,表示前者2/3宽度

Grid可以通过ShowGridLines属性显示分割线。

6、UniformGrid布局

<UniformGrid Columns="2" Rows="2">
<Border Background="Red"/>
<Border Background="Yellow"/>
<Border Background="Green"/>
<Border Background="Beige"/>
</UniformGrid>

UniformGrid可以通过Columns和Rows来设置列行数,每个单元格的大小是固定的,也无法指定直接显示到某个单元格。在不设置行列数时,会根据其中元素的数量,自动分配行列显示。

一般在设计UI显示比较明确时,可以通过UniformGrid快速布局。

7、ScrollViewer布局

<ScrollViewer>
<StackPanel HorizontalAlignment="Left" VerticalAlignment="Top">
<TextBlock Text="必要时显示滚动,拖动窗口大小查看效果。" TextWrapping="Wrap" Margin="0,0,0,20"></TextBlock>
<Rectangle Fill="Red" Width="500" Height="500"></Rectangle>
</StackPanel>
</ScrollViewer>

当ScrollViewer内容元素在比其实际大小较小的区域的区域中显示时,滚动条出现,可以通过滚动查看。

若ScrollViewer内容太多,滚动可能会发生卡顿。可以设置IsDeferredScrollingEnabled属性,拖动结束后,刷新Thumb内容。

ListBox、ListView、DataGrid等表单控件中都内置了ScrollViewer,可以通过自定义ControlTemplate来完成样式滚动样式修改。

8、ViewBox布局

<Viewbox>
<StackPanel HorizontalAlignment="Left" VerticalAlignment="Top">
<TextBlock
Margin="0,0,0,20"
Text="必要时显示滚动,拖动窗口大小查看效果。"
TextWrapping="Wrap" />
<Rectangle
Width="500"
Height="500"
Fill="Red" />
</StackPanel>
</Viewbox>

在需要做到控件以及控件文字都做到自适应伸缩时,ViewBox是一个比较好的选择。窗口大小或者分辨率改变,里面的控件和字体大小都会自适应改变。

WPF知识点全攻略04- XAML页面布局的更多相关文章

  1. WPF知识点全攻略00- 目录

    知识点目录如下: 1.WPF相对WinFrom的优缺点 2.WPF体系结构 3.XAML 4.XAML页面布局 5.XAML内容控件 6.WPF中的“树” 7.Binding 8.依赖属性 9.附加属 ...

  2. WPF知识点全攻略03- XAML

    XAML 是一种声明性标记语言,XAML 是一种基于 XML 并对 XML 结构规则进行了扩展. XAML特点: 定义应用程序的界面元素 显示的声明WPF资源(样式.模板.动画等) 可扩展性(自定义U ...

  3. WPF知识点全攻略10- 路由事件

    路由事件是WPF不得不提,不得不会系列又一 先来看一下他的定义: 功能定义:路由事件是一种可以针对元素树中的多个侦听器(而不是仅针对引发该事件的对象)调用处理程序的事件. 实现定义:路由事件是一个 C ...

  4. WPF知识点全攻略09- 附加属性

    附加属性也是一种特殊的依赖属性. Canvas中的Canvas.Left,Canvas.Top ,DockPanel中DockPanel.Dock等就是附加属性. 更加.NET类属性的写法经验.这个中 ...

  5. WPF知识点全攻略07- 数据绑定(Binding)

    数据绑定是WPF不得不提,不得不会系列之一 数据绑定简言之,就是把数据源的数据绑定到目标对象的属性上.目标对象可以是承自DependencyProperty的任何可访问的属性或控件,目标属性必须为依赖 ...

  6. WPF知识点全攻略06- WPF逻辑树(Logical Tree)和可视树(Visual Tree)

    介绍概念之前,先来分析一段代码: xaml代码如下: <Window x:Class="WpfApp1.MainWindow" xmlns="http://sche ...

  7. WPF知识点全攻略08- 依赖属性

    依赖属性是WPF不得不提,不得不会系列又一 先来看一下,自定义依赖属性的写法 public static readonly DependencyProperty IconProperty = Depe ...

  8. WPF知识点全攻略05- XAML内容控件

    此处简单列举出布局控件外,其他常用的控件: Window:WPF窗口 UserControl:用户控件 Page:页 Frame:用来浏览Page页 Border:嵌套控件,提供边框和背景. Butt ...

  9. WPF知识点全攻略02- WPF体系结构

    WPF体系结构图: PersentationFramework.dll包含WPF顶层的类型,包括哪些表示窗口.面板以及其他类型控件的类型.他还实现了高层编程抽象,如样式.开发人员直接使用的大部分类都来 ...

随机推荐

  1. 3-6局部变量的存储方式 & 3-7字符型字面值

    基础数据类型变量的存储 重点介绍方法级的变量,局势局部变量 存储中怎么存储呢? int n=100; 在栈中开辟内存存储空间. n是内存空间的别名 3-7字符型字面值 单引号不能丢,必须是英文状态. ...

  2. HTML学习笔记(三)样式CSS

    1.样式 外部样式表(通过css文件定义样式,整体样式) 当样式需要被应用到很多页面的时候,使用外部样式表,在 head 部分<link>. <head> <link r ...

  3. js点击复制某段文本方法

    百度很多说这个方法 window.clipboardData.setData ("Text", "demo"); 实践证明只有ie支持. 改成下面这个方式来复制 ...

  4. gSoap学习笔记

    http://www.cnblogs.com/xiangism/archive/2012/11/14/2770242.html http://www.cnblogs.com/lvkun/archive ...

  5. atcoder#073D(枚舉)

    題目鏈接: http://arc073.contest.atcoder.jp/tasks/arc073_b 題意: 給出n, m兩個數, n是物品數目, m是背包容量, 接下來n行輸入, wi, vi ...

  6. UITableView以及cell属性

    在ios的UI中UITableView是个常用且强大的控件 基本使用: 1>设置代理,一般把控制器设为代理:self.tableView.delegate = self; 2>遵守代理的协 ...

  7. 密码破解工具John the Ripper使用说明

    John the Ripper John 包描述 John the Ripper 既功能丰富又运行快速. 它在一个程序中结合了几种破解模式,并且可以根据您的特定需求进行全面地配置(你甚至可以使用支持C ...

  8. assembly x86(nasm)串比较

    预留字符串口令,输入口令串与预留密码串比较.若匹配则显示“MATCH!CONGRATULATION”,否则显示“NOMATCH!”,并让用户重新输入,程序能对口令进行测试,但测试次数最多3次,若3次输 ...

  9. UVA297:Quadtrees(四分树)

    题目描述 四象树是每个内结点均有4个子结点的特殊四叉树,它可用于描述平面上黑白图像.平面上的黑白图像是32行×32列的正方形,每个格子称为1个象素,是最小的图像单位.正方形图像可分成四个相等的小正方形 ...

  10. python入门之实例-验证码

    需求: 随机生成6位的验证码,要求有字母和数字 import random temp = "" for i in range(6): j = random.randrange(0, ...