所有的WPF布局容器都派生自System.Windows.Controls.Panel。
Panel继承自FrameworkElement。
在Panel中有一个比较重要的属性是UIElementCollection 类型的Children属性,UIElementCollection是一个有序的集合。
我们可以使用继承自Panel的类来重写MeasureOverride(),ArrangeOverride()实现自定义面板。

常用的布局容器:

Border不是布局面板,但是经过几个大佬的提醒,用好他真的很重要,所以我就放在第一个了。
/******************************************************************************************************************************************************/
StackPanel: 堆栈面板,水平或垂直放置元素。
WrapPanel:可换行的行中放置元素,在水平方向上从左向右放置元素,换行后也是从左向右。在垂直方向上,从上到下放置元素,在切换列后也是从上到下。
DockPanel: 根据容器的整个边界调整元素。
Grid:在行列表格中排列元素。
UniformGrid:强制所有单元格具有相同尺寸。
Canvas:使用固定坐标绝对定位元素。
ScrollViewer:通过添加滚动条可以使当前过长布局内的内容纵向或者横向滚动。再有限的区域内可以通过滚动呈现更多的内容。

1.Border

Border不是布局面板,但是经常与布局类的面板一起配合使用,所以先介绍Border。
Border的主要作用是给元素添加边框,这个元素可以理解为一个布局面板,一个控件等等。
他包含设置边框的2个属性:
–BorderBrush用来设置颜色;
–BorderThickness用来设置宽度;
–CornerRadius设置圆角;
–Padding 设置边框和里面元素的间距;
–Margin 设置边框和其他临近元素的间距;
–Background则是设置border所有内容的颜色;

<Window x:Class="Wpf_Panel.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:Wpf_Panel"mc:Ignorable="d"Title="MainWindow" Height="500" Width="800"><StackPanel><!--BorderBrush用来设置颜色--><!--BorderThickness用来设置宽度--><!--CornerRadius设置圆角--><!--Padding设置边框和里面元素的间距--><!--Margin设置边框和其他临近元素的间距--><!--Background则是设置border所有内容的颜色--><Border Background="Bisque" BorderBrush="Coral"  BorderThickness="3"><Button Content="Button A" Width="120"/></Border><Border BorderBrush="Red" BorderThickness="3" Margin="5"><Button Content="Button B"/></Border><Border BorderBrush="DarkRed" BorderThickness="3" Background="Red" Padding="5"><Button Content="Button C"/></Border></StackPanel><!--<Grid></Grid>-->
</Window>

2.StackPanel

StackPanel面板可以在单行或者单列以堆栈的形式排列子元素。
默认情况下StackPanel面板按从上到下的顺序排列元素。
如果不指定宽度、则默认宽度和StackPanel面板宽度一致,如果StackPanel宽度发生变化,则按钮也会拉伸以适应变化。
而如果设置了宽度、就不会跟面板宽度变更发生变化。
但是想要设计出自己想要的好看布局,还需要更多的元素,先看一个基本的例子。

<Window x:Class="Wpf_Panel.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:Wpf_Panel"mc:Ignorable="d"Title="MainWindow" Height="500" Width="800"><StackPanel x:Name="root_spanel" ><Button Content="点我切换方向" Click="OrientationTranslator_Click"/><Button Content="点我添加元素到面板中" Click="AddElementToPanel_Click"/><Button x:Name="btn_FixedWidth" Content="点我手动设置宽度为120" Click="SetCurrentWidth_Click"/><Button Content="大家一定要努力学习C#!!!"/></StackPanel>
</Window>
        private void OrientationTranslator_Click(object sender, RoutedEventArgs e){root_spanel.Orientation = root_spanel.Orientation == Orientation.Horizontal ? Orientation.Vertical : Orientation.Horizontal;}private void AddElementToPanel_Click(object sender, RoutedEventArgs e){Button btn = new Button();btn.Content = "我是新添加的Button";root_spanel.Children.Add(btn);}private void SetCurrentWidth_Click(object sender, RoutedEventArgs e){btn_FixedWidth.Width = 120;}

3.WrapPanel

WrapPanel面板可以一次排列一行或一列然后再换行继续排列,和StackPanel一样;
可以通过设置Orientation属性来设置当前是以水平还是垂直来排列子元素。
因为是根据窗体变化演示布局排列,这个只有XAML。

<Window x:Class="Wpf_Panel.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:Wpf_Panel"mc:Ignorable="d"Title="MainWindow" Height="500" Width="800"><WrapPanel><Button Content="《老黄牛》" Width="120"/><Button Content="臧克家"  Width="120"/><Button Content="块块荒田水和泥,"  Width="120"/><Button Content="深翻细作走东西。"  Width="120"/><Button Content="老牛亦解韶光贵,"  Width="120"/><Button Content="不待扬鞭自奋蹄。"  Width="120"/></WrapPanel>
</Window>

