布局原则

WPF窗口只能包含单个元素。如果要放置多个元素,需要放置一个容器,然后在容器中添加元素。

  • 不应显示的设定元素的尺寸
  • 不应该使用屏幕坐标指定元素的位置
  • 布局容器的子元素”共享“可用的空间
  • 可嵌套的布局容器

前两个是为了使得WPF程序更加灵活,在不同的设备上能灵活适应,能处理动态内容。

总的目标都是为了创建更好更灵活的用户界面。

StackPanel面板

简单地在单行或单列中以堆栈方式放置其子元素。

默认按照自上而下地顺序排列元素。通过设置Orientation属性,可以更改排列方式。水平:Horizontal。

布局属性

名称 说明
HorizontalAlignment 水平方向定位
VerticalAlignment 垂直方向上定位
Margin 四周空间
MinWidth和MinHeight 最小尺寸
MaxWidth和MaxHeight 最大尺寸
Width和Height 显示设置尺寸

这些属性从FrameworkElement基类继承而来。

Border控件

包含一段嵌套内容(布局面板)。为其添加背景或在其周围添加边框。

名称 说明
Background 背景
BorderBrush和BorderThickness 边框颜色和边框宽度
CornerRadius 圆角。值越大,圆角效果越明显
Padding 在边框和内部的内容间添加空间

WrapPanel

在可能的空间中,以一次一行或一列的方式布局控件。

WrapPanel.Orientation属性设置为:

Horizontal:空间从左向右进行排列,再在下一行中排列。

Vertical:在多列中放置元素

DockPanel

沿着一条外边缘来拉伸所包含的控件。

可以通过Dock附加属性来设置子元素停靠的边。属性又Left、Right、Top和Bottom。

<DockPanel LastChildFill="True">
<Button DockPanel.Dock="Top">Top Button</Button>
</DockPanel>

LastChildFill属性:是否将最后一个元素占满剩余的空间

Grid面板

WPF中功能最强大的布局容器。

创建步骤

  1. 选择希望使用的行和列的数量。

  2. 为每个包含的元素指定恰当的行和列。

    创建两行三列

<Grid ShowGridLines="True">
<Grid.RowDefinitions> <!--描述行-->
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions> <Grid.ColumnDefinitions> <!--描述列-->
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
</Grid>

为在单元格中放置各个元素,需要使用Row和Column附加属性。这两个属性值都是从0开始的,和数组下标一样。

    <Grid ShowGridLines="True">
<Grid.RowDefinitions> <!--描述行-->
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions> <Grid.ColumnDefinitions> <!--描述列-->
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions> <Border Grid.Row="1" Grid.Column="0" Margin="5" Padding="5" Background="LightBlue" BorderBrush="SteelBlue" BorderThickness="3,5,3,5"
CornerRadius="3">
<StackPanel Margin="3">
<Label Margin="3" HorizontalAlignment="Center">
A Button Stack
</Label>
<Button Margin="3" MaxWidth="200" MinWidth="100">Button 1</Button>
<Button Margin="3" MaxWidth="200" MinWidth="100">Button 2</Button>
<Button Margin="3" MaxWidth="200" MinWidth="100">Button 3</Button>
<Button Margin="3" MaxWidth="200" MinWidth="100">Button 4</Button>
</StackPanel>
</Border> <Button Grid.Row="0" Grid.Column="0">Top Left</Button>
<Button Grid.Row="0" Grid.Column="1">Middle Left</Button>
<Button Grid.Row="1" Grid.Column="2">Bottom Right</Button>
<Button Grid.Row="1" Grid.Column="1">Bottom Middle</Button> </Grid>

这两个属性不指定时默认为0。

布局舍入

按比例设置尺寸时可能会出现边缘模糊的问题,将布局容器的UseLayoutRounding属性设置为true即可解决。

跨行和跨列

使用 RowSpanColumnSpan进行

跨列填充

<Button Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="2">Middle Left</Button>

Canvas面板

它允许使用精确的坐标放置元素。

在Canvas中定位元素,需要设置Canvas.TopCanvas.Left附加属性。

可使用Width和Height属性明确设置子元素的尺寸。

