WPF布局原则

不应显式设置大小

为了布局的稳定性,控件的大小应该可以自动适应容器。如下为新建一个窗体,默认包含一个Grid容器,该控件没有显式设置宽高,所以,在改变窗体大小的时候,该容器的大小也随着变化,但如果显式的加了宽或高,在改变窗体大小后,该容器的大小受限并且位置不再稳定

使用相对坐标

容器的子元素应该以父级位置相对定位,而不是使用窗体的坐标

与子元素共享空间

如果空间允许,布局容器会根据每个元素的内容尽可能为元素设置更合理的尺寸。它们还会向一个或多个子元素分配多余的空间

支持嵌套布局

多种容器可相互嵌套使用,完成最优布局

StackPanel 控件

它是一个布局容器,在单行单列中放置子元素,叫做堆栈面板

在窗体中添加一个StackPanel容器,在工具箱中先择StackPanel控件,将其拖动到窗体上,在这里,StackPanel容器被嵌套在了Grid容器中,也可以将Grid容器删除,单独使用StackPanel容器;StackPanel的默认XMAL标签是个单标签,如果需要在StackPanel中包含子级,需要将其设置为双标签格式

将StackPanel所有的属性先删除掉,然后添加一个标签控件,三个按钮控件,一个文本框控件,效果如下;可以看出,StackPanel默认会将子元素垂直排列

可以通过Orientation属性来控制子元素排列方向

Orientation="Horizontal" 表示水平排列

Orientation="Vertical" 表示垂直排列,它是默认的

HorizontalAlignment属性可以控制子元素水平方向的位置,控制元素是靠左还中靠右等

该属性对应的值有Right/Left/Center/Stretch,该属性只对于横向伸展(垂直排列)的元素有效果

HorizontalAlignment="Right"表示将元素水平区于右,结果如下图

VerticalAlignment属性可以控制子元素垂直方向的位置

VerticalAlignment对应的值有Bottom/Center/Stretch/Top

VerticalAlignment="Top"会将横向分布(垂直伸展)的元素区于上方,如下图

因为子元素的排列方向发生了变化,这里看到,HorizontalAlignment="Right"已经不再起作用

Margin属性为元素添加外边距

Margin="10,15,20,25"的四个值分别表示左、上、右、下的位置,如下图

如果Margin属性只有一个值的话表示的是上下位置,如果只有两个值的话,第一个值表示上下,第二个值表示的是左右

MinWidth属性可以控制元素的最小尺寸,也就是说该元素不可以小于设定的最小宽度值

MaxWidth属性可以控制元素的最大尺寸,也就是说该元素不可以大于设定的最大宽度值

Border控件

Border 是一个装饰的控件,用此控件绘制一个边框、一个背景.在 Border 中只能有一个子控件,但它的子控件是可以包含多个子控件的

示例与代码如下

<Border><StackPanel Orientation="Vertical"><Label Content="Label"/><Button Content="Button" /><Button Content="Button" /><Button Content="Button" /><TextBox Height="23" TextWrapping="Wrap" Text="TextBox"/></StackPanel></Border>

从上例可以看出,Border中只包含了一个子元素StackPanel,而StackPanel中包含了多个子元素

BorderThickness属性可以设置Border控件边的宽度,而BorderBrush属性可以设置边的颜色,如下

<Border BorderThickness="16" BorderBrush="BlueViolet"><StackPanel Orientation="Vertical"><Label Content="Label"/><Button Content="Button" /><Button Content="Button" /><Button Content="Button" /><TextBox Height="23" TextWrapping="Wrap" Text="TextBox"/><Border BorderBrush="Black" BorderThickness="1" Height="100"/></StackPanel></Border>

Padding属性可以为元素设置内填充,效果如下

<Border BorderThickness="16" BorderBrush="BlueViolet" Padding="30"><StackPanel Orientation="Vertical"><Label Content="Label"/><Button Content="Button" /><Button Content="Button" /><Button Content="Button" /><TextBox Height="23" TextWrapping="Wrap" Text="TextBox"/><Border BorderBrush="Black" BorderThickness="1" Height="100"/></StackPanel></Border>

CornerRadius属性可以为Border控件设置边度的弧度,如下图

