WPF编程宝典 - 13几何图形和图画
路径和几何图形
Path类能够包含任何简单形状、多组形状以及更复杂的要素,如曲线。Path类提供了Data属性,该属性接受一个Geometry对象,该对象定义路径包含的一个活多个图形。不能直接创建Geometry对象,因为Geometry时抽象类,而是需要使用下表的7可派生类中的一个进行创建。
几何图形类
名称
说明
LineGeometry
代表直线,该几何图形相当于Line形状
RectangleGeometry
代表矩形(可以具有圆形拐角),该几何图形相当于Rectangle形状
EllipseGeometry
代表椭圆,该图形相当于Ellipse形状
GeometryGroup
为单个路径添加任意多个Geometry对象,使用EvenOdd活NonZero填充规则来确定要填充的区域
CombinedGeometry
将两个几何图形合并为一个形状。可使用CombineMode属性选择如何组合两个几何图形
PathGeometry
代表更复杂的由弧线、曲线以及直线构成的图形,并且既可以时闭合的,也可以不是闭合的
StreamGeometry ...
WPF编程宝典 - 12形状、画刷和变换
理解形状
在WPF用户界面中,绘制2D图形内容的最简单方法时使用形状(Shape)——专门用于表示简单的直线、椭圆、矩形以及多边形的一些类。从技术角度看,形状就是所谓的绘图图元(Primitive)。可组合这些基本元素来创建更复杂的图形
关于 WPF 中形状的最重要细节是,它们都继承自FrameworkElement类。因此,形状是元素。这样会带来许多重要的结果:
形状绘制自身:不需要管理无效的情况和绘图过程。例如,当移动内容、改变窗口尺寸或改变形状属性时,不需要手动重新绘制形状。
使用与其他元素相同的方式组织形状:换句话说,可在任何布局容器中放置形状(尽管 Canvas 明显是最有用的容器,因为它允许在特定的坐标位置放置形状,当构建复杂的具有多个部分的图画时,这很重要)。
形状支持与其他元素相同的事件:这意味着为了处理焦点、按下键盘、移动鼠标以及单击鼠标等,不必执行任何额外工作。可使用用于其他元素的相同事件集,并同样支持工具提示、上下文菜单和拖放操作。
Shape类
每个形状都继承自抽象类System.Windows.Shapes.Shape。下图显示了形状类的继承层 ...
WPF编程宝典 - 11样式和行为
样式(style)时组织和重用格式化选项的重要工具。不是使用重复的标记填充XAML,以便设置外边距、内边距、颜色以及字体等细节,而是创建一系列封装所有这些细节的样式,然后在需要之处通过属性来应用样式
行为(behavior)时一款重用用户界面代码的更有挑战性的工具。其基本思想时:使用行为封装一些通用的UI功能(例如,使元素可被拖动的代码)。如果具有适当的行为,可使用一两行XAML标记将其附加到任意元素,从而节省编写和调试代码的工作。
样式基础
样式是可应用于元素的属性值集合。WPF 样式系统与 HTML标记中的层叠样式表(CascadingStyle Sheet,CSS)标准担当类似的角色。与 CSS 类似,通过 WPF 样式可定义通用的格式化特性集合,并且为了保证一致性,在整个应用程序中应用它们。与CSS样,WPF样式也能够自动工作,指定具体的元素类型为目标,并通过元素树层叠起来。然而,WPF样式的功能更加强大,因为它们能够设置任何依赖项属性。这意味着可以使用它们标准化未格式化的特性,如控件的行为。WPF样式也支持触发器(trigger),当属性发生变化时,可通过触发器改 ...
WPF编程宝典 - 10资源
资源基础
WPF允许在代码中以及在标记中的各个位置定义资源(和特定的控件、窗口一起定一,或在整个应用程序中定义)。资源具有很多重要的优点,如下所述:
高效:可以通过资源定义对象,并在标记中的多个地方使用。这会精简代码,使其更高效
可维护性:可通过资源使用低级的格式化细节(如字号),并将它们移到便于对其进行修改的中央位置。在XAML中创建资源相当于在代码中创建常量。
适应性:一旦特定信息与应用程序的其他部分分离开来,并放置到资源部分中,就可以动态地修改这些信息。例如,可能希望根据用户的个人喜好或当前语言修改资源的细节。
资源集合
每个元素都有Resources属性,该属性存储了一个资源字典集合(它是ResourceDIctionary类的示例)。资源集合可包含任意类型的对象,并根据字符串编写索引。
尽管每个元素都提供了 Resources 属性(该属性作为 FrameworkElement 类的一部分定义),但通常在窗口级别定义资源。这是因为每个元素都可以访问各自资源集合中的资源,也可以访问所有父元素的资源集合中的资源。
12345678<Window.Resour ...
WPF编程宝典 - 09命令
理解命令
所谓的命令——并将控件连接到命令,从而不需要重复编写事件处理代码。更重要的是,当连接的命令不可用时,命令特性通过自动禁用控件来管理用户界面的状态。命令模型还为存储和本地化命令的文本标题提供了一个中心场所。
将事件映射到命令
虽然WPF命令系统是一款简化应用程序设计的优秀工具,但仍有一些很重要的问题没有解决。特别是,WPF 对以下方面没有提供任何支持:
命令跟踪(例如,保留最近命令的历史)
“可撤销的”命令
具有状态并可处于不同“模式”的命令(例如,可被打开或关闭的命令)
命令模型
WPF命令模型由许多可变的部分组成。总之,它们具有如下4个重要元素:
命令:命令表示应用程序任务,并且跟踪任务是否能够被执行,然而,命令实际上不包含执行应用程序任务的代码。
命令绑定:每个命令绑定针对用户界面的具体区域,将命令连接到相关的应用程序逻辑。这种分解的设计是非常重要的,因为单个命令可用于应用程序中的多个地方,并且在每个地方具有不同的意义。为处理这一问题,需要将同一命令与不同的命令绑定。
命令源:命令源触发命令。例如,MenuItem和Button都是命令元。单击它们都会 ...
WPF编程宝典 - 08元素绑定
将元素绑定到一起
数据绑定的最简单情形是,源对象是WPF元素而且源属性是依赖属性。
绑定表达式
数据绑定表达式使用XMAL标记扩展(因此具有花括号)。因为正在创建System.Windows.DataBinding类的一个实例,所以绑定表达式以单词Binding开头。尽管可采用多种方式破诶只Binding对象,但本示例只需要设置两个属性:ElementName属性(指示源元素)和Path属性(指示源元素中的属性)
1234<StackPanel> <Slider x:Name="silder" Minimum="10" Maximum="100"/> <TextBlock FontSize="{Binding ElementName=silder,Path=Value}" Text="Simple Text"/></StackPanel>
之所以使用名称Path而不是Property,是因为Path ...
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”。根据这种 ...