WPF编程基础入门 ——— 第三章 布局(一)布局原则

WPF 布局简述

WPF布局是通过面板(Panel)对页面元素进行全面规划和安排。简单地说,就是把一些控件有条理地摆放在界面上合适的位置。在应用程序界面设计中,合理的元素布局至关重要,它可以方便用户操作,并用清晰的页面逻辑呈现用户信息。
如果内置布局控件不能清足需要,用户还可以创建自定义的布局元素


WPF 布局原则

WinForm的布局是采用基于坐标的方式,当窗口内容发生变化时,里面的控件不会随之动态调整,用户体验不够好。而WPF采用了基于流的布局方式,像Web开发模式流式布局特点是:所有的元素总是默认地自动向左上角靠近,在设计时,通过控制元素相对位置的方式使其达到预计的效果,即元素的位置依赖于相邻元素的位置和尺寸。

合成布局元素

WPF的合成布局模型是用来满足广泛的应用场景布局,允许某种布局控件被嵌套在其他布局控件中。合成布局模型通过布局契约来实现子控件父布局控件间的通信问题。布局契约包括两种设计思想,即根据内容调整尺寸和两段布局。

1.根据内容调整尺寸

根据内容调整尺寸,即每个控件都根据内容来确定控件大小,这个设计思想应用于UI中的所有控件。例如,窗口能够调整大小来适应它们内部的控件,文本框控件能调整尺寸来适应它内部的文本。当然每个元素会被询问其期望的尺寸大小,以确保根据内容调整尺寸的设计思想能够实施。

2.两段布局

两段布局是指在两个完全不同的阶段来确定控件的最佳尺寸。在这两个阶段布局模型让父布局控件和子控件达成元素最后尺寸的约定。两个阶段分别是测量(Measure)排列(Arrange) 。测量阶段需要做的主要工作是:对整个UI页面的检测,并询问每个元素的期望尺寸(Desired Size) ,元素返回一个可用的尺寸(Avilable Size),当所有的元索都被询问并测量好以后,就进入到排列阶段。在排列阶段,父元素通知每个子元素的实际尺寸(Actual Size)和位置
在两段布局中。父元素和子元素需要协商出需要的尺寸大小,涉及可用尺寸 ,期望尺寸、实际尺寸,在此辨析3个尺寸。其中,可用尺寸是测量阶段的初始约束值,即父元素愿意给子元素的最大空间值;期望尺寸是子元素想要的尺寸实际尺寸是父元元素分配给子元素的最终尺寸。这3个尺寸要符合下面的不等式条件:

  • Desired Size ≤ Actual Size ≤ Available Size

了解WPF合成布局模型,学习WPF布局机制,才能理解合成布局模型的来龙去陆页面布局时做到得心应手。

布局机制

WPF界面上的每个元素的边界框尺寸和排列是WPF自动计算出来的。通过WPF合成布局模型的学习,了解WPF渲染布局的过程中,执行测量( Measure)排列(Arrango) 两个步骤。在布局机制中,详细分解在WPF布局的不同阶段,后台类的调用过程。在测量阶段,布局容器遍历所有子元素,并询问子元素所期望的尺寸;在排列阶段,布局控件在合适的位置放置子元素,并设置元素的最终尺寸;这是一个递归的过程,界面中任何一个容器元素都会被遍历到。
因为面板可以嵌套,所以处理过程是递归的,布局(Layout)处理的过程如下图所示:

UlElement.Measure(Size availableSize)
FrameworkElement.MeasureCore(Size availableSize)
FrameworkElement.MeasureOverride(Size availableSize)
UlElementArrange(Rect finalRect)
FrameworkElement.ArrangeCore(Rect finalRect)
FrameworkElement.ArrangeOverride(Rect finalRect)

在此,简要说明WPF布局处理过程。由WPF框架可知,所有UI元素的根元素后UIElement类型,在UlElement中定义了一些基本的关于UI显示的属性(如Clip和Visibility) 。在UIElement.Measure(Size availableSize) 方法执行阶段,就是对这些基本属性做评估,获得适合的Size。同样,FrameworkElement.MeasureCore(Size availablblesiz) 方法评估时,在FrameworkElement中定义且有可能影响UI布局的属性,得出更适合的Size,这个Size将被传递给FrameworkElement.MeasureOverride(Size availbeSize) WPF提供的Panel类型(如Grid)中就会重写该方法来处理,处理完后将得到个系统期望的Size(称为DesiredSize) 。布局系统将按照这个Size来显示该Element,测量(Measure)阶段结束。Size确定后,把Size包装为Rect实例,传递给UIElement.Arrange(Rect,finalRect) ,进行排列(Arrange)处理。根据Size值,Arrange方法为元素创建边界框,边框打包到Rect实例,传给FrameworkElement.ArrangeCore(Rect finalRet) 方法。ArrangeCore将继续评估DesiredSize,计算边界留白(Margin,Padding)等信息,获得ArrangeSize,并传给FrameworkElement.Arrangeovrride(Size finalSize) 。这个方法也是可重写的,WPF提供的Panel类型会重写该方法来处理,最终获得finalSize. 当finalSize 确定后,ArrangeOverride执行完毕。控制权回到ArrangeCore方法, ArrangeCore把该Element放到它的边界框中。到此,该Element的Layout处理完成

