一、概述

了解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. 基于cocos2d-x的游戏框架设计——李成

    视频:http://v.youku.com/v_show/id_XMzc5ODUyMTI4.html?f=17330006 网易科技讯 3月31日,第四届CocoaChina开发者大会暨Cocos2d ...

  2. c/c++将整数转换为字符串

    #include <iostream> using namespace std; int main(int argc, char **argv) { ; iint i,j; ],e[]; ...

  3. PHP代码实现MySQL读写分离

    关于MySQL的读写分离有几种方法:中间件,Mysql驱动层,代码控制 关于中间件和Mysql驱动层实现Mysql读写分离的方法,今天暂不做研究, 这里主要写一点简单的代码来实现由PHP代码控制MyS ...

  4. 关于Git的暂存区这个概念的理解.

    Git中的暂存区成为stage或者是index.可以理解成一个"提交任务".Git暂存区是Git最成功的设计之一,但是也是最难理解的. 暂存区是一个介于工作区和版本库的中间状态.当 ...

  5. 百度地图SDK下载以及创建应用(申请Key)和本地导入Demo

    一.百度地图SDK下载 http://lbsyun.baidu.com/sdk/download?selected=location 选择全部,然后分别下载开发包.示例代码.类参考. 二.创建应用(申 ...

  6. Flash cs6 如何从FLA 文件导出sound文件

    Flash. How to export sound from the FLA file extract sound from a fla 第一个是图文教程,在下面还有"watch vide ...

  7. asp发布至IIS

    最近做的一个任务是使用asp写的,显示的是数据库的报表,但是将报表当前目录发布至IIS后,发现还是运行不了 Set conn = Server.CreateObject("ADODB.Con ...

  8. 自己写http获取网络资源和解析json数据

    虽然github上有很多开源的,方便的jar报,用起来也很方便,但我们也需要了解其中的原理,如何自己不用第三方jar包来获取网络资源 主要代码如下:  因为联网是耗时的操作,所以需要另开一个线程来执行 ...

  9. 通过SPList Definition自定义ListItem打开编辑详细页面

    在SharePoint中对列表SPList的操作里,常常希望当增加一个条目后还希望关联做一些其它的操作 而SharePoint自身提供的Item操作页面却没有那么灵活:所以通常情况下,我们专门为其提供 ...

  10. c# 单例模式[Singleton]之深夜闲聊

    都有点记不起认识单例模式(也有叫单件模式的)是在什么时候了,有时候东西认多了不常用的话也经常抛之脑后甚至逐渐从大脑里被移除.不闲扯了,直接入正题吧. 什么是单例模式? 保证在整个应用程序的生命周期中, ...