WPF 入门《布局面板》
常见的几个布局面板
1.StackPanel面板
StackPanel面板能够简单根据单行或者单列进行元素排列, StackPanel 默认的布局方向为垂直方向(Vertical), 由Orientation属性控制。
Orientation属性:
用户控制布局方向是垂直还是横向排列。分别有两个值可选:Vertical、Horizontal
示例代码:
<StackPanel Orientation="Vertical">
<Button>button1</Button>
<Button>button2</Button>
<Button>button3</Button>
</StackPanel>
效果图(如上面所述 StackPanel面板Orientation属性默认为Vertical):
设置 Orientation="Horizontal" 时, 控件布局方向则为横向, 效果图。
默认情况下, StackPanel面板中的元素都会根据StackPanel的大小而改变, StackPanel面板指定了Width和Height值。
布局属性:
VerticalAlignment | 当垂直方向有额外的空间, 可以选择Top、Center、Bottom、Stretch进行设置布局 |
HorizontalAlignment | 当水平方向有额外的空间, 可以选择Center、Left、Right、Stretcj进行设置布局 |
Margin |
相对控件的4个边、设置边距,可以单独设置各个边距,也可以统一设置一个边距 类似:Margin="1 2 3 4" 或 Margin="1" |
【VerticalAlignment/HorizontalAlignment】属性:
为了能够看到效果, 通常预留控件额外的空间, 示例, 默认的StackPanel面板中添加几组按钮, 剩下的白色区域为额外的空间。
这个时候, 针对StackPanel面板设置VerticalAlignment属性为Center, 此时所有的子元素被居中显示,额外的空间被均分。
注: 而Bottom、Top、Stretch 则分别表示整体元素居下,居上、整体伸展。
默认情况下, StackPanel面板的VerticalAlignment、HorizontalAlignment 默认属性均为 Stretch
<!-- StackPanel -->
<StackPanel VerticalAlignment="Center">
<Button>button1</Button>
<Button>button2</Button>
<Button>button3</Button>
</StackPanel>
效果图:
Margin(边距)属性:
正如前人书中所说, 一个设计良好窗口不止是包含元素、还应当在元素之间包含一定的额外空间。所以这个时候Margin属性派上用场。
以上的示例图中, 均没有设置Margin属性, 所以会看到的是, 每个元素之间都紧贴。
··
当设置边距时, 可以统一设置元素所有边的距离, 如下所示:
<!-- StackPanel -->
<StackPanel>
<Button Margin="3">button1</Button>
<Button Margin="3">button2</Button>
<Button Margin="3">button3</Button>
</StackPanel>
另外一种,则是分别对元素的边: 左、上、右、下的顺序设置边距, 如下所示:
<!-- StackPanel -->
<StackPanel>
<Button Margin="3 6 3 3">button1</Button>
<Button Margin="3">button2</Button>
<Button Margin="3">button3</Button>
</StackPanel>
2.WarpPanel面板
与StackPanel面板类型, WarpPanel面板也是以行或列的形式进行元素排列, 默认情况下, WarpPanel面板的Orientation属性则为Horizontal,元素以横向进行排列。
注意:与StackPanel面板不同的是, WarpPanel默认情况下, 所有元素均不会被拉伸。这里要强调的一点: StackPanel中, 元素会根据Orientation属性进行拉伸,
1.当Orientation="Horizontal"时, 元素被垂直拉伸
2.当Orientation="Vertical"时, 元素被水平拉伸
示例图:
同样的, WarpPanel面板具备StackPanel的属性。区别则在于上面的不同。
3.DockPanel面板
用过winform的小伙伴应该都知道, 在winform中, 几乎所有的空间都具备Dock停靠属性, 可以针对元素进行单独设置Dock定位。然而在WPF中, 这点显然是不具备的。
所以对于灵活的WPF来说, DockPanel面板具备了这个能力。凡是包含在DockPanel面板中的子元素, 都会具备Dock附加属性。
下图所示, 对DockPanel进行简单的添加元素设置Dock属性:
示例代码:
<DockPanel>
<Button DockPanel.Dock="Top">button1</Button>
<Button DockPanel.Dock="Right" >button2</Button>
<Button DockPanel.Dock="Left">button3</Button>
</DockPanel>
注意:DockPanel 的 LastChildFill 属性, 主要用于设置DockPanel中最后一个元素的会具备填充效果。如上图的button3元素
LastChildFill 字面意思则可以理解, 最后一个元素是否填充。通过设置true/false,
效果图(LastChildFill="false") :
<DockPanel LastChildFill="False">
<Button DockPanel.Dock="Top">button1</Button>
<Button DockPanel.Dock="Right" >button2</Button>
<Button DockPanel.Dock="Left">button3</Button>
</DockPanel>
4.Grid面板
Grid面板类型HTML中的table表格, 为了能够让元素或内容按照规定的位置排列, 首先得定义足够得行和列。
注意: Grid中定义得Row与Column属性默认在元素中都是从0开始索引, 在下面示例中,为了演示都进行了添加(如果在程序中,位置已经确定, 可以默认不加)。
定义行与列( RowDefinitions/ColumnDefinitions)
<Grid>
<!-- 下面分别定义了2行 2列 -->
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
</Grid>
添加元素:
下面为Grid定义得2行2列基础上添加4个按钮, 下图所示:
代码所示:
<Grid>
<!-- 下面分别定义了2行 2列 -->
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions> <Button Grid.Column="0" Grid.Row="0">左上</Button>
<Button Grid.Column="1" Grid.Row="0">右上</Button>
<Button Grid.Column="0" Grid.Row="1">左下</Button>
<Button Grid.Column="1" Grid.Row="1">右下</Button>
</Grid>
注意: 尽管一个单元格中, 允许放置多个元素, 通常来说这没有什么意义。如上所示, 每个元素都明确了对应单元格中。
Grid与WarpPanel和StackPanel面板等容器不同得区别在于, Grid需要显式定义行与列来放置元素。而相对于其他容器,则会隐式创建行与列。
调整行和列:
Grid面板支持3种设置尺寸的方式:
硬编码尺寸 | width="xxx" / height="xxx" |
自动设置尺寸 | width="auto" / height="auto" |
按比例设置尺寸 | width="*" / height="2*" |
例如, 下面的代码演示了三种设置尺寸的方式:
<Grid>
<!-- 下面分别定义了2行 2列 -->
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="100"/>
</Grid.RowDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="2*"/>
</Grid.ColumnDefinitions> <Button Grid.Column="0" Grid.Row="0">左上</Button>
<Button Grid.Column="1" Grid.Row="0">右上</Button>
<Button Grid.Column="0" Grid.Row="1">左下</Button>
<Button Grid.Column="1" Grid.Row="1">右下</Button>
</Grid>
实际的显示效果可以看到, 第一列width=" * " 为第二列的1/2, 第一行设置的自适应高度, 而第二行则是硬编码的高度 100
注意: 当使用Grid进行按比例设置列或者行时, 如果Grid宽度为奇数像素, 那么被分割的行列像素带小数, 当改列包含形状元素、边框、图像, 那么显示内容可能是模糊的,
如果这个问题影响布局, 则只需要将Grid的 UseLayoutRounding属性设置为True即可。
跨行与跨列:
处于Grid中的任意元素, 都具有两个附加属性, 分别为 RowSpan与 ColumnSpan。像这种跨行跨列在web应用中十分常见。
下面的示例中演示了如何针对元素进行跨列显示:
5.UniformGrid面板
与Grid相反, UniformGrid并不遵循Grid的众多原则, 无论是显式声明行和列, 还有其附加属性。反而, 通过简单的设置
Rows和Columns属性来设定其尺寸。每个单元格都被均匀分配, 关键一点, 所有元素最后都根据其定义的先后顺序放置在
单元格中。
示例代码如下:
<UniformGrid Rows="2" Columns="2">
<Button>button1</Button>
<Button>button2</Button>
<Button>button3</Button>
<Button>button4</Button>
</UniformGrid>
6.Canvas面板
Canvas面板允许使用精准的坐标放置元素, 为了在Canvas面板中定位一个元素, 需要设置Canvas.Left 和 Canvas.Top属性。
Code:通过设置元素的附加属性 Canvas.Left 、Top、Right、Bottom 等进行元素定位
<Canvas>
<Button Canvas.Left="100" Canvas.Top="50">button1</Button>
<Button Canvas.Left="100" Canvas.Top="80">button2</Button>
</Canvas>
WPF 入门《布局面板》的更多相关文章
- WPF入门教程系列六——布局介绍与Canvas(一)
从这篇文章开始是对WPF中的界面如何布局做一个较简单的介绍,大家都知道:UI是做好一个软件很重要的因素,如果没有一个漂亮的UI,功能做的再好也无法吸引很多用户使用,而且没有漂亮的界面,那么普通用户会感 ...
- 三、WPF入门教程——布局和常用Panel学习
布局和常用Panel学习 一.简介 所有的WPF布局容器都派生自System.Windows.Controls.Panel.Panel继承自FrameworkElement. 在Panel中有一个比较 ...
- WPF入门教程系列七——布局之WrapPanel与StackPanel(二)
三. WrapPanel WrapPanel布局面板将各个控件从左至右按照行或列的顺序罗列,当长度或高度不够是就会自动调整进行换行,后续排序按照从上至下或从右至左的顺序进行. Orientation— ...
- WPF入门教程系列一
WPF入门教程 一. 前言 公司项目基于WPF开发,最近项目上线有点空闲时间写一篇基于wpf的基础教材,WPF也是近期才接触,学习WPF也是在网上查资料与微软的MSDN进行学习,写本博客的目为了温 ...
- WPF入门:数据绑定
上一篇我们将XAML大概做了个了解 ,这篇将继续学习WPF数据绑定的相关内容 数据源与控件的Binding Binding作为数据传送UI的通道,通过INotityPropertyChanged接口的 ...
- WPF入门教程系列二十三——DataGrid示例(三)
DataGrid的选择模式 默认情况下,DataGrid 的选择模式为“全行选择”,并且可以同时选择多行(如下图所示),我们可以通过SelectionMode 和SelectionUnit 属性来修改 ...
- WPF入门教程系列十九——ListView示例(一)
经过前面的学习,今天我做一个比较综合的WPF程序示例,主要包括以下功能: 1) 查询功能.从数据库(本地数据库(local)/Test中的S_City表中读取城市信息数据,然后展示到WPF的Windo ...
- WPF入门教程系列十三——依赖属性(三)
四. 只读依赖属性 在以前在对于非WPF的功能来说,对于类的属性的封装中,经常会对那些希望暴露给外界只读操作的字段封装成只读属性,同样在WPF中也提供了只读属性的概念,如一些 WPF控件的依赖属性是只 ...
- WPF入门教程系列(一) 创建你的第一个WPF项目
WPF入门教程系列(一) 创建你的第一个WPF项目 WPF基础知识 快速学习绝不是从零学起的,良好的基础是快速入手的关键,下面先为大家摞列以下自己总结的学习WPF的几点基础知识: 1) C#基础语法知 ...
随机推荐
- Android - TextureView, SurfaceView和GLSurfaceView 以及 SurfaceTexture
这几个概念比较绕, 又比较相近. 初看比较糊涂, 把握关键点就好. 关键字 View SurfaceViewGLSurfaceViewTextureView这三个后缀都是View, 所以这三个东西都是 ...
- poj--2391--Ombrophobic Bovines(floyd+二分+最大流拆点)
Ombrophobic Bovines Time Limit: 1000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u ...
- poj--1637--Sightseeing tour(网络流,最大流判断混合图是否存在欧拉图)
Sightseeing tour Time Limit: 1000MS Memory Limit: 10000KB 64bit IO Format: %I64d & %I64u Sub ...
- 携手互联网企业10巨头设VC基金
包括小米科技.盛大集团.人人网.掌趣科技.游族网络.龙图游戏.蓝港互动.37游戏.星辉互动娱乐.博雅互动等10家知名互联网企业作为出资人(LP)的优格创投基金近日正式成立. 众所周知,伴随着移动互联网 ...
- OpenGL常见错误之——glut.h文件的函数无法正常连接
glut.h文件的函数无法正常连接,典型的错误如下:------ 已启动生成: 项目: gears, 配置: Debug Win32 ------1>正在链接...1>GEARS.obj ...
- request.getSession().getServletContext().getRealPath("")获取工程目录 路径修改
使用request.getSession().getServletContext().getRealPath("")获取工程目录. 设置server Locations在serve ...
- HttpClient方式调用接口的java 简单案例源码+附jar包
1 package com.itNoob.httpClient; import org.apache.commons.httpclient.HttpClient; import org.apache. ...
- 【Uva 1629】 Cake slicing
[Link]: [Description] 给你一个n*m的格子; 然后里面零零散散地放着葡萄 让你把它切成若干个小矩形方格 使得每个小矩形方格都恰好包含有一个葡萄. 要求切的长度最短; 问最短的切割 ...
- RTSP、HTTP、HTTPS、SDP四种协议详解
我们将主要讲解RTSP,HTTP,HTTPS, SDP四种协议. 一:RTSP协议简介 实时流协议RTSP是一个应用层协议,用于控制具有实时特性的数据(例如多媒体流)的传送. RTSP协议一般与RT ...
- js数组sort方法详解
在处理数组的时候,我们有时候需要对数组进行排序,排序的方法有很多种,但是最好最快的就是利用sort方法进行快速的排序. 我们来看一个例子: var arr1 = [6, 3, 4, 1, 2, 5, ...