• 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;
  • 相关阅读:
    java栈的实现复习
    条件判断语句--linux
    转义符&脚本参数--linux
    linux备份脚本-模板
    github的搜索使用技巧
    sonarqube7.9安装部署(linux)
    openjdk与oraclejdk下载
    gitlab重写历史,清理历史大文件
    nexus私服搭建过程
    nexus私服关联本地maven配置
  • 原文地址:https://www.cnblogs.com/yetsen/p/13549654.html
Copyright © 2020-2023  润新知