【WPF学习】第五章 理解WPF的布局

  在Windows开发人员设计用户界面的方式上,WPF布局模型是一个重大改进。在WPF问世之前,Windows开发人员使用刻板的基于坐标的布局将控件放到正确位置。在WPF中,这种方式虽然可行,但已经极少使用。大多数应用程序将使用类似Web的流(flow)布局;在使用流布局模型时,控件可以扩大,并将其他控件挤到其他位置。开发人员能创建与现实分辨率和窗口大小无关的、在不同的显示器上正确缩放的用户界面;当窗口内容发生变化时,界面可调整自身,并且可以自如地处理语言的切换。要利用该系统的优势,首先需要进一步理解WPF布局模型的基本概念和假设。

一、 WPF布局原则

  WPF窗口只能包含单个元素。为在WPF窗口中放置多个元素并创建更贴近实用的用户界面,需要在窗口上放置一个容器,然后再这个容器中添加其他元素。

  在WPF中,布局由您实用的容器来确定。尽管有多个容器可供选择,但“理想的”WPF窗口需要遵循以下几条重要原则:

  • 不应显示设定元素(如控件)的尺寸。元素应当可以改变尺寸以适合它们的内容。例如,当添加更多的文本时按钮应当能够扩展。可通过设置最大和最小尺寸来限制可以接受的控件尺寸范围。
  • 不应使用屏幕坐标指定元素的位置。元素应当由它们的容器根据它们的尺寸、顺序以及(可选的)其他特定与具体布局容器的信息进行排列。如果需要在元素之间添加空白空间,可使用Margin属性。
  • 布局容器的子元素“共享”可用的空间。如果空间允许,布局容器会根据每个元素的内容尽可能为元素设置更合理得尺寸。它们还会向一个或多个子元素分配多余的空间。
  • 可嵌套的布局容器。典型的用户界面使用Grid面板作为开始,Grid面板是WPF中功能最强大的容器,Grid面板可包含其他布局容器,包含的这些容器以最小的分组排列元素,比如带有标题的文本框、列表框中的项、工具栏上的图标以及一列按钮等。

  尽管对于这几条原则而言也有一些例外,但它们反映了WPF的总体设计目标。换句话说,如果创建WPF应用程序时,循环了这些原则,将会创建出更好的、更灵活的用户界面。如果不遵循这些原则,最终将得到不是很适合WPF的并且难以维护的用户界面。 

二、布局过程

  WPF布局包括两个阶段:测量(measure)阶段和排列(arrange)阶段。在测量阶段,容器遍历所有子元素,并询问子元素它们所期望的尺寸。在排列阶段,容器在合适的位置放置子元素。

  当然,元素未必总能等到最合适的尺寸——有事容器没有足够大的空间以适应所含的元素。在这种情况下,容器为了适应可视化区域的尺寸,就必须剪裁不能满足要求的元素。在后面可以看到,通常可通过设置最小窗口尺寸来避免这种情况。

三、布局容器

  所有WPF布局容器都是派生自System.Windows.Controls.Panel抽象类的面板。如下图所示:

  Panel类添加了少量成员,包括三个公有属性,如下表所示:

表 Panel的公有属性

  就Panel基类本身而言没有什么特别的,但他是其它更多特殊类的起点。WPF提供了大量可用于安排布局的继承自Panel的类。下表列出了其中几个最基本的类。与所有WPF控件和大多数可视化元素一样,这些类位于System.Windows.Controls名称空间里。

表 核心布局面板

  除这些核心容器外,还有几个更专业的面板,在各种控件中都可能遇到它们。这些容器包括专门用于包含特定控件子元素的面板——如TabPanel面板(在TabPanel面板中包含多个选项卡)、ToolbarPanel面板(工具栏中的多个按钮)以及ToolbarOverflowPanel面板(Toolbar控件的溢出菜单中的多个命令)。还有VirtualizingStackPanel面板,数据绑定列表空间使用该面板以大幅降低开销;还有InkCanvas控件,该控件和Canvas控件类似,但该控件支持处理平板电脑(TabletPC)上的手写笔(stylus)输入(例如,根据选择的模式,InkCanvas控件,尽管这有点违反直觉)。接下来文章会分别介绍核心容器信息。

原文地址:https://www.cnblogs.com/Peter-Luo/p/12153346.html

时间: 2024-08-28 22:46:53

【WPF学习】第五章 理解WPF的布局的相关文章

《深入浅出wpf》第五章 控件与布局

windows api(win api):调用windows底层绘图函数,使用c语言. microsoft foundation class(mfc):使用c++语法将原始的winapi函数封装成空间类. visual component library(vcl):delphi和c++ builder使用的和mfc相近的类库. visual basic+active控件(vb6):使用组件化的思想把winapi封装成ui控件,以期多语言使用. java swing/awt:java sdk中用于

