System.Windows.Freezable类(在 WindowsBase.dll 中)定义一个对象,该对象具有可修改状态和只读(冻结)状态。派生自 Freezable 的类提供详细的更改通知,可以是不可变的,并且可以进行自我克隆。
C#: public abstract class Freezable : DependencyObject
Freezable 类提供特殊功能,以便在使用修改或复制开销很大的对象时帮助提高应用程序性能。
比如,常见的Freezable对象Brush,Pen,Geometry,Transform,AnimationTimeline(事实上,它们都继承自System.Windows.Media.Animation.Animatable,而Animatable又继承自System.Windows.Freezable,见后面的继承层次结构)等。
派生自 Freezable 的类可以获得以下功能:
(1)特殊状态:只读(冻结)状态和可写状态。
(2)线程安全性:可以在线程之间共享冻结的 Freezable 对象。
(3)详细的更改通知:与其他 DependencyObject 对象不同,Freezable 对象可在子属性值更改时提供更改通知。
(4)便于克隆:Freezable 类已经实现了多种生成深层克隆的方法。
需要注意的是,如果以下任何一个对象相关条件为 true,则无法冻结 Freezable 对象:
(1)它有动画或数据绑定的属性。
(2)它有由动态资源设置的属性。
(3)它包含无法冻结的 Freezable 子对象。
如果这些条件对于 Freezable 对象为 false,并且您不希望修改它,请将其冻结以提高性能。将对象冻结,可以提高效率,因为被冻结的对象不会被改变,因此它们不需要监控。
SolidColorBrush属于Freezable 对象类型,下例演示如何通过调用其 Freeze 方法使 Freezable 变为只读。
C#代码:
Button button = new Button();
SolidColorBrush solidColorBrush = new SolidColorBrush(Colors.Red);
if (solidColorBrush.CanFreeze)
{
// 使画刷不可更改(冻结)
solidColorBrush.Freeze();
}
button.Background = solidColorBrush;
上例需要注意一点,如果SolidColorBrush solidColorBrush = new SolidColorBrush(Colors.Red); 这一行改成:
SolidColorBrush solidColorBrush = Brushes.Red; 则solidColorBrush处于冻结状态。也就是说,不能再被改变。同理,从SystemColors返回的画刷对象也是冻结的。比如:
Brush brush = SystemColors.WindowBrush; 这时的brush不允许改变它。
但可以使用:Brush brush = new SystemColorBrush(SystemColors.WindowColor); //这个brush可以改变
如上面代码所示,如果Freezable对象的CanFreeze属性是true,则可调用Freeze()方法来实现对象的冻结和不可变动。确定 Freezable 是否处于冻结状态:使用 Freezable 对象的 IsFrozen 属性来确定对象是否处于冻结状态。也就是说,如果某Freezable对象的IsFrozen属性如果变成true,则表示此对象已经被冻结。
没有办法将已冻结的对象解冻(unfreeze),但你可以使用 Clone() 方法来创建只读 Freezable对象 的可写副本,这个副本就是没有冻结的。
冻结的Freezable对象可以在不同的线程之间共享,但没有被冻结的Freezable对象则不行。
只有继承自Freezable类的对象,才可以被冻结。 |