WPF学习笔记3——Layout之1
一、概述
了解XAML的基本之后,进入Layout的学习。Layout,即布局,可能需要用到几种不同的容器。每一种容器都有各自的逻辑。在用户界面的设计过程中,很多时候是在想办法使得界面更加吸引、实在、便捷。然而,如何使得布局能够很好地适应不同窗口是一个难点。以往,开发者使用基于坐标的方法定位布局和控件。如今,WPF虽然也可以使用这种方法,但是通常更好的做法是创建能够适应不同内容、语言和显示器分辨率的方法。下面简单介绍基本的布局、容器,并举几个例子加深了解。
二、几个概念
1.一个WPF窗体只能有一个元素(element)。为了添加更多的元素,使得程序更符合实际需要,需要放置一个容器并且添加其他元素进去。WPF中,布局取决于你所使用的容器。通常理想的WPF程序遵循以下几点原则(概念):
i.元素(例如控件)不应该被指定大小,而是应该自我调整,以适应所在的容器。例如,一个按钮, 在其文字变多的时候,应该自动变大或变长。你可以设置容器的最大和最小大小(size)。
ii.元素不应该指定它所在的屏幕坐标位置,而是应该根据所在的容器、基于大小、顺序等等在容器中排列。如果你需要添加元素直接的空白,可以使用Margin属性来设置。
iii.很多时候,硬性规定大小和位置是不好的,因为这样限制了你的用户界面的本地化,并且更难处理动态变更的内容。
iv.布局容器可以被嵌入到其它布局容器当中,作为子容器。
v.布局容器可以分享它们的可用空间给它们的子容器。
2.布局过程。分两个阶段:测量阶段和排列阶段。在测量阶段,容器遍历子元素并了解它们的大小。在排列阶段,容器将其子元素放置到合适的位置。一个元素可能没有固定的大小,有时候容器不足够大,这时容器或元素调整以适应可视范围。当然,你也可以通过设置最小窗口大小来避免这种情况。布局容器不提供滚动(scrolling)功能。实际上,滚动功能是特定的内容控件(content control)——ScrollingViewer所支持的。
3.布局容器。所有WPF布局容器都是继承抽象类System.Windows.Controls.Panel。Panel类有三个公共属性:Background、Children、IsItemsHost。你也可以通过重载定义自己的布局容器。特别的,重载MeasureOverride()和ArrangeOverride()方法来改变容器在组织子元素时的测量阶段和排列阶段。自定义布局行为将在日后学习。由此可见,Panel基类提供的是一个起点,用来给其它更具特性的容器继承。WPF提供了一些继承自Panel的类。如同所有WPF控件和大多数可视元素,这些类都在命名空间System.Windows.Controls。常见的有以下几种:
StackPanel |
栈面板。可以将元素排列成一行或者一列,每个元素各占一行或者一列。 |
WrapPanel |
环绕面板。当元素布局到达边界时,可以自动换行。 |
DockPanel |
停靠面板。可以将面板的某一边指定给每个元素,当面板大小变化时,按钮将根据指定的边进行停靠。 |
Grid |
网格面板。以表格形式布局元素。(通常先设置Grid再放元素进去比较好) |
UniformGrid |
均布网格。 网格面板的子集。所有单元格大小相同。 |
Canvas |
画布面板。用于设置元素的精确位置。 |
常见的面板属性如下:
HorizontalAlignment | 水平校准。Center,Left,Right,Stretch |
VerticalAlignment | 垂直校准。Center,Top,Bottom,Stretch |
Margin | 边缘。设置元素边缘空白。 |
MinWidth/MinHeight | 最小尺寸 |
MaxWidth/MaxHeight | 最大尺寸 |
Width/Height | 指定大小(不推荐) |
动手摸索就理解了。相关细节参阅MSDN(http://msdn.microsoft.com/zh-cn/library/ms745058(v=vs.110).aspx)和(http://msdn.microsoft.com/zh-cn/library/ms751709(v=vs.110).aspx)。
日后介绍设置Stytle功能。
4.Border类(System.Windows.Controls.Border):绘制边框或背景。常见的属性有:Background,BorderBrush,BorderThickness,CornerRadius,Padding。详见MSDN(http://msdn.microsoft.com/zh-cn/library/system.windows.controls.border(v=vs.110).aspx)。细节:Padding是Border与内容之间的空白,而Margin是Border外部的空白。
WPF学习笔记3——Layout之1的更多相关文章
- WPF学习笔记4——Layout之2
下面简单介绍常见的面板. 一.Grid 1.Grid关于调整行列距离有三种方法:绝对大小,自动大小,比例大小.如下: <ColumnDefinition Width="100" ...
- WPF学习笔记-用Expression Design制作矢量图然后导出为XAML
WPF学习笔记-用Expression Design制作矢量图然后导出为XAML 第一次用Windows live writer写东西,感觉不错,哈哈~~ 1.在白纸上完全凭感觉,想象来画图难度很大, ...
- WPF 学习笔记-在WPF下创建托盘图标
原文:WPF 学习笔记-在WPF下创建托盘图标 首先需要在项目中引用System.Windows.Forms,System.Drawing; using System; using System.Co ...
- WPF 学习笔记-设置属性使窗口不可改变大小
原文:WPF 学习笔记-设置属性使窗口不可改变大小 调整Windows下的ResizeMode属性: ResizeMode = NoResize Resize属性是控制Windows是否可以改变大小, ...
- WPF学习笔记(8):DataGrid单元格数字为空时避免验证问题的解决
原文:WPF学习笔记(8):DataGrid单元格数字为空时避免验证问题的解决 如下图,在凭证编辑窗体中,有的单元格不需要数字,但如果录入数字后再删除,会触发数字验证,单元格显示红色框线,导致不能执行 ...
- 【WPF学习笔记】之如何把数据库里的值读取出来然后显示在页面上:动画系列之(六)(评论处有学习资料及源码)
(应博友们的需要,在文章评论处有源码链接地址,以及WPF学习资料.工具等,希望对大家有所帮助) ...... 承接系列五 上一节讲了,已经把数据保存到数据库并且删除数据,本讲是把已经存在的数据从数据库 ...
- WPF学习笔记1---初接触
刚刚接触WPF,微软的一套东西.WPF最大的特点就是UI设计与代码逻辑的完全剥离.这样美工和程序员的分工就变得非常清楚.因为界面和程序的耦合度很低,也增加的代码的灵活性和可重用性. 微软为WPF的UI ...
- WPF学习笔记1——XAML之1
参考文献: http://msdn.microsoft.com/zh-cn/library/ms752059(v=vs.110).aspx <Pro WPF 4.5 in C# > 一.X ...
- WPF学习笔记(1):DataGrid单元格实现逐键过滤功能
最近,开始学习WPF,其UI设计完全颠覆了传统的设计理念,为程序员提供了极大的自由发挥空间,让我为之惊叹,且为之着迷.然而,WPF在国内的热度却并不高,大部分贴子都是2012年以前的,出版的图书也很少 ...
随机推荐
- break和continue语句
跳转语句中断当前的执行过程,C++语言提供了4中跳转语句:break.continue.goto和return. break语句 break语句负责终止离他最近的while.do while.for或 ...
- JS之正则表达式验证URL
function IsURL(str_url){ var strRegex = "^((https|http|ftp|rtsp|mms)?://)" + "?(([0-9 ...
- How to Map Distinct Value Types Using Java Generics--reference
原文:http://www.codeaffine.com/2015/03/04/map-distinct-value-types-using-java-generics/ Occasionally t ...
- 优化sql,返回行数少情况下,NL比hash快好多
sql如下 select t.id, t.value, tt.sort as sortno from ENGINEERING_TYPE t left join ENGINEERING_TYPE tt ...
- android.os.NetworkOnMainThreadException 异常处理
当我试图在UI线程(MainActivity)连接网络的时候,运行时抛出异常droid.os.NetworkOnMainThreadException 安卓的官方文档说 The exception t ...
- Cookie的属性(cookie的设置、获取和删除)
每个cookie都有四个可选的属性,他们分别控制cookie的生存周期.可见性.安全性等. Cookies最初设计时,是为了CGI编程.但是,我们也可以使用Javascript脚本来操纵cookies ...
- Matlab图像函数之pie
一.pie pie用于描绘平面饼图. (1)pie(X) 利用向量X中的数据描绘饼图. 例如: X = [1, 1, 2, 2, 3, 4, 5]; pie(X) 得到 注意,X中的数据被看做频数,饼 ...
- Android -tool工具UIautomatorviewer提示“不能让屏幕黑屏”
Android中有很多工具可以让我们使用,我使用比较多的有属DDMS,UIautomatorviewer,DDMS中信息也很强大,有空的时候在理理 这篇博主写的很详细:http://www.cnblo ...
- 如何在Xilinx ISE中使用TCL提高工作效率
http://wenku.baidu.com/link?url=jxtsPLGUlWwYuD8TtfWYYU_NhY5Qty3rx8ZDLCkINLe39JRGb90V5HoJhnkn9r_PQ6vZ ...
- tcpdf MultiCell line break
在程序中,我遇到MultiCell中显示三个字符串,开始时 $pdf->MultiCell(63.5, 30, $name."\n".$address."\n&qu ...