1. # Freezable 对象(WPF) #
  2.  
  3. > Freezable 继承自 DependencyObject,同时添加了 Freezable 方法,用于冻结对象。
  4.  
  5. ---
  6.  
  7. ## 冻结对象 ##
  8.  
  9. 以此为示例
  10.  
  11. ```ruby
  12. def say_hi
  13. print "hello world"
  14. end
  15. ```
  16. ```cs
  17. namespace ConsoleApplication2
  18. {
  19. public class Person : Freezable
  20. {
  21. public string Name
  22. {
  23. get { return (string)GetValue(NameProperty); }
  24. set { SetValue(NameProperty, value); }
  25. }
  26.  
  27. public static readonly DependencyProperty NameProperty =
  28. DependencyProperty.Register("Name", typeof(string), typeof(Person), new UIPropertyMetadata(0));
  29.  
  30. protected override Freezable CreateInstanceCore()
  31. {
  32. throw new NotImplementedException();
  33. }
  34.  
  35. }
  36. }
  37. ```
  38.  
  39. 现实生活中,人的名字是不可以随便更改的,当名字定下来以后,就把该对象冻结了,那么就不能再修改此对象的属性了,如下
  40.  
  41. ```cs
  42. namespace ConsoleApplication2
  43. {
  44. class Program
  45. {
  46. static void Main(string[] args)
  47. {
  48. Person person = new Person();
  49. person.Name = "Chang weihua";
  50. person.Freeze();
  51.  
  52. //不能再赋值了
  53. person.Name = "Changweihua 2013";
  54.  
  55. Console.ReadKey(true);
  56. }
  57. }
  58. }
  59. ```
  60.  
  61. ## 依赖对象与冻结 ##
  62.  
  63. 当调用 Freeze 方法后,DependencyObject 将会成为一个密封类(Sealed)。一旦 DependencyObject 成为密封类,那么内部将无法修改依赖项属性,这也意味着如果定义普通的 CLR 属性则没有这个问题。
  64.  
  65. ## 冻结状态 ##
  66.  
  67. 1. 在冻结之前,需要知道该对象是否已经冻结(IsFrozen),当冻结之后, IsFrozen True
  68. 2. 即使继承了 Freezable 的对象,并非随时都可以冻结,在调用 Freeze 方法之前,需要查看 CanFrozen 属性判断该对象是否可以冻结(如果该对象可以冻结,即使调用 Freeze 方法后,该属性还是 True),否则会报错。
  69. 3. 冻结后的对象无法解冻,必须采用克隆的方法创建一个新对象。
  70.  
  71. ## 无法冻结的情况 ##
  72.  
  73. 1. 绑定时
  74. 当一个 DependencyProperty 对象其中有 DependencyProperty 有绑定时,无法冻结,当 DependencyProperty 接触绑定之后可以(如果进行了绑定就意味着值可能会被修改,那么该对象就是被冻结了的了)
  75.  
  76. ```cs
  77. namespace ConsoleApplication2
  78. {
  79. class Program
  80. {
  81. static void Main(string[] args)
  82. {
  83. Person person = new Person();
  84.  
  85. BindingOperations.SetBinding(person, Person.NameProperty, new Binding("Name") { Source = person });
  86. if (person.CanFreeze)
  87. person.Freeze();
  88.  
  89. person.Name = "Chang weihua";
  90.  
  91. Console.WriteLine(person.Name);
  92.  
  93. //解除绑定
  94. BindingOperations.ClearBinding(person, Person.NameProperty);
  95. //解除绑定之后可以赋值
  96. person.Name = "Changweihua 2012";
  97. Console.WriteLine(person.Name);
  98.  
  99. if (person.CanFreeze)
  100. person.Freeze();
  101.  
  102. //不能再赋值了
  103. //person.Name = "Changweihua 2013";
  104. //Console.WriteLine(person.Name);
  105.  
  106. Console.ReadKey(true);
  107. }
  108. }
  109. }
  110. ```
  111.  
  112. 2. Freezable 中定义的 DependencyProperty 属性类型必须是值类型或者是 Freezable 类型。
  113. 比如在其中定义一个 Button 类型(非 Freezable 类型)的 DependencyProperty,当其中有值时,则无法冻结。
  114.  
  115. ## Freezable 特性 ##
  116.  
  117. 1. 可子属性变更通知
  118. 2. 克隆
  119.  
  120. 如果定义的属性均为依赖属性,那么克隆就会变得很简单,调用父类方法就行,如
  121.  
  122. ```cs
  123. public SolidColorBrush Clone()
  124. {
  125. return (SolidColorBrush)base.Clone();
  126. }
  127. ```
  128.  
  129. 3. 冻结之后的对象将与 UI 线程分离
  130.  
  131. 其会将内部的 Dispatcher 属性设置为空,就是需要注意的。
  132.  
  133. 总结:当对象不需要发生改变时,则冻结该对象,减少对象监听,提示性能

