布局原则

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. Codeforces Edu Round 49 A-E

    A. Palindromic Twist 由于必须改变.所以要使\(a[i] = a[n - i + 1]\). 要么同向走,但必须满足之前的\(a[i] = a[n - i + 1]\). 要么相遇 ...

  2. 题解-比赛CF1332

    题解-比赛CF1332 比赛CF1332 [A] [B] [C] [D] [E] [F] [G] [A]Exercising Walk Exercising Walk \(T\) 组测试数据,每次给定 ...

  3. CSS知识点记录

    1.浏览器style中显示的样式 这里面的样式,是行内样式或者是使用js添加的样式

  4. ThreadX——IPC应用之信号量

    一.应用简介 在RTOS的应用开发中,信号量也是经常使用到的一种用于多任务之间信息同步.资源互斥访问的一种手段,常用于协调多个任务访问同一资源的场景.信号量又分为计数信号量和互斥信号量.计数信号量可以 ...

  5. JavaSE20-线程&同步

    1.线程 1.1 基本概念 线程的概念 线程(Thread)是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并 ...

  6. Unity 保存游戏,读取游戏,退出游戏

    1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEngine; 4 using System. ...

  7. vue插值 v-cloak

    vue插值 v-cloak 使用VUE时,页面刷新时会出现闪动的现象(即在插值时会显示两侧的 {}) 先定义一个VUE 通过选择器在style中定义v-cloak的display值为none 再在元素 ...

  8. Javascript 根据文件名判断是否未图片

    var isImage = (/\.(gif|jpe?g|tiff?|png|webp|bmp)$/i).test(filename)

  9. 网站开发学习Python实现-Django项目部署-同步之前写的博客(6.2.2)

    @ 目录 1.说明 2.思路 3.代码 关于作者 1.说明 之前写的博客都在csdn和博客园中 要将博客同步到自己的博客网站中 因为都是使用markdown格式书写的,所以直接爬取上传就完事 2.思路 ...

  10. 如何优雅地使用云原生 Prometheus 监控集群

    作者陈凯烨,腾讯云前端开发工程师.负责 TKE 集群,弹性集群和云原生监控等模块控制台开发. 概述 Prometheus 是一套开源的系统监控报警框架.2016 年,Prometheus 正式加入 C ...