一、概述

了解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的更多相关文章

  1. WPF学习笔记4——Layout之2

    下面简单介绍常见的面板. 一.Grid 1.Grid关于调整行列距离有三种方法:绝对大小,自动大小,比例大小.如下: <ColumnDefinition Width="100" ...

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

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

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

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

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

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

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

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

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

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

  7. WPF学习笔记1---初接触

    刚刚接触WPF,微软的一套东西.WPF最大的特点就是UI设计与代码逻辑的完全剥离.这样美工和程序员的分工就变得非常清楚.因为界面和程序的耦合度很低,也增加的代码的灵活性和可重用性. 微软为WPF的UI ...

  8. WPF学习笔记1——XAML之1

    参考文献: http://msdn.microsoft.com/zh-cn/library/ms752059(v=vs.110).aspx <Pro WPF 4.5 in C# > 一.X ...

  9. WPF学习笔记(1):DataGrid单元格实现逐键过滤功能

    最近,开始学习WPF,其UI设计完全颠覆了传统的设计理念,为程序员提供了极大的自由发挥空间,让我为之惊叹,且为之着迷.然而,WPF在国内的热度却并不高,大部分贴子都是2012年以前的,出版的图书也很少 ...

随机推荐

  1. break和continue语句

    跳转语句中断当前的执行过程,C++语言提供了4中跳转语句:break.continue.goto和return. break语句 break语句负责终止离他最近的while.do while.for或 ...

  2. JS之正则表达式验证URL

    function IsURL(str_url){ var strRegex = "^((https|http|ftp|rtsp|mms)?://)" + "?(([0-9 ...

  3. 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 ...

  4. 优化sql,返回行数少情况下,NL比hash快好多

    sql如下 select t.id, t.value, tt.sort as sortno from ENGINEERING_TYPE t left join ENGINEERING_TYPE tt ...

  5. android.os.NetworkOnMainThreadException 异常处理

    当我试图在UI线程(MainActivity)连接网络的时候,运行时抛出异常droid.os.NetworkOnMainThreadException 安卓的官方文档说 The exception t ...

  6. Cookie的属性(cookie的设置、获取和删除)

    每个cookie都有四个可选的属性,他们分别控制cookie的生存周期.可见性.安全性等. Cookies最初设计时,是为了CGI编程.但是,我们也可以使用Javascript脚本来操纵cookies ...

  7. Matlab图像函数之pie

    一.pie pie用于描绘平面饼图. (1)pie(X) 利用向量X中的数据描绘饼图. 例如: X = [1, 1, 2, 2, 3, 4, 5]; pie(X) 得到 注意,X中的数据被看做频数,饼 ...

  8. Android -tool工具UIautomatorviewer提示“不能让屏幕黑屏”

    Android中有很多工具可以让我们使用,我使用比较多的有属DDMS,UIautomatorviewer,DDMS中信息也很强大,有空的时候在理理 这篇博主写的很详细:http://www.cnblo ...

  9. 如何在Xilinx ISE中使用TCL提高工作效率

    http://wenku.baidu.com/link?url=jxtsPLGUlWwYuD8TtfWYYU_NhY5Qty3rx8ZDLCkINLe39JRGb90V5HoJhnkn9r_PQ6vZ ...

  10. tcpdf MultiCell line break

    在程序中,我遇到MultiCell中显示三个字符串,开始时 $pdf->MultiCell(63.5, 30, $name."\n".$address."\n&qu ...