Freezable

 

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;

 

posted @ 2020-08-02 16:48  yetsen  阅读(290)  评论(0编辑  收藏  举报