# Freezable 对象(WPF) #

> Freezable 继承自 DependencyObject,同时添加了 Freezable 方法,用于冻结对象。

---

## 冻结对象 ##

以此为示例

```ruby
def say_hi
print "hello world"
end
```
```cs
namespace ConsoleApplication2
{
public class Person : Freezable
{
public string Name
{
get { return (string)GetValue(NameProperty); }
set { SetValue(NameProperty, value); }
} public static readonly DependencyProperty NameProperty =
DependencyProperty.Register("Name", typeof(string), typeof(Person), new UIPropertyMetadata(0)); protected override Freezable CreateInstanceCore()
{
throw new NotImplementedException();
} }
}
``` 现实生活中,人的名字是不可以随便更改的,当名字定下来以后,就把该对象冻结了,那么就不能再修改此对象的属性了,如下 ```cs
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
Person person = new Person();
person.Name = "Chang weihua";
person.Freeze(); //不能再赋值了
person.Name = "Changweihua 2013"; Console.ReadKey(true);
}
}
}
``` ## 依赖对象与冻结 ## 当调用 Freeze 方法后,DependencyObject 将会成为一个密封类(Sealed)。一旦 DependencyObject 成为密封类,那么内部将无法修改依赖项属性,这也意味着如果定义普通的 CLR 属性则没有这个问题。 ## 冻结状态 ## 1. 在冻结之前,需要知道该对象是否已经冻结(IsFrozen),当冻结之后, IsFrozen 为 True。
2. 即使继承了 Freezable 的对象,并非随时都可以冻结,在调用 Freeze 方法之前,需要查看 CanFrozen 属性判断该对象是否可以冻结(如果该对象可以冻结,即使调用 Freeze 方法后,该属性还是 True),否则会报错。
3. 冻结后的对象无法解冻,必须采用克隆的方法创建一个新对象。 ## 无法冻结的情况 ## 1. 绑定时
当一个 DependencyProperty 对象其中有 DependencyProperty 有绑定时,无法冻结,当 DependencyProperty 接触绑定之后可以(如果进行了绑定就意味着值可能会被修改,那么该对象就是被冻结了的了) ```cs
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
Person person = new Person(); BindingOperations.SetBinding(person, Person.NameProperty, new Binding("Name") { Source = person });
if (person.CanFreeze)
person.Freeze(); person.Name = "Chang weihua"; Console.WriteLine(person.Name); //解除绑定
BindingOperations.ClearBinding(person, Person.NameProperty);
//解除绑定之后可以赋值
person.Name = "Changweihua 2012";
Console.WriteLine(person.Name); if (person.CanFreeze)
person.Freeze(); //不能再赋值了
//person.Name = "Changweihua 2013";
//Console.WriteLine(person.Name); Console.ReadKey(true);
}
}
}
``` 2. Freezable 中定义的 DependencyProperty 属性类型必须是值类型或者是 Freezable 类型。
比如在其中定义一个 Button 类型(非 Freezable 类型)的 DependencyProperty,当其中有值时,则无法冻结。 ## Freezable 特性 ## 1. 可子属性变更通知
2. 克隆 如果定义的属性均为依赖属性,那么克隆就会变得很简单,调用父类方法就行,如 ```cs
public SolidColorBrush Clone()
{
return (SolidColorBrush)base.Clone();
}
``` 3. 冻结之后的对象将与 UI 线程分离 其会将内部的 Dispatcher 属性设置为空,就是需要注意的。 总结:当对象不需要发生改变时,则冻结该对象,减少对象监听,提示性能

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. B. Om Nom and Dark Park

    B. Om Nom and Dark Park 在满二叉树上的某些边上添加一些值.使得根节点到叶子节点的路径上的权值和都相等.求最少需要添加多少. 我们利用性质解题.   考察兄弟节点.由于他们从跟节 ...

  2. C. Mobile phones

    Suppose that the fourth generation mobile phone base stations in the Tampere area operate as follows ...

  3. JSONP跨域原理和jQuery.getJSON用法

    JSONP是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式).本文主要介绍JS ...

  4. mysql mysql_error mysqli_connect_error 乱码

    <html> <head> <meta charset="utf-8"> <title></title> </he ...

  5. 把txt文件中的json字符串写到plist文件中

    - (void)json2Plist { NSString *filePath = [self applicationDocumentsDirectoryFileName:@"json&qu ...

  6. [wordpress]wp-api-jwt-auth 尝试添加运行在多站点中 need change

    Hi,Thank you this plugin,because i use this plugin on Wordpress one Network,so the request other api ...

  7. NodeJS学习之网络操作

    NodeJS -- 网络操作 使用NodeJS内置的http模块简单实现HTTP服务器 var http = require('http'); http.createServer(function(r ...

  8. EL表达式隐含对象

    EL表达式语言中定义了11个隐含对象,使用这些隐含对象可以很方便地获取web开发中的一些常见对象,并读取这些对象的数据. 语法:${隐式对象名称}  :获得对象的引用 <%@ page lang ...

  9. 20150222—LINQ to SQL 插入、更新和删除

    注意,使用LINQ to SQL时, 表中必须有一个主键才可以起效,否则系统将无法对数据作出修改 插入新数据,根据上一片的文章实例在其中添加新的控件: 编号TextBox(Name):sno 名字Te ...

  10. fread 和 fwrite 函数用法示例以及注意事项

    1.函数功能   用来读写一个数据块. 2.一般调用形式   fread(buffer,size,count,fp);   fwrite(buffer,size,count,fp); 3.说明   ( ...