Freezable 对象(WPF)的更多相关文章

  1. Freezable 对象概述 | Microsoft Docs

    原文:Freezable 对象概述 | Microsoft Docs Freezable 对象概述Freezable Objects Overview 2017/03/30 本文内容 什么是可冻结的? ...

  2. Visual对象——WPF

    System.Object        System.Windows.Threading.DispatcherObject                System.Windows.Depende ...

  3. WPF优化:Freezable冻结对象

    原文:WPF优化:Freezable冻结对象 WPF虽然很美观,效果很炫,但是对资源的消耗也很大,尤其是初次接触WPF的人,因为很多地方虽然实现了想要的效果,但是由于经验问题,所以也会造成很大的资源浪 ...

  4. WPF性能提高--MSDN学习摘要

    关于性能 一.    关于硬件加速 1.对于大多数图形硬件而言,大型图面是指达到 2048x2048 或 4096x4096 像素大小的图面. 二.    合理的布局 1.简单地说,布局是一个递归系统 ...

  5. WPF:理解TileBrush(ImageBrush,DrawingBrush和VisualBrush)

    ImageBrush:利用图像绘制区域 ImageBrush 是一种将自身内容定义为图像的 TileBrush,图像通过它的 ImageSource 属性指定. 您可以控制图像的拉伸.对齐和平铺方式, ...

  6. WPF&Silverlight5 常用功能差异

    一晃从Wpf转到sl也有半年多了,总想总结一下wpf和sl的差异,今天终于下笔. 首先来个整体图: 通过上图可以发现其实sl只是使用了wpf的一小部分,只是sl依赖的freamwork有很大部分都一样 ...

  7. 【WPF学习笔记】之WPF基础:依赖关系属性和通知

    这些天来,对象似乎已经忙得晕头转向了.每个人都希望它们做这做那.Windows® Presentation Foundation (WPF) 应用程序中的典型对象会接到各种各样不同的请求:有要求绑定到 ...

  8. WPF 中那些可跨线程访问的 DispatcherObject(WPF Free Threaded Dispatcher Object)

    原文 WPF 中那些可跨线程访问的 DispatcherObject(WPF Free Threaded Dispatcher Object) 众所周知的,WPF 中多数对象都继承自 Dispatch ...

  9. 关于WPF你应该知道的2000件事

    原文 关于WPF你应该知道的2000件事 以下列出了迄今为止为WPF博客所知的2,000件事所创建的所有帖子. 帖子总数= 1,201 动画 #7 - 基于属性的动画 #686 - 使用动画制作图像脉 ...

随机推荐

  1. iOS “请在微信客户端打开链接” UIWebview加载H5页面携带session、cookie、User-Agent信息 设置cookie、清除cookie、设置User-Agent

    公司新开的一个项目..内容基本上是加载H5页面显示..当时觉得挺简单的..后来发现自己掉坑里了..一些心理历程就不说了..说这个项目主要用到的知识点吧..也是自己踩得坑. 首先说说..这个项目上的内容 ...

  2. EF——Guid类型数据的自增长、时间戳和复杂类型的用法 03 (转)

    EF里Guid类型数据的自增长.时间戳和复杂类型的用法   通过前两章Lodging和Destination类的演示,大家肯定基本了解Code First是怎么玩的了,本章继续演示一些很实用的东西.文 ...

  3. 1.4.2 solr字段类型--(1.4.2.7)字段属性使用案例

    1.4.2 solr字段类型 (1.4.2.1) 字段类型定义和字段类型属性. (1.4.2.2) solr附带的字段类型 (1.4.2.3) 使用货币和汇率 (1.4.2.4) 使用Dates(日期 ...

  4. TCP/IP协议原理与应用笔记23:路由选择模块 和 路由表的设计

    1. 路由选择模块 和 路由表的设计 2. 路由选择算法(路由模块在路由表中查找算法) (1)用IP分组中的目的IP地址查找路由表,使用匹配表项的下一跳地址完成分组交付 (2)匹配条件: dIP &a ...

  5. Uva 10596 - Morning Walk 欧拉回路基础水题 并查集实现

    题目给出图,要求判断不能一遍走完所有边,也就是无向图,题目分类是分欧拉回路,但其实只要判断度数就行了. 一开始以为只要判断度数就可以了,交了一发WA了.听别人说要先判断是否是联通图,于是用并查集并一起 ...

  6. Amazon全场满$35减$5 (需Facebook)

    在Amazon.com上建一个Wish List(创建Wish List后须点击“Manage your lists”,在“Privacy”那一栏选择“Public”或“Shared”,再回到这个链接 ...

  7. uboot在s3c2440上的移植(1)

    一.移植环境 主  机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand,Kernel:2.6.30.4 编译器:arm-linux-gcc-4.3.2.tgz u-b ...

  8. Picker组件封装

    在开发APP的过程中,我们可能会遇上软件中需要有很多下拉选择样式,就像之前我做的那个<房贷计算器>一样,有很多下拉选择,如果没有将Picker封装起来共用是很麻烦的. 安装插件 在Reac ...

  9. img 元素无法获取高度的问题

    项目里有这么一个功能,需要 ajax 从服务器端获取数据,然后本地生成 DOM 结构再 append 到页面上. 其中的图片是直接拿到的图像数据,而不是 url,所以据此生成 dataURI 赋值给 ...

  10. CSS - 实现文字显示过长时用省略

    一.添加-文字显示超出范围时隐藏属性 overflow:hidden; 二.添加-超出文字省略号属性 text-overflow:ellipsis; 三.添加-文字不换行属性 white-space: ...