2000条你应知的WPF小姿势 基础篇<69-73 WPF Freeze机制和Template>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师。最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,000 Things You Should Know About WPF 。他以类似微博式的150字简短语言来每天更新一条WPF和C#重要又容易被遗忘的知识。很希望能够分享给大家。
本系列我不仅会翻译他的每一个tip,也会加入自己开发之中的看法和见解。本系列我希望自己也能和他一样坚持下来,每天的进步才能促成伟大。
在这里郑重说明.该系列是基于Sean Sexton先生的英文博客, Sean Sexton拥有全部版权和撤销权利。
前文可以翻阅本博客wpf标签的文章。查看往期
[小九的学堂,致力于以平凡的语言描述不平凡的技术。如要转载,请注明来源:小九的学堂。cnblogs.com/xfuture]
#69 wpf基础类提供的功能单元
四个基础的WPF类直接或间接继承自DependencyObject, 提供了超出其基础类的不同功能:
- ContentElement adds (继承自 DependencyObject)
- Input events and commanding
- Focus
- Raise and respond to routed events
- Animation support
- FrameworkContentElement adds (继承自 ContentElement)
- Additional input elements (e.g. tooltips, context menus)
- Storyboards
- Data binding
- Styles
- Property value inheritance
- UIElement adds (继承自 DependencyObject)
- via Visual
- Hit testing
- Clipping and coordinate transformations
- Participation in visual tree via parent/child relationships
- Layout behavior (measure/arrange)
- Input events and commanding
- Focus
- Raise and respond to routed Events
- Animation support
- via Visual
- FrameworkElement adds (继承自 UIElement)
- Additional input elements (e.g. tooltips, context menus)
- Storyboards
- Data binding
- Styles
- Property value inheritance
- Support for the logical tree
#70 另外两个基础类:Freezable和Animatable
在我们的类层次结构中加入另外两个成员:Freezable和Animatable

