<SolidColorBrush x:Key="RedBrush" Color="Red" o:Freeze="True"/>代码中的o:Freeze="True"其实就是使用Freezable的 Freeze方法冻结画刷,使之不可修改,系统不必监视该画刷对象,从而减少资源消耗。
<Window.Resources> <SolidColorBrush x:Key="RedBrush" Color="Red"/> </Window.Resources> <Button Background="{StaticResource RedBrush}"/>呈现按钮时,WPF图形子系统使用你提供的信息来绘制一组像素,以创建按钮的外观。尽管使用纯色画笔来描述按钮的绘制方式,但纯色画笔实际上并没有进行绘制。图形系统为按钮和画笔生成快速、低级别的对象,实际显示在屏幕上的就是这些对象。如果要修改画笔,则必须重新生成这些低级别对象。Freezable类使画笔能够找到生成的相应低级别对象并在更改时更新它们。
3.它包含无法冻结的Freezable子对象。
Freezable对象调用Freeze方法冻结后,就无法解冻。修改冻结对象属性时会引发InvalidOperationException。但是,可以使用Clone或CloneCurrentValue方法创建(深拷贝)解冻的副本。如果Freezable包含其他已冻结的 Freezable对象,它们也会被克隆并变为可修改。无论使用哪种克隆方法,动画都不会复制到新的 Freezable。
public class PresentationOptionsAttach { public static bool GetFreeze(Freezable freezable) { return (bool)freezable.GetValue(FreezeProperty); } public static void SetFreeze(Freezable freezable, bool value) { freezable.SetValue(FreezeProperty, value); } public static readonly DependencyProperty FreezeProperty = DependencyProperty.RegisterAttached("Freeze", typeof(bool), typeof(PresentationOptionsAttach), new PropertyMetadata(false, OnFreezeChanged)); private static void OnFreezeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (DesignerProperties.GetIsInDesignMode(d)) return; // 堆代码 duidaima.com if ((bool)e.NewValue) { Freezable freezable = d as Freezable; if (freezable.CanFreeze) freezable.Freeze(); } } }