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
  • 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

  在我们的类层次结构中加入另外两个成员:FreezableAnimatable

  

  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,希望能多多关注~

时间: 2024-10-08 03:47:16

2000条你应知的WPF小姿势 基础篇<69-73 WPF Freeze机制和Template>的相关文章

2000条你应知的WPF小姿势 基础篇&lt;1-7&gt;

在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师,对C#和WPF有着极深的热情.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,000 Things You Should Know About WPF .听到博客名字就懂这个人有多伟大了吧.他以类似微博式的150字简短语言来每天更新一条WPF和C#重要又容易被遗忘的知识.Follow他的博客也有一段日子了,很希望能够分享给大家. 本系列我不仅会翻译

2000条你应知的WPF小姿势 基础篇&lt;63-68 Triggers和WPF类逻辑结构&gt;

原文:2000条你应知的WPF小姿势 基础篇<63-68 Triggers和WPF类逻辑结构> 在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,000 Things You Should Know About WPF .他以类似微博式的150字简短语言来每天更新一条WPF和C#重要又容易被遗忘的知识.很希望能够分享给大家. 本系列我不仅会翻译他的每

2000条你应知的WPF小姿势 基础篇&lt;8-14&gt;

在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师,对C#和WPF有着极深的热情.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,000 Things You Should Know About WPF .听到博客名字就懂这个人有多伟大了吧.他以类似微博式的150字简短语言来每天更新一条WPF和C#重要又容易被遗忘的知识.Follow他的博客也有一段日子了,很希望能够分享给大家. 本系列我不仅会翻译

2000条你应知的WPF小姿势 基础篇&lt;78-81 Dialog/Location/WPF设备无关性&gt;

在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,000 Things You Should Know About WPF .他以类似微博式的150字简短语言来每天更新一条WPF和C#重要又容易被遗忘的知识.很希望能够分享给大家. 本系列我不仅会翻译他的每一个tip,也会加入自己开发之中的看法和见解.本系列我希望自己也能和他一样坚持下来,每天的进步才能

2000条你应知的WPF小姿势 基础篇&lt;74-77 WPF 多窗口Tips&gt;

在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,000 Things You Should Know About WPF .他以类似微博式的150字简短语言来每天更新一条WPF和C#重要又容易被遗忘的知识.很希望能够分享给大家. 本系列我不仅会翻译他的每一个tip,也会加入自己开发之中的看法和见解.本系列我希望自己也能和他一样坚持下来,每天的进步才能

2000条你应知的WPF小姿势 基础篇&amp;lt;34-39 Unhandled Exceptions和Resource&amp;gt;

position:static(静态定位) 当position属性定义为static时,可以将元素定义为静态位置,所谓静态位置就是各个元素在HTML文档流中应有的位置 podisition定位问题.所以当没有定义position属性时,并不说明该元素没有自己的位置,它会遵循默认显示为静态位置,在静态定位状态下无法通过坐标值(top,left,right,bottom)来改变它的位置. position:absolute(绝对定位) 当position属性定义为absolute时,元素会脱离文档流

2000条你应知的WPF小姿势 基础篇&amp;lt;34-39 Unhandled Exceptions和Resource&amp;gt;注灼遵着状庄

http://www.ebay.com/cln/1x9_jvbf/2015-01-30/166865706016 http://www.ebay.com/cln/1p3_ldzd/2015-01-30/166563237019 http://www.ebay.com/cln/3p3_ljpl/2015-01-30/166730991014 http://www.ebay.com/cln/1bv_lzbb/2015-01-30/167021601015 http://www.ebay.com/cl

2000条你应知的WPF小姿势 基础篇&amp;lt;1-7&amp;gt;

position:static(静态定位) 当position属性定义为static时,可以将元素定义为静态位置,所谓静态位置就是各个元素在HTML文档流中应有的位置 podisition定位问题.所以当没有定义position属性时,并不说明该元素没有自己的位置,它会遵循默认显示为静态位置,在静态定位状态下无法通过坐标值(top,left,right,bottom)来改变它的位置. position:absolute(绝对定位) 当position属性定义为absolute时,元素会脱离文档流

前端开发工程师应知应会之网页渲染(翻译)

作者:Alexander Skutin , 2014.5.26 . 由Max shirshin与2014年6月30日翻译(俄语 -> 英语) 现今我们应更加注重网页渲染,及其在web开发中的重要性.虽然很多文章都曾谈到这一主题,但大多是分散和割裂的.譬如为了对这个主题有更全面的认识需要去搜索很多的信息来源,而这也是笔者决定写这篇文章的原因.笔者相信本篇文章会有益于初级开发者,当然对希望能够更新和整理已有知识的中高级开发者同样能够有所裨益. 当页面布局定义完成后,页面渲染的过程与样式和脚本所承担的