4.DockPanel

DockPanel面板与StackPanel面板类似,但是DockPanel可以通过设置Dock附加属性设置子元素停靠的边。
Dock的值为Left、Right、Top、Bottom。
通过设置子元素再DockPanel面板中的Dock属性。
可以修改子元素再DockPanel面板内的位置。
可以通过LastChildFill设置为true来告诉DockPanel面板使最后一个元素占满剩余控件。
而设置的停靠顺序会影响布局结果。

<Window x:Class="Wpf_Panel.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:Wpf_Panel"mc:Ignorable="d"Title="MainWindow" Height="500" Width="900"><DockPanel LastChildFill="True"><Button DockPanel.Dock="Top" Content="今天学习了吗?"/><Button DockPanel.Dock="Left" Content="今天写代码了?"/><Button DockPanel.Dock="Right" Content="随便放点东西"/><Button DockPanel.Dock="Right" VerticalAlignment="Center" Content="真的理解了吗?要不要再多敲几遍。"/><Button DockPanel.Dock="Bottom" Content="程序员不学习写代码,还能干什么呢?"/><Button DockPanel.Dock="Bottom" Content="程序员不学习写代码,还能干什么呢?"/></DockPanel>
</Window>

5.Grid

Grid面板是把显示内容分割到不可见的行列网格中。通过设置行列和对应的宽高占比。来进行网格布局。Grid布局再平时使用的比较多。
大部分都是用来做布局的嵌套,设计外框各个部分的比例,然后在子元素中嵌套其他布局控件。来实现区域的划分。
在使用Grid面板时,需要用到一个叫做附加依赖项属性的参数。
在布局相关的内容里不会去讲什么是附加依赖项属性,这个会在依赖项属性中去讲解,这里只有了解就行。
因为这个针对于Grid布局来说是固定写法。
我们添加一个三行三列的Grid面板。
Grid.RowDefinitions -------------内容是我们设置的Gird的行数。
Grid.ColumnDefinitions-------------内容是我们设置的Gird的列数。

各有3个,代表我们是一个三行三列的网格。我们没有设置宽高。就会默认为是等分的

<Window x:Class="Wpf_Panel.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:Wpf_Panel"mc:Ignorable="d"Title="MainWindow" Height="500" Width="900"> <Grid><Grid.RowDefinitions><RowDefinition/><RowDefinition/><RowDefinition /></Grid.RowDefinitions><Grid.ColumnDefinitions><!--各列平分宽度--><ColumnDefinition/><ColumnDefinition /><ColumnDefinition /><!--要求左边一列宽度固定,右边一列以文本内容宽度适配,剩下的宽度区域都给中间的列。为了提高代码可读性,不建议省略Width="*"虽然都是一样的。--><!--<ColumnDefinition Width="140"/><ColumnDefinition Width="*"/><ColumnDefinition Width="Auto"/>--></Grid.ColumnDefinitions><!--网格布局设计好之后。我们需要往里面放置内容。我们要使用Grid.Column、Grid.Row这2个附加依赖项属性来实现把Button放置到不同的网格中--><Button Grid.Column="0" Grid.Row="0" Content="Button Row 1 Column 1"/><Button Grid.Column="1" Grid.Row="0" Content="Button Row 1 Column 2"/><Button Grid.Column="2" Grid.Row="0" Content="Button Row 1 Column 3"/><Button Grid.Column="0" Grid.Row="1" Content="Button Row 2 Column 1"/><Button Grid.Column="1" Grid.Row="1" Content="Button Row 2 Column 2"/><Button Grid.Column="2" Grid.Row="1" Content="Button Row 2 Column 3"/><Button Grid.Column="0" Grid.Row="2" Content="Button Row 3 Column 1"/><Button Grid.Column="1" Grid.Row="2" Content="Button Row 3 Column 2"/><Button Grid.Column="2" Grid.Row="2" Content="Button Row 3 Column 3"/></Grid>
</Window>

6.UniformGrid

UniformGrid面板的特点是每个单元格始终保持一致的大小。
通过设置行列数量来分割布局。
元素通过放入的前后顺序被分配到不同的位置。
这个再某些特定场景配合数据虚拟化和列表虚拟化使用的还是比较多的。