Freezable - 实现“freezable”机制,对象可以提供一个frozen, read-only的复制。
Animatable - 根据Freeable机制提供给对象实现动画的能力。
#71 将Freezable Objects置为Read-Only State
具有Freeable功能的object一般处于read/write状态,可以被设置为read-only,不能更改的状态(Freeze)。一个被冻结(Frozen)的对象在WPF中是高效的,因为它不需要通知用户改动。
Graphical Object,比如Brushes和3D画图也都继承Freezable,初始化的状态均是Unfrozen。
如果你有一个对象不想进行改动,可使用Freeze方法来将其冻结
// Freeze this object, making it read-only (since we don't plan on changing it)
if (theBrush.CanFreeze)
theBrush.Freeze();
冻结后如果你还想修改,则会产生InvalidOperationException.
#72 冻结你决定不修改的图形对象
为了更好的性能,最好将一些图像对象(比如Brushes)来进行冻结处理。
代码中冻结的方法:
// SolidColorBrush, created in XAML, not frozen
bool frozen = tealBrush.IsFrozen; // frozen = false if (tealBrush.CanFreeze)
tealBrush.Freeze(); frozen = tealBrush.IsFrozen; // frozen = true
在Xaml中冻结的方法(要先引入Freeze的命名空间)
<Window x:Class="WpfApplication4.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:po="http://schemas.microsoft.com/winfx/2006/xaml/presentation/options"
Title="MainWindow" Height="350" Width="525" >
<Window.Resources>
<SolidColorBrush x:Key="tealBrush" Color="Teal" po:Freeze="True"/>
</Window.Resources>
#73 两种Template
WPF中存在两种Template: ControlTemplate 和 DataTemplate
ControlTemplate样式定义为控件的定制:
<Button Name="btnWithTemplate" Content="Recreate Me" Foreground="Blue">
<Button.Template>
<ControlTemplate TargetType="{x:Type Button}">
<StackPanel Orientation="Horizontal">
<Label Content="**" Foreground="{TemplateBinding Foreground}"/>
<Button Content="{TemplateBinding Content}" Foreground="{TemplateBinding Foreground}"/>
<Label Content="**" Foreground="{TemplateBinding Foreground}"/>
</StackPanel>
</ControlTemplate>
</Button.Template>
</Button>
DataTemplate允许你加入数据的Binding,主要是数据决定展现样式:
<Label Name="lblPerson" Content="{Binding}">
<Label.ContentTemplate>
<DataTemplate>
<Border BorderThickness="2" BorderBrush="DarkBlue">
<StackPanel Orientation="Vertical">
<StackPanel Orientation="Horizontal">
<Label Content="{Binding Path=FirstName}"/>
<Label Content="{Binding Path=LastName}" FontWeight="Bold"/>
</StackPanel>
<Label Content="{Binding Path=BirthYear}" FontStyle="Italic"/>
</StackPanel>
</Border>
</DataTemplate>
</Label.ContentTemplate>
</Label>
下一期会有更多关于WPF Application和Window,希望能多多关注~
2000条你应知的WPF小姿势 基础篇<69-73 WPF Freeze机制和Template>的更多相关文章
- 2000条你应知的WPF小姿势 基础篇<15-21>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师,对C#和WPF有着极深的热情.最为出色的是他维护了两个博客:2,000Things You Should Know ...
- 2000条你应知的WPF小姿势 基础篇<78-81 Dialog/Location/WPF设备无关性>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...
- 2000条你应知的WPF小姿势 基础篇<74-77 WPF 多窗口Tips>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...
- 2000条你应知的WPF小姿势 基础篇<63-68 Triggers和WPF类逻辑结构>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...
- 2000条你应知的WPF小姿势 基础篇<57-62 依赖属性进阶>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...
- 2000条你应知的WPF小姿势 基础篇<51-56 依赖属性>
前一阵子由于个人生活原因,具体见上一篇,耽搁了一阵子,在这里也十分感谢大家支持和鼓励.现在开始继续做WPF2000系列. 在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件 ...
- 2000条你应知的WPF小姿势 基础篇<45-50 Visual Tree&Logic Tree 附带两个小工具>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...
- 2000条你应知的WPF小姿势 基础篇<40-44 启动关闭,Xaml,逻辑树>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...
- 2000条你应知的WPF小姿势 基础篇<34-39 Unhandled Exceptions和Resource>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...
随机推荐
- 在传统.NET Framework 上运行ASP.NET Core项目
新的项目我们想用ASP.NET Core来开发,但是苦于我们历史的遗产很多,比如<使用 JavaScriptService 在.NET Core 里实现DES加密算法>,我们要估计等到.N ...
- hadoop 2.7.3本地环境运行官方wordcount
hadoop 2.7.3本地环境运行官方wordcount 基本环境: 系统:win7 虚机环境:virtualBox 虚机:centos 7 hadoop版本:2.7.3 本次先以独立模式(本地模式 ...
- GitHub实战系列汇总篇
基础: 1.GitHub实战系列~1.环境部署+创建第一个文件 2015-12-9 http://www.cnblogs.com/dunitian/p/5034624.html 2.GitHub实战系 ...
- ExtJS 4.2 介绍
本篇介绍ExtJS相关知识,是以ExtJS4.2.1版本为基础进行说明,包括:ExtJS的特点.MVC模式.4.2.1GPL版本资源的下载和说明以及4种主题的演示. 目录 1. 介绍 1.1 说明 1 ...
- Node.js:进程、子进程与cluster多核处理模块
1.process对象 process对象就是处理与进程相关信息的全局对象,不需要require引用,且是EventEmitter的实例. 获取进程信息 process对象提供了很多的API来获取当前 ...
- RIFF和WAVE音频文件格式
RIFF file format RIFF全称为资源互换文件格式(Resources Interchange File Format),是Windows下大部分多媒体文件遵循的一种文件结构.RIFF文 ...
- MongoDB集群配置
本文演示:(一个主服务器,一个备份服务器,三个仲裁服务器) 官方推荐副本集的成员数量为奇数,最多12个副本集节点,最多7个节点参与选举. 本文演示基于本机,用端口区分服务(每个服务器下新建db文件夹用 ...
- MATLAB中绘制质点轨迹动图并保存成GIF
工作需要在MATLAB中绘制质点轨迹并保存成GIF以便展示. 绘制质点轨迹动图可用comet和comet3命令,使用例子如下: t = 0:.01:2*pi;x = cos(2*t).*(cos(t) ...
- Visual Studio Code——Angular2 Hello World 之 2.0
最近看到一篇用Visual Studio Code开发Angular2的文章,也是一篇入门教程,地址为:使用Visual Studio Code開發Angular 2專案.这里按部就班的做了一遍,感觉 ...
- TypeScript
TypeScript: Angular 2 的秘密武器(译) 本文整理自Dan Wahlin在ng-conf上的talk.原视频地址: https://www.youtube.com/watch? ...