布局通用属性

所有的WPF布局面板都由System.Windows.Controls.Panel抽象类派生。Panel就是所有布局元素的基类,用于放置和排列WPF元素,这个抽象类包含3个公共属性:BackgroundChildrenIsItemHost(IsItemHost标志着控件是不是类似TreeView 和ListView这样的控件)。布局容器内的子元素对自身的对齐方式(HorizontalAlignment、VerticalAlignment)、宽度(Width)、高度(Height)、四周间隙(Margin)等有一定的决定权。子元素可以设置自身的布局属性来调整自己的位置和大小。
下表给出了WPF布局面板中的通用属性:

属性名称表征意义
Background布局面板背景着色,在响应鼠标事件时,该值非空(含透明)
Children布局面板中存储的条目集合,条目还可以含更多的条目
IsItemHost布尔值,是否为由ItemsControl生成的UI项的容器
HorizontalAlignment水平对齐方式,有Center、Left.、Right、Stretch属性值可选
VerticalAlignment垂直对齐方式,有Center、Left、Right、Stretch属性值可选
MinWidth/MinHeight最小宽度尺寸/最小高度尺寸,默认单位是像素
MaxWidth/MaxHeight最大宽度尺寸/最大高度尺寸,默认单位是像素
Width/Height宽度尺寸/高度尺寸,默认单位是像索
Margin在元素周围空白尺寸,默认单位是像素

WPF布局面板

WPF的布局面板实现基本的布局,布局面板类型有CanvasDockPanelStackPanelWrapPanelGridUniformGrid

布局面板的类型及其使用规则

布局面板类型使用规则
Canvas画布。通过Top、Left、Right 和 Bottom 4个属性将子元素定位
DockPanel停靠面板。让子元素停靠在整个面板的某一条边上,然后拉伸元素以填满全部宽度或高度。
类似于Windows Form编程中控件的Dock属性
StackPanel堆式面板。子元素按照声明的先后顺序,自上往下或从左往右摆放
WrapPanel自动折行面板。子元素按照声明的先后顺序,从左往右摆放,摆满一行后,自动折行。
与HTML中的流式布局相似
Grid网格。通过定义行高和列宽来调整子元素。类似于HTML中的Table.
UniformGrid画布。通过Top、Left、Right 和 Bottom 4个属性将子元素定位

小结

本章的第一部分重点介绍了WPF布局原则。但是布局内容远不止这些,当了解更多的控件以后,可以做出个性化的布局。一个好的布局,能让UI根据用户的需求调整屏幕大小,窗口的大小,并根据内容来改变尺寸。在之后的章节中会依次讲到本文所提到的的布局面板并详细讲述。


相关阅读
上一篇:WPF编程基础入门 ——— 第二章 XAML.
下一篇:WPF编程基础入门 ——— 第三章 布局(二)布局面板Canvas.
WPF编程基础入门 ——— 目录导航.

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
WPF(Windows Presentation Foundation)是一种用于创建Windows应用程序的界面开发技术,其基于.NET Framework平台,并使用C#编程语言进行开发。WPF提供了一套强大的工具和框架,使开发人员能够轻松创建富有吸引力、功能丰富的用户界面。 WPF与传统的Windows Forms相比具有许多优势。首先,WPF支持更加灵活和现代化的用户界面设计,可以轻松地创建透明、动画和多媒体效果等视觉效果。其次,WPF具有更好的分离性,允许开发人员将界面逻辑与业务逻辑进行分离,使代码更加清晰和易于维护。此外,WPF还支持数据绑定和样式模板等功能,使界面开发更加高效和可重用。 在使用WPF进行编程时,首先需要了解XAML(Extensible Application Markup Language)语言,它用于定义WPF界面元素和布局。然后,使用C#语言编写代码逻辑,处理用户交互、数据绑定、事件处理等方面的功能。在WPF中,可以通过使用命令模式和MVVM(Model-View-ViewModel)架构来组织和管理代码,以实现更好的代码分离性。 另外,WPF提供了丰富的控件库,开发人员可以使用这些控件来构建各种功能和复杂的界面。同时,WPF还支持自定义控件的开发,开发人员可以根据具体需求创建自己的控件。 总之,WPF是一种强大的界面开发技术,可以帮助开发人员创建出具有丰富功能和吸引力的Windows应用程序。同时,使用C#语言进行开发可以使开发过程更加高效和灵活。无论是初学者还是有经验的开发人员,都可以从WPF编程宝典中学习到丰富的知识和技巧,提高自己的WPF编程能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

W.Lionel.Esaka

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值