一、概述

了解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. Using the EventManager

    Using the EventManager This tutorial explores the features of zend-eventmanager in-depth. Terminolog ...

  2. 斐波那契数列_java版本

    package 斐波那契数列; public class fbnq { public static void main(String[] args){ System.out.println(fibon ...

  3. 【转】java静态代码块和构造方法执行顺序

    先看看下面几个类,然后判断它们的输出public class A { static{System.out.print(1);}public A(){System.out.print(2);}} pub ...

  4. oracle的sql函数

    只读事务set transaction read only当一个用户添加了只读事务,则查询时只会查到设置只读事务之前的内容,在并发量大的系统中,通过设置只读事务 便于统计 oracle的sql函数的使 ...

  5. Spring-boot访问MongoDB

    1.访问配置信息 package hello; import org.springframework.context.annotation.Bean; import org.springframewo ...

  6. [转]How to: Execute Oracle Stored Procedures Returning RefCursors

    本文转自:http://www.telerik.com/help/openaccess-orm/openaccess-tasks-oracle-execute-sp-result-set.html I ...

  7. 【模拟】UVa 1030 - Image Is Everything

    1030 - Image Is Everything Time limit: 3.000 seconds Your new company is building a robot that can h ...

  8. Java基础环境搭建

  9. 如何提高jQuery的性能

    缓存变量DOM遍历是昂贵的,所以尽量将会重用的元素缓存. // 糟糕 h = $('#element').height(); $('#element').css('height',h-20); // ...

  10. scala学习笔记:控制抽象

    def repeat(n:Int)(action: =>Unit)=for(i<-1 to n)action var i = 0 repeat(5){ println(i=i+1) } 另 ...