WPF编程宝典 - 07Application类
应用程序的生命周期
在 WPF 中,应用程序会经历简单的生命周期。在应用程序启动后,将立即创建应用程序对象。在应用程序运行时触发各种应用程序事件,您可以选择监视其中的某些事件。最后,当释放应用程序对象时,应用程序将结束。
创建Application对象
手动创建Application对象启动Wpf应用
设置项目属性的EnableDefaultApplicationDefinition属性为false使WPF应用不自动生成Main函数
123456<PropertyGroup> ... <!-- +++ --> <EnableDefaultApplicationDefinition>false</EnableDefaultApplicationDefinition> <!-- +++ --></PropertyGroup>
新建自己的文件
12345678910class Program{ [STAThread] public static void ...
WPF编程宝典 - 06控件
控件类
所有控件都继承自System.Windows.Control类,该类添加了一小部分基本的基础结构:
设置控件内容对其方式的能力
设置Tab键顺序的能力
支持绘制背景、前景和边框
支持格式化文本内容的尺寸和字体
Brush
WPF设置前景色和背景色不是采用简单的颜色值,而是采用更强大的Brush对象,WPF提供了三种画刷:
SolidColorBrush(实心画刷) 12345<Grid> <Grid.Background> <SolidColorBrush Color="LightGreen"/> </Grid.Background></Grid>
LinearGradientBrush(线性渐变画刷) 1234567891011<Grid> <Grid.Background> <!-- 起点(0,0) 终点(1,1) 表示渐变方向为左上角 → 右下角 --> <!-- Offs ...
WPF编程宝典 - 05路由事件
路由事件
路由事件时具有更强传播能力的事件——它们可在元素树中向上冒泡和向下隧道传播,并且沿着传播路径被事件处理程序处理。路由事件允许事件在某个元素上被处理(如标签),即使该事件源自另一个元素(如标签内部的一幅图像)也是如此。与依赖项属性一样,可通过传统的方式使用路由事件——通过关联具有正确签名的事件处理程序——但为了使用路由事件的所有功能,需要理解其工作原理。
理解路由事件
每个.NET开发人员都熟悉“事件”的思想–当有意义的事情发生时,由对象(如WPF元素)发送的用于通知代码的消息。WPF通过事件路由(event routing)的概念增强了.NET事件模型。事件路由允许源自某个元素的事件由另一个元素引发。例如,使用事件路由,来自工具栏按钮的单击事件可在被代码处理之前上传到工具栏,然后上传到包含工具栏的窗口。
定义/注册和封装路由事件
WPF事件模型和WPF属性模型非常类似。与依赖项属性一样,路由事件由只读的静态字段表示,在静态构造函数中注册,并通过标准的.NET事件定义进行封装。
例如,WPF 的Button类提供了大家熟悉的Click事件,该事件继承自抽象的Butt ...
WPF编程宝典 - 04依赖属性
依赖项属性
依赖项属性是标准.NET属性的全新实现–具有大量新增价值。在 WPF的核心特性(如动画、数据绑定以及样式)中需要嵌入依赖项属性。WPF 元素提供的大多数属性都是依赖项属性。依赖项属性的用法和普通属性是相同的。
只能为依赖对象(继承自DependencyObject的类)添加依赖属性。幸运的是,WPF基础结构的关键部分中的大部分都简介继承自DependencyObject类,最明显的例子就是元素
定义依赖项属性
第一步是定义表示属性的对象,它是DependencyProperty类的实例。属性信息应该始终保持可用,甚至可能需要在多个类之间共享这些信息。因此,必须将DependencyProperty对象定义为与其相关联的类的静态字段。
1234public class FrameworkElement : UIElement{ public static readonly DependencyProperty MarginProperty;}
根据约定,定义依赖属性项属性的字段的每次是在普通属性的末尾处加上单词“Property”。根据这种 ...
WPF编程宝典 - 03布局
WPF布局
在WPF中非常抵制基于坐标的布局,而是注重创造更灵活的布局,使布局能够适应内容的变化、不同的语言以及各种窗口尺寸。
布局原则
不应显式设定元素(如控件)的尺寸。元素应当可以改变尺寸以适合它们的内容。可通过设置最大和最小尺寸来限制可以接受的控件尺寸范围
不应使用屏幕坐标指定元素的位置。元素应当由它们的容器根据它们的尺寸/顺序以及(可选的)其他特定于具体布局容器的信息进行排列。如果需要在元素之间添加空白空间。可使用Margin
布局容器的子元素“共享”可用的空间。如果空间允许,布局容器会根据每个元素的内容尽可能为元素设置更合理的尺寸。它们还会向一个或多个元素分配多余的空间
可嵌套的布局容器。布局容器之间可以进行嵌套组合
布局过程
WPF 布局包括两个阶段:测量(measure)阶段和排列(arrange)阶段。在测量阶段,容器遍历所有子元素,并询问子元素它们所期望的尺寸。在排列阶段,容器在合适的位置放置子元素。
布局容器
所有WPF布局容器都是派生自System.Windows.Controls.Panel抽象类的面板。
Panel类的层次结构
Panel类还包 ...
WPF编程宝典 - 02XAML
XAML
XAML对于WPF不是必需的,理解这一点很重要。Visual Studio当然可以使用Windows窗体方法,通过语句代码来构造WPF窗口。但如果这样的话,窗口将被限制在Visual Studio开发环境之内,只能由编程人员使用。
XAML名称空间
12xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:"x=http://schemas.microsoft.com/winfx/2006/xaml"
xmlns特性是XML中的一个特殊特性,他专门用来声明名称空间。这段标记声明了两个名称空间,在创建的所有WPF XAML
文档中都会使用这两个名称控件
http://schemas.microsoft.com/winfx/2006/xaml/presentation是WPF核心名称空间。它包含了所有WPF类,包括用来构建用户界面的控件。在该例中,该名称空间的声明没有使用名称空间前缀,所以它成为整个文档的默认名称空间。换句话说,除非另行指明,每个 ...
WPF编程宝典 - 01概述
WPF概述
WPF(Windows Presentation Foundation)是用于 Windows 的现代图形显示系统。与之前出现的其他技术相比,WPF发生了根本性变化,引入了“内置硬件加速”和“分辨率无关”等创新功能;本章将介绍这两项功能。
WPF应用特点
硬件加速 。通过DirectX执行所有WPF绘图操作,以便充分利用现代显卡的最新功能
分辨率无关。WPF能够根据系统DPI设置,很长灵活地方大和缩小显示的内容,以使其适合所用的显示器和显示选择
控件无固定外观。可自由定制外观
声明式用户界面。通过XAML不必编写代码即可创建窗口
基于对象的绘图。即使准备在更低级的可视化层(而非高级元素层)上工作,也不需要使用绘图和像素进行工作,而是创建图形对象并让 WPF 尽可能最优化地显示出来。
WPF体系结构
WPF 使用多层体系结构。在顶层,应用程序与完全由托管C#代码编写的一组高层服务进行交瓦。至于将.NET 对象转换为Direct3D纹理和三角形的实际工作,是在后台由一个名为milcore.dll 的低级非托管组件完成的。milcore.dll 是使用非托管代码实现的 ...