<Window x:Class="Wpf_Panel.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:Wpf_Panel"mc:Ignorable="d"Title="MainWindow" Height="500" Width="900"><UniformGrid Columns="2" Rows="2"><!--按照先来后到的顺序,先行后列的放入到行列单元格--><Button Content="Button A"/><Button Content="Button B"/><Button Content="Button C"/><Button Content="Button D"/></UniformGrid>
</Window>

7.Canvas

Canvas是一个基于坐标的布局面板。他主要用于构建图形工具的绘图、Canvas知识再指定的位置放置子元素。
并且子元素要提供精确的尺寸。
再Canvas中需要设置Canvas.Left和Canvas.Top属性。用来设置相对于原点的Left和Top。
也可以使用Canvas.Right和Canvas.Bottom属性。用来设置相对于原点的Right和Bottom。
但是Canvas.Left和Right不能同时使用;
Canvas.Top和Canvas.Bottom也不能同时使用。
使用Panel.ZIndex来设置子元素的层级关系。

<Window x:Class="Wpf_Panel.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:Wpf_Panel"mc:Ignorable="d"Title="MainWindow" Height="500" Width="900"><Canvas><!--Panel.ZIndex="1"设置子元素的层级关系,哪个数字大,哪个在上面--><Button Content="Button A" Canvas.Left="255" Canvas.Top="70"  Panel.ZIndex="2" Width="80px" Height="30px"/><Button Content="Button B" Canvas.Left="110" Canvas.Top="100"  Width="80px" Height="30px"/><Button Content="Button C" Canvas.Left="295" Canvas.Top="81" Panel.ZIndex="1"  Width="80px" Height="30px"/></Canvas>
</Window>

8.ScrollViewer

如果要再一个比较小的区域内显示特别多的内容,就需要使用ScrollViewer来进行横向或纵向滚动了,但是再实际使用过程中往往配合数据虚拟化和列表虚拟化来实现支持更多内容的滚动效果。不然如果内容一旦特别多,ScrollViewer下的内容又特别长,每次滚动都会触发布局的重新测量和排列。如果不使用虚拟化,会全部重新计算所有的布局元素,会特别卡,导致使用困难。

<Window x:Class="Wpf_Panel.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:Wpf_Panel"mc:Ignorable="d"Title="MainWindow" Height="500" Width="900"><Grid><StackPanel><ScrollViewer Name="scroll" Width="480"  Height="350" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Visible" ><TextBlock    Name="txtShowArticle"   Foreground="Gray" Margin="20,10" Loaded="txtShowArticle_Loaded" /></ScrollViewer></StackPanel></Grid>
</Window>
        string content = @"中国青年网6月22日电 据“健康广东”微信公众号消息,6月21日0-24时,全省新增2例本土确诊病例,深圳报告1例,东莞报告1例。
全省新增境外输入确诊病例5例,广州报告2例,分别来自法国和阿曼;深圳报告1例,来自印度尼西亚;珠海报告1例,来自孟加拉国;东莞报告1例,来自阿联酋。新增境外输入无症状感染者7例,广州报告3例,2例来自柬埔寨,1例来自阿联酋;佛山报告1例,来自柬埔寨;中山报告1例,来自加蓬;肇庆报告2例,均来自印度尼西亚。新增出院16例。
截至6月21日24时,全省累计报告新冠肺炎确诊病例2706例(境外输入1140例)。目前在院221例。
(来源:中国青年网)";private void ShowArticle(){//获取私信信息           StringBuilder strMessage = new StringBuilder();strMessage.Append("标题:" + "广东昨日新增2例本土确诊病例,深圳、东莞各1例" + "\r\n");strMessage.Append("来源:" + "中国青年网" + "\r\n");strMessage.Append("发送时间:" + "2021-06-22 15:31:32" + "\r\n");strMessage.Append("发送内容:" + content + "\r\n\n");txtShowArticle.Text = strMessage.ToString();}private void txtShowArticle_Loaded(object sender, RoutedEventArgs e){ShowArticle();}

到此这篇关于WPF布局容器的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家
参考资料