WPF学习笔记02_布局的更多相关文章

  1. WPF学习笔记-用Expression Design制作矢量图然后导出为XAML

    WPF学习笔记-用Expression Design制作矢量图然后导出为XAML 第一次用Windows live writer写东西,感觉不错,哈哈~~ 1.在白纸上完全凭感觉,想象来画图难度很大, ...

  2. WPF 学习笔记-在WPF下创建托盘图标

    原文:WPF 学习笔记-在WPF下创建托盘图标 首先需要在项目中引用System.Windows.Forms,System.Drawing; using System; using System.Co ...

  3. WPF 学习笔记-设置属性使窗口不可改变大小

    原文:WPF 学习笔记-设置属性使窗口不可改变大小 调整Windows下的ResizeMode属性: ResizeMode = NoResize Resize属性是控制Windows是否可以改变大小, ...

  4. WPF学习笔记(8):DataGrid单元格数字为空时避免验证问题的解决

    原文:WPF学习笔记(8):DataGrid单元格数字为空时避免验证问题的解决 如下图,在凭证编辑窗体中,有的单元格不需要数字,但如果录入数字后再删除,会触发数字验证,单元格显示红色框线,导致不能执行 ...

  5. Qt学习笔记-Widget布局管理

    Qt学习笔记4-Widget布局管理       以<C++ GUI Programming with Qt 4, Second Edition>为参考 实例:查找对话框 包含三个文件,f ...

  6. 【WPF学习笔记】之如何把数据库里的值读取出来然后显示在页面上:动画系列之(六)(评论处有学习资料及源码)

    (应博友们的需要,在文章评论处有源码链接地址,以及WPF学习资料.工具等,希望对大家有所帮助) ...... 承接系列五 上一节讲了,已经把数据保存到数据库并且删除数据,本讲是把已经存在的数据从数据库 ...

  7. WPF学习笔记系列之一 (布局详情)

    布局:StackPanel  栈布局:控件不会拐弯且多出的不再显示.DockPanel   停靠布局 吸在上边下边或左右.WrapPanel    环绕布局   一行控件会拐弯Canvas  进行基于 ...

  8. WPF学习笔记一之布局

    1.Canvas 布局控件Canvas主要用来画图,注意Canvas.Left/Right/Top/Bottom <Canvas Margin="10,10,10,10" B ...

  9. WPF学习笔记3——Layout之1

    一.概述 了解XAML的基本之后,进入Layout的学习.Layout,即布局,可能需要用到几种不同的容器.每一种容器都有各自的逻辑.在用户界面的设计过程中,很多时候是在想办法使得界面更加吸引.实在. ...

随机推荐

  1. 效率神器-MouseInc推荐和使用

    主要功能 鼠标手势 按住右键滑动即可开始使用. 配置细微,可自由修改手势宽度,颜色,识别灵敏度等. 支持黑名单,支持特定软件自定义手势,支持复合动作. 功能非常强大,比如下面的操作: 选中一个网址,画 ...

  2. demo集合

    demos的github地址:https://github.com/zy0628/demos 包含以下demo: 1.图片上传.编辑.合成一张图 需求:1.1.拍照或上传本地相册. 2.2.可以截取图 ...

  3. js实现刮刮卡抽奖

    刮刮卡抽奖是前端活动页常见的功能: 链接:图像擦除插件(下载及教程讲解)    推荐理由:无缝刮痕,兼容性好,上手简单   插件有些要修改的地方,打开图像擦除插件后可以看下方网友讨论,或者直接下载本博 ...

  4. SpringBoot异步调用--@Async详解

    1. 概述   在日常开发中,为了提高主线程的效率,往往需要采用异步调用处理,例如系统日志等.在实际业务场景中,可以使用消息中间件如RabbitMQ.RocketMQ.Kafka等来解决.假如对高可用 ...

  5. jvm基本结构和解析

    jvm的基本结构图如下 这只是代表我的个人理解  不是很深刻  欢迎各类大神进行补充和纠正 jvm之所以强大就是因为他从软件层面屏蔽不用操作系统在底层硬件与指令上的区别,从而可以在不同系统上兼容 主要 ...

  6. java集合源码分析(六):HashMap

    概述 HashMap 是 Map 接口下一个线程不安全的,基于哈希表的实现类.由于他解决哈希冲突的方式是分离链表法,也就是拉链法,因此他的数据结构是数组+链表,在 JDK8 以后,当哈希冲突严重时,H ...

  7. HBase数据导入导出工具

    hbase中自带一些数据导入.导出工具 1. ImportTsv直接导入 1.1 hbase中建表 create 'testtable4','cf1','cf2' 1.2 准备数据文件data.txt ...

  8. Golang--函数签名相同

    Golang--函数签名相同 条件 必须函数的函数名,参数和返回值(类型,个数,顺序)都相同. 验证 例子: 定义函数类型,让相同签名的函数自动实现某个接口. Negtive: package int ...

  9. 带你探究Python的诞生和由来

    最近,Python语言越来越火,那什么是Python?它怎么诞生的?它跟C语言.shell语言有什么区别?语言环境是怎么样的?下面,跟着我的步伐,一起去了解一下吧~ Python 诞生在一个圣诞节 P ...

  10. 精尽Spring MVC源码分析 - ViewResolver 组件

    该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...