Freezable通过提供在性能原因需要或需要不可变对象时生成对象副本的方法,模拟可变对象中的不变性。 该Freezable类型为某些图形元素(如几何和画笔以及动画)提供了通用基础。Animatable是一Freezable个派生类
可以在线程之间共享冻结的 Freezable,而未冻结的 Freezable 不能。
并非每个可冻结的对象都可以冻结。 若要避免引发 InvalidOperationException,请检查可冻结对象的 CanFreeze 属性的值,以确定是否可以冻结该对象,然后再尝试将其冻结。
如果满足以下任一条件,则无法冻结:
-
它具有动画或数据绑定属性。
-
它包含动态资源设置的属性。
-
它包含不能冻结 Freezable 子对象。
如果这些条件为 false,并且你不打算修改 Freezable,则应将其冻结,以获取之前所述的性能优势。
调用可冻结的 Freeze 方法后,将无法再修改它。 尝试修改冻结对象将导致引发 InvalidOperationException。 一旦冻结,就永远不能修改或解冻 Freezable;但是,可以使用 Clone 或 CloneCurrentValue 方法创建未冻结的克隆。
Button myButton = new Button(); SolidColorBrush myBrush = new SolidColorBrush(Colors.Yellow); if (myBrush.CanFreeze) { // Makes the brush unmodifiable. myBrush.Freeze(); } myButton.Background = myBrush; if (myBrush.IsFrozen) // Evaluates to true. { // If the brush is frozen, create a clone and // modify the clone. SolidColorBrush myBrushClone = myBrush.Clone(); myBrushClone.Color = Colors.Red; myButton.Background = myBrushClone; } else { // If the brush is not frozen, // it can be modified directly. myBrush.Color = Colors.Red; }
若要冻结在标记中声明的 Freezable 对象,请使用 PresentationOptions:Freeze
特性。 在下面的示例中,将 SolidColorBrush 声明为页资源并冻结。 然后,将使用它来设置按钮的背景。
xmlns:PresentationOptions="http://schemas.microsoft.com/winfx/2006/xaml/presentation/options"
mc:Ignorable="PresentationOptions"
<Page.Resources> <!-- This resource is frozen. --> <SolidColorBrush x:Key="MyBrush" PresentationOptions:Freeze="True" Color="Red" /> </Page.Resources>
由于并非所有 XAML 读取器都能识别此特性,因此建议使用mc:可忽略属性将 Presentation:Freeze
特性标记为可忽略
执行已注册以侦听Freezable对象Changed事件的对象的清理时,在释放该对象之前必须删除该委托。
Brush myBrush = new SolidColorBrush(Colors.Red); Rectangle myRectangle = new Rectangle(); myRectangle.Fill = myBrush;
在myBrush
分配myRectangle.Fill
时,Rectangle指向对象的委托将添加到SolidColorBrush对象的Changed事件。 这意味着以下代码实际上不会使 myRect
可以进行垃圾回收:
myRectangle = null;
在这种情况下myBrush
,仍然保持myRectangle
活动状态,并在触发事件Changed时将其回
清除这些类型的对象的推荐方法是从BrushFill属性中删除 ,这反过来将删除Changed事件处理程序。
myRectangle.Fill = null; myRectangle = null;