2022年10月17日【Jiawei_Z】WPF的容器章节相关推荐

  1. 润歌互动通过聆讯:最高募资2亿港元 拟10月17日上市

    雷递网 雷建平 10月2日 润歌互动有限公司(简称:"润歌互动",股票代码为:02422.HK)日前通过聆讯,预计2022年10月17日在港交所挂牌上市. 润歌互动于2022年9月 ...

  2. 第13届蓝桥杯省赛真题剖析-2022年4月17日Scratch编程初中级组

    [导读]:超平老师的<Scratch蓝桥杯真题解析100讲>已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第122讲. 第13届蓝桥杯省赛举办了两次,这是202 ...

  3. CNAS 实验室认可规范文件清单 (截止2022年10月1日)

    CNAS 实验室认可规范文件清单 (截止2022年10月1日) 序号 类别 文件编号 文件名称 发布日期 实施日期 被代替文件 备注 注:有效文件发布实施日期 文件编号/文件名 旧文件废止时间 1 通 ...

  4. 2022年10月23日周赛ZZULIOJ

    文章目录 问题 B: 芝华士威士忌和他的小猫咪们 代码&注释 问题 C: 愿我的弹雨能熄灭你们的痛苦 代码注释 问题 D: 猜糖果游戏 代码注释 问题 E: 有趣的次方 代码注释 问题 F: ...

  5. 2022年10月29日 20点 程序爱生活 纳指和恒指可能会小破前高,然后有概率继续破新低,但是破完就需要考虑一次较大级别反弹的概率了! 第一次不再完全看空!

    确定市场形态的敏感因子 - 继续扩大折价,但没有新低  结论: 2022年10月28日  折价恢复扩大的趋势,但是还是高于前期低点,需要观察是否会下破,感觉有概率不会下破,如果这个趋势到来,那么可能是 ...

  6. 第十三届蓝桥杯省赛(2022年4月17日)C++中级组题解

    目录 前言 一.选择题 1.题目描述 2.参考答案 二.编程题 1.比较大小 题目描述 题目解析 AC代码 2.分成整数 题目描述 题目解析 AC代码1(模拟) AC代码2(dfs) 3.组合 题目描 ...

  7. 华为鸿蒙10月17日,华为宣布10月17日重磅新机:鸿蒙系统+全球首发屏下摄像头...

    今年华为手机太多大招,Mate30系列旗舰才开售不久,最近又曝光了一款顶级旗舰机,从曝光的真机渲染图来看,这款神秘机型将于10月17日在法国发布,手机渲染图四周超窄边框设计,值得注意的是手机右上角反光 ...

  8. 2018年10月17日普级B组【模拟赛】

    2018年10月17日普级B组模拟赛2018年10月17日普级B组模拟赛2018年10月17日普级B组模拟赛 第一题--ISBN号码第一题--ISBN号码第一题--ISBN号码 博客链接: https ...

  9. 新时代 新创意 新场景 新消费 2021“设计+”珠宝首饰创新设计展将于10月17日开幕

    如何高举"新工艺美术运动"旗帜,运用新设计方法促进珠宝首饰设计推陈出新,引领新消费,服务新需求,形成新时尚,推进珠宝首饰高定设计向着文化与科技融合.传统与时尚的融合.艺术与使用融合 ...

最新文章

  1. php 获取所有表,php – 获取所有插件的列表
  2. 【 FPGA 】常数( localparam )和参数( parameter )
  3. PHP7 学习笔记(八)JetBrains PhpStorm 2017.1 x64 MySQL数据库管理工具的使用
  4. 从李小龙的一句话看程序员是否应该多学几种编程语言
  5. HBase在阿里搜索中的应用实践
  6. emberjs重写补充类之reopen方法和reopenClass方法
  7. 计算机课数学,这4个专业,对数学要求很高,数学不好的慎选!
  8. 为什么说Serverless是云的未来?
  9. FileOutputStreamTest
  10. 【FTP】org.apache.commons.net.ftp.FTPClient实现复杂的上传下载,操作目录,处理编码...
  11. 360网络测速器电脑版
  12. c语言error lnk 2005,error LNK2005问题,小弟实在无能为力!!!
  13. 清华计算机系人工智能学院,CoAI - 清华大学交互式人工智能课题组
  14. idea-svn文件名字浅蓝色(蓝绿色)含义
  15. Warning: Attempt to present ... on … which is already presenting null
  16. 3-1存储系统-存储器概述主存储器
  17. 【游戏开发】unity教程4 打飞碟小游戏
  18. python基础(第九章)面向对象
  19. Spring Boot与Elasticsearch的对应版本
  20. 7-226 sdut-C语言实验-矩阵输出(数组移位)7-227 sdut- C语言实验-计算1到n的和(循环结构)7-228 加法口诀表

热门文章

  1. C#环形缓冲区(队列)完全实现(转)
  2. 视频教程-红孩儿网狐Cocos经典棋牌开发教程-手游开发
  3. Unity射线与UI碰撞检测
  4. GNSS定位精度指标计算
  5. I love my motherland(我和我的祖国英语演讲稿)
  6. STC12系列单片机的1T模式和12T模式
  7. 将代码上传到GitHub上
  8. java怎么连接sql_java怎么连接SQL Server
  9. context,request,response的作用,存活时间,简单上传下载操作
  10. 从零开始搭建自己的网站可外网访问从购买服务器开始