swift学习第五章-字典的使用

//下面是关于字典的 //字典的格式[key:value] //字典可以存放基本类型和对象类型的 //声明一个字典 var dictionary1=["key1":"鸭鸭","key2":"肉包"] var keyValueCount=dictionary1.count//获取这个字典里面键值对的个数 dictionary1["key1"]="鸡鸡"//改变对应健的值 //updateV

统计学习第五章

统计学习方法第五章 决策树的剪枝 决策树的剪枝方法是用极小化损失函数来计算的 对于此题的解释是C(T)是模型对于训练数据的预测误差,|T|表示模型的复杂程度(在前面讲树T的叶节点的个数为|T|) 是先决定呢还是模型先决定呢?由下面的话 可知先决定,是自己输入的,(由下面的算法可以知道)他的值的大小是怎样确定的呢?值的不同是会影响算法的预测正确率的,有没有专门的算法对其进行分析呢由哪些因素决定呢 CART算法(分类与回归树 classification and regression tree) C

Java基础知识二次学习--第五章 数组

第五章 数组 时间:2017年4月26日15:11:30~2017年4月26日15:15:54 章节:05章_01节  视频长度:09:30 内容:一维数组的内存分析 心得: Java中数组是引用类型 栈里面存的数组的引用 实际对象在堆内存里面 (C与C++是分配在栈里的) 内存图: 元素为引用数据类型的数组 引用类型的数组如上图 时间:2017年4月26日15:16:22~2017年4月26日15:19:00 章节:05章_02节  视频长度:05:25 内容:数组元素的创建与使用 心得: 首

【WPF学习】第一章 XAML介绍

XAML(Extensible Application Markup Language的简写,发音为“zammel”)是用于实例化.NET对象的标记语言.尽管XAML是一种应用于诸多不同问题领域的技术,但其主要作用是构造WPF用户界面.换言之,XAML文档定义了在WPF应用程序中组成窗口的面板.按钮以及各种空间的布局. 一.XAML变体 实际上术语“XAML”有多种含义.到目前为止,我们使用XAML标识整个XAML语言,它是一种基于通用XML语法.专门用于表示一颗.NET对象树的语言(这些对象可

Wpf学习(五) 数据绑定Binding【小达原创】

程序的本质是数据+算法,咱们这一篇就看看wpf程序中的数据是怎样展现在前台的. 1.咱们新建一个Wpf项目.为该项目增加[data]文件夹,在该文件夹中添加[Person]类,如下图: 2.打开[Person]类,键入以下代码: 我们现在有了一个普通的实体类,但是WPF是数据驱动界面的一项技术.(界面的数据源变化后,界面的显示会跟着变化,不需要手动刷新.)这就要求我们''监听""我们的数据源.我们下面看看应该怎么做. 3.在项目中加入[BaseModel]类,在[BaseModel]类

【WPF学习】第九章 使用Canvas面板进行基于坐标的布局

Canvas面板允许使用精确的坐标放置元素,如果设置数据驱动的富窗体和标准对话框,这并非好的选择:但如果需要构建其他一些不同的内容(例如,为图形工具创建创建绘图表面),Canvas面板可能是个有用的工具.Canvas面板还是最轻量级的布局容器.这是因为Canvas面板没有包含任何复杂的布局逻辑,用以改变其子元素的首选尺寸.Canvas面板只是在指定的位置放置其子元素,并且子元素具有所希望的精确尺寸. 为在Canvas面板中定位元素,需要设置Canvas.Left和Canvas.Top附加属性.C

【WPF学习笔记三】空WPF项目元素详解

我们在VisualStudio2010创建了一个空WPF程序,现在我们来对这个空WPF程序的所有元素进行讲解! 1.<Window x:Class="WpfApplication1.MainWindow" 2.        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3.        xmlns:x="http://schemas.microsoft.com/

汇编语言学习第五章-[BX]和loop指令

本博文系列参考自<<汇编语言>>第三版,作者:王爽 1.[bx]和内存单元的描述 [bx]与我们前面见过的[0]类似,mov ax,[0] 的意思是将内存地址为DS:0的两字节内容存入ax中.其中[0]中的0代表的是偏移地址. 类似的,我们有 mov al,[0]的意思是将内存地址为DS:0的单字节内容存入al中.那么我们可以大胆的推断mov ax,[bx]代表的是将偏移地址为bx寄存器中的值的内存地址的两字节内容存入到ax中,其段地址在DS中存储. 2.关于定义的描述性符号: &