Freezable 对象(WPF)
# 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)的更多相关文章
- Freezable 对象概述 | Microsoft Docs
原文:Freezable 对象概述 | Microsoft Docs Freezable 对象概述Freezable Objects Overview 2017/03/30 本文内容 什么是可冻结的? ...
- Visual对象——WPF
System.Object System.Windows.Threading.DispatcherObject System.Windows.Depende ...
- WPF优化:Freezable冻结对象
原文:WPF优化:Freezable冻结对象 WPF虽然很美观,效果很炫,但是对资源的消耗也很大,尤其是初次接触WPF的人,因为很多地方虽然实现了想要的效果,但是由于经验问题,所以也会造成很大的资源浪 ...
- WPF性能提高--MSDN学习摘要
关于性能 一. 关于硬件加速 1.对于大多数图形硬件而言,大型图面是指达到 2048x2048 或 4096x4096 像素大小的图面. 二. 合理的布局 1.简单地说,布局是一个递归系统 ...
- WPF:理解TileBrush(ImageBrush,DrawingBrush和VisualBrush)
ImageBrush:利用图像绘制区域 ImageBrush 是一种将自身内容定义为图像的 TileBrush,图像通过它的 ImageSource 属性指定. 您可以控制图像的拉伸.对齐和平铺方式, ...
- WPF&Silverlight5 常用功能差异
一晃从Wpf转到sl也有半年多了,总想总结一下wpf和sl的差异,今天终于下笔. 首先来个整体图: 通过上图可以发现其实sl只是使用了wpf的一小部分,只是sl依赖的freamwork有很大部分都一样 ...
- 【WPF学习笔记】之WPF基础:依赖关系属性和通知
这些天来,对象似乎已经忙得晕头转向了.每个人都希望它们做这做那.Windows® Presentation Foundation (WPF) 应用程序中的典型对象会接到各种各样不同的请求:有要求绑定到 ...
- WPF 中那些可跨线程访问的 DispatcherObject(WPF Free Threaded Dispatcher Object)
原文 WPF 中那些可跨线程访问的 DispatcherObject(WPF Free Threaded Dispatcher Object) 众所周知的,WPF 中多数对象都继承自 Dispatch ...
- 关于WPF你应该知道的2000件事
原文 关于WPF你应该知道的2000件事 以下列出了迄今为止为WPF博客所知的2,000件事所创建的所有帖子. 帖子总数= 1,201 动画 #7 - 基于属性的动画 #686 - 使用动画制作图像脉 ...
随机推荐
- 手机APP软件使用说明
手机APP软件使用说明 一. POLYCOM客户端(视频会议终端)登录: 1. 打开手机,找到Polycom软件,点击打开. 2. 打开软件后,界面如下,每次开会时,由会议管理员 ...
- spring mvc 的各种参数的绑定方式
本文转自http://www.cnblogs.com/HD/p/4107674.html SpringMVC的各种参数绑定方式 1. 基本数据类型(以int为例,其他类似):Controller代码: ...
- Java基础知识强化之IO流笔记77:NIO之 Selector
Selector(选择器)是Java NIO中能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件.这样,一个单独的线程可以管理多个channel,从而管理多个网络连接. 1. ...
- 菜菜菜鸟学习之JavaWeb 入门1(自己的学习理解,不对之处请大神们多多指教啊)
一.相关基础知识 1.C/S(Client/Server)架构和B/S(Browser/Server)架构 首先说C/S架构,简单讲其实很常见,类似QQ等需要下载客户端的应用程序就是建立在C/S架构中 ...
- XAML设计器卡死
在生成工程时,存在这样一个记录: “未能找到一个或多个间接引用的程序集.分析不需要这些程序集.但是,如果没有这些程序集,分析结果可能不完整”. 表现形式既不是错误,可也不是警告.之所以关注到这个问题, ...
- Hbse的读写过程
1.Hbase的读取过程. 以读取test_region表,row key为this is row value 400000为例. 1: 到zookeeper中去读取/hbase/root-regio ...
- Linux 内核链表
一 . Linux内核链表 1 . 内核链表函数 1.INIT_LIST_HEAD:创建链表 2.list_add:在链表头插入节点 3.list_add_tail:在链表尾插入节点 4.list_d ...
- VC++ DLL 发布到生产环境过程
最近项目中用到了VC++ DLL,在本机调试时无任何问题,但是发布出来后,COPY到另外的机器就报错,说找不到DLL,由于自身工作接触这方面比较少,经过一番折腾后,终于解决,以下为解决步骤 一,平台工 ...
- ASP.NET不拖控件教程(1)-认识JSON
我讲讲脱离ASP.NET控件必备的一步,JSON和使用JQuery获取JSON吧! 高手跳过,写给学习中的人的.这篇帖子是假设你会使用JQuery(JQ这么普及,应该不至少没学过吧!真没学过以后再开帖 ...
- PB出现中文乱码
在design>option>font把字体都设定为宋体 tools>system option>font 把字体都设定为宋体 然后重启PB即可