#173 – 可以将将Freezable类型的(You Can Put Freezable Objects Into a Read-Only State)

原文地址:https://wpf.2000things.com/2011/01/01/173-you-can-put-freezable-objects-into-a-read-only-state/

继承自Freezable 的类一般有读/写两种状态,但是他们可以很明确的通过其Freeze 方法冻结并被设置为只读状态。在WPF中,被冻结的类执行起来会更有效率,因为他们不需要在其属性值改变的时候做属性通知。

例如WPF中绘图相关的Brush和3D图形,它们继承自 Freezable. 他们初始的状态是未冻结的,因它们的任何一个改变都会引起属性改变的通知。

如果你有一个继承自 Freezable的实例,但是你并不想改变它,你可以使用Freeze 将之冻结。

            // Freeze this object, making it read-only (since we don't plan on changing it)
            if (theBrush.CanFreeze)
                theBrush.Freeze();

当冻结它之后,如果你想改变它,将会触发一个InvalidOperationException类型的异常。但是这样做会使WPF程序执行起来更有效率。


******************************译者注*****************************

根据官方的说法。Freezable 是一种特殊的对象类型,具有两个状态:解冻和冻结。当处于解冻状态时,Freezable 的行为与任何其他对象的行为一样。Freezable 一旦冻结,便无法修改。

Freezable 提供了一个 Changed 事件以将对对象所做的任何修改通知给观察程序。冻结 Freezable 可以改进其性能,因为它不再需要因更改通知而消耗资源。冻结的 Freezable 也可以在线程之间共享,而解冻的Freezable 则不能。

虽然 Freezable 类具有许多应用程序,但 Windows Presentation Foundation (WPF) 中的大多数Freezable 对象都与图形子系统相关。

Freezable 类使编码者在使用某些图形系统对象时更加轻松,并且有助于改进应用程序性能。从 Freezable 继承的类型示例包括Brush、Transform 和Geometry 类。由于它们包含非托管资源,因此系统必须监视这些对象的修改情况,在对原始对象进行了更改的情况下,更新其相应的非托管资源。即使实际上您并没有修改图形系统对象,但系统也必须花费一些资源来监视该对象,以防您对其进行更改。

例如,假设我们要创建一个 SolidColorBrush 画笔,并使用它来绘制按钮的背景。呈现按钮时,WPF 图形子系统使用我们提供的信息来绘制一组像素,以创建按钮的外观。虽然我们使用了纯色画笔来描写应如何绘制按钮,但纯色画笔并未真正绘制。图形系统为该按钮和画笔生成快速、低级别的对象,而屏幕上实际显示的正是这些对象。如果要修改画笔,则必须重新生成这些低级别对象。通过 Freezable 类,画笔可以找到相应的已生成低级别对象,并在画笔更改时更新这些对象。当启用该功能时,画笔便被认为是“解冻的”。

而使用 Freezable 对象的 Freeze 方法可以禁用该自行更新功能。可以使用该方法使画笔变为“冻结”或不可修改。

当不再需要修改某个 Freezable 时,冻结它可以改进性能。如果您在该示例中冻结画笔,则图形系统将不再需要监视它的更改情况。图形系统还可以进行其他优化,因为它知道画笔不会更改。

若要使 Freezable 不可修改,可调用其 Freeze 方法。冻结某个包含 Freezable 对象的对象时,也会冻结这些被包含的对象。例如,如果冻结某个PathGeometry,则它包含的图形和线段也会被冻结。

如果下列任一情况属实,则无法冻结 Freezable:

1. 它有动画或数据绑定的属性。

2. 它有由动态资源设置的属性

3. 它包含无法冻结的 Freezable 子对象。

如果不存在这些情况,并且您不希望修改 Freezable,则应当像前面介绍的那样冻结该对象以改进性能。

一旦调用某个 Freezable 的 Freeze 方法,便不能再修改该对象。尝试修改冻结的对象会导致引发 InvalidOperationException。由于尝试修改已冻结的画笔,下面的代码将引发一个异常。




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值