<Border BorderThickness="16" BorderBrush="BlueViolet" Padding="30" CornerRadius="45"><StackPanel Orientation="Vertical"><Label Content="Label"/><Button Content="Button" /> <Button Content="Button" /><Button Content="Button" /><TextBox Height="23" TextWrapping="Wrap" Text="TextBox"/><Border BorderBrush="Black" BorderThickness="1" Height="100"/></StackPanel></Border>

WrapPanel面板

WrapPanel容器将子元素按行或列一个接一个进行排列,如果一行或一列放不下,元素会被挤到下一行或一列;同一行元素的高度一样,同一列元素的宽度是一样的

示例如下:

<Window x:Class="WPF_Code.WarpPanel_wpf"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="WarpPanel_wpf" Height="300" Width="300"><WrapPanel><Button Content="Button" /><Button Content="Button" /><!--这里只设置了一个button的高度,与它同一行的元素都变成了一样的高度--><Button Content="Button" Height="30" /><Button Content="Button" /><Button Content="Button" /><Button Content="Button" /><Button Content="Button" /><Button Content="Button" /></WrapPanel>
</Window>

<Window x:Class="WPF_Code.WarpPanel_wpf"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="WarpPanel_wpf" Height="300" Width="300"><!--将WrapPanel元素排列方向改为垂直方向--><WrapPanel Orientation="Vertical"><!--在垂直方向上,如果改变一个元素的高度的话对其它元素没有影响--><Button Content="Button" Height="164" /><Button Content="Button" /><!--在垂直方向上,如果改变一个元素的宽度则同列上的元素的宽度都会有变化--><Button Content="Button" Width="100" /><Button Content="Button" /><Button Content="Button" /><Button Content="Button" /><Button Content="Button" /><Button Content="Button" /></WrapPanel>
</Window>

DockPanel面板

DockPanel支持让元素简单地停靠在整个面板的某一条边上,然后拉伸元素以填满全部宽度或高度。它也支持让一个元素填充其他已停靠元素没有占用的剩余空间

DockPanel有一个Dock附加属性,因此子元素用4个值来控制她们的停靠:Left、Top、Right、Bottom。Dock 没有Fill值。作为替代,最后的子元素将加入一个DockPanel并填满所有剩余的空间,除非DockPanel的LastChildFill属性为false,它将朝某个方向停靠

示例如下:

<Window x:Class="WPF_Code.WarpPanel_wpf"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="WarpPanel_wpf" Height="300" Width="300"><DockPanel><Button Content="Button"/><Button Content="Button"/><Button Content="Button"/><Button Content="Button"/><Button Content="Button"/></DockPanel>
</Window>

默认情况下,元素会依次横向排列,并填充整个空间

<Window x:Class="WPF_Code.WarpPanel_wpf"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="WarpPanel_wpf" Height="300" Width="300"><!--LastChildFill="True"允许最后一个元素填充整个空间,默认是Ture--><DockPanel LastChildFill="True"><!--DockPanel.Dock属性可控制元素在DockPanle中依靠的位置--><Button Content="Button" DockPanel.Dock="Top" /><Button Content="Button" DockPanel.Dock="Bottom"/><Button Content="Button" DockPanel.Dock="Left"/><Button Content="Button" DockPanel.Dock="Right"/><Button Content="Button"/></DockPanel>
</Window>

嵌套布局容器

一个简单示例

<Window x:Class="WPF_Code.WarpPanel_wpf"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="WarpPanel_wpf" Height="300" Width="300"><!--一个DockPanel容器,LastChildFill允许最后一个元素填充整个剩余空间--><DockPanel LastChildFill="True"><!--嵌套一个StackPanel容器,将子元素横向排列,并领先到DockPanel的底部,然后居中--><StackPanel DockPanel.Dock="Bottom" HorizontalAlignment="Center" Orientation="Horizontal"><Button Name="btn1" Content="OK" Padding="10"/><Button Name="btn2" Content="No" Padding="10"/></StackPanel><!--DockPanel的最后一个元素,默认填充整个剩余空间--><TextBox DockPanel.Dock="Top">文本输入……</TextBox></DockPanel>
</Window>

注:可以通过文档大纲栏来查看元素节点树状图

编辑于 2018-09-13

Windows Presentation Foundation (WPF)

C# 编程

程序员

【转】WPF之路-常用布局控件一相关推荐

  1. Android Studio 安卓 常用布局控件

    布局: 1.LinearLayout–线性布局 Frameloayout-- 帧布局 TableLayout–表格布局 RelativeLayout–相对布局 控件: TextView–显示文本 Ed ...

  2. WPF 的内部世界(控件与布局)

    我一开始算是比较抵触WPF的,因为用的人少吗.感觉都是窗体应用能和Winform有什么区别.可是我错了,非常感谢我的讲师,给我推荐刘铁猛的<深入浅出WPF>,让我了解到了WPF的魅力--数 ...

  3. 【愚公系列】2023年07月 WPF+上位机+工业互联 002-WPF布局控件

    文章目录 前言 一.WPF布局控件 1.无边框设计 2.理解布局 2.1 WPF的布局处理 2.1 布局原则 2.3 布局过程 3.布局控件 3.1 Grid控件 3.1.1 属性 3.1.2 案例 ...

  4. 【Android】7.1 布局控件常用的公共属性

    分类:C#.Android.VS2015: 创建日期:2016-02-10 一.简介 Android应用程序中的布局控件都是容器控件,用于控制子元素的排列和放置方式.Android提供的布局控件有: ...

  5. VS2017中创建使用 XRM 工具常用登录控件的WPF应用程序,适用CRM9.X版本

    VS2017中创建使用 XRM 工具常用登录控件的WPF应用程序,适用CRM9.X版本 前提条件 创建WPF项目和修改版本 添加按钮调用登录控件进行调试 总结 微软dynamics官网之前有个CRM ...

  6. WPF 自定义控件-布局控件

    自定义布局控件 1.添加自定义控件 添加新项->WPF->自定义控件(WPF) 在Themes文件夹下Generic.xaml会自动生成自定义控件的模板样式 2.实现自定义布局控件功能 1 ...

  7. WPF布局控件与子控件的HorizontalAlignment/VerticalAlignment属性之间的关系

    WPF布局控件与子控件的HorizontalAlignment/VerticalAlignment属性之间的关系: 1.Canvas/WrapPanel控件: 其子控件的HorizontalAlign ...

  8. Flutter 布局控件完结篇

    本文对Flutter的29种布局控件进行了总结分类,讲解一些布局上的优化策略,以及面对具体的布局时,如何去选择控件. 1. 系列文章 Flutter 布局详解 Flutter 布局(一)- Conta ...

  9. Expression Blend实例中文教程(3) - 布局控件快速入门Grid

    上一篇对Blend 3开发界面进行了快速入门介绍,本篇将基于Blend 3介绍Silverlight控件.对于微软开发工具熟悉的朋友,相信您很快就熟悉Blend的开发界面和控件. XAML概述 Sil ...

最新文章

  1. c# typescript_在任何IDE中从C#,Java或Python代码获取TypeScript接口的简单方法
  2. cat命令的13个用法
  3. 政企应用如何构筑安全合规的互联内容分发加速?
  4. avi编码格式以及查看的视频编码方式的小工具
  5. LeetCode 330. 按要求补齐数组(贪心)
  6. 编译原理中词法分析--部分实现
  7. np.unique()官方文档分析以及举例
  8. sql string转换成int型 sql截取字符串
  9. 一文了解Android游戏SDK开发
  10. JDO与Hibernate之比较(转载)
  11. 【paper笔记】Personalized Top-N Sequential Recommendation via Convolutional Sequence Embedding
  12. NOIP2017普及组初赛试题及答案
  13. 请问如何修复损坏的jpg文件
  14. css 设置文字强制不换行
  15. 红酒数据探索(Python内置对象)
  16. 统筹在项目中的重要性
  17. 使用Qt框架创建一个基于Qt Quick的Python应用
  18. ip地址中斜杠(/)含义
  19. 关于服务器无法连接远端数据库的原因
  20. 求一元二次方程ax2+bx+c=0的根

热门文章

  1. 洛谷 - P2181 - 对角线 - 打表 - 组合数学
  2. python 运维自动化之路 Day2
  3. Android Service 的一些笔记
  4. 在CentOS下源码安装 Xen并搭建Windows虚拟机
  5. The Ransom of Red Chief
  6. BulkLoader类使用
  7. 【转】CMMI环境下,该如何实施Agile?
  8. 不同职业的面试着装技巧。
  9. [剑指offer]面试题第[52]题[Leedcode][第160题][JAVA][相交链表][双指针]
  10. [剑指offer]面试题第[28]题[Leedcode][JAVA][第101题][对称二叉树][队列][递归]