Vue d'ensemble des objets FreezableFreezable Objects Overview

Cette rubrique explique comment utiliser et créer Freezable efficacement des objets, qui fournissent des fonctionnalités spéciales qui peuvent aider à améliorer les performances de l’application.This topic describes how to effectively use and create Freezable objects, which provide special features that can help improve application performance. Les pinceaux, les stylets, les transformations, les géométries et les animations sont des exemples d’objets Freezable.Examples of freezable objects include brushes, pens, transformations, geometries, and animations.

Qu’est-ce qu’un Freezable ?What Is a Freezable?

Un Freezable est un type spécial d’objet qui a deux États: non figé et figé.A Freezable is a special type of object that has two states: unfrozen and frozen. Lorsqu’il est non figé Freezable , un semble se comporter comme n’importe quel autre objet.When unfrozen, a Freezable appears to behave like any other object. Lorsqu’il est figé Freezable , un ne peut plus être modifié.When frozen, a Freezable can no longer be modified.

Un Freezable fournit un Changed événement pour notifier aux observateurs toute modification apportée à l’objet.A Freezable provides a Changed event to notify observers of any modifications to the object. Le gel Freezable d’un peut améliorer ses performances, car il n’a plus besoin de consacrer des ressources aux notifications de modification.Freezing a Freezable can improve its performance, because it no longer needs to spend resources on change notifications. Un figé Freezable peut également être partagé entre les threads, contrairement à Freezable un non figé.A frozen Freezable can also be shared across threads, while an unfrozen Freezable cannot.

Bien que Freezable la classe ait de nombreuses applications Freezable , la Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) plupart des objets dans sont liés au sous-système Graphics.Although the Freezable class has many applications, most Freezable objects in Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) are related to the graphics sub-system.

La Freezable classe facilite l’utilisation de certains objets système graphiques et peut aider à améliorer les performances de l’application.The Freezable class makes it easier to use certain graphics system objects and can help improve application performance. Les Freezable classesBrush, Transformet sontdesexemplesdetypesquihéritentde.GeometryExamples of types that inherit from Freezable include the Brush, Transform, and Geometry classes. Étant donné qu’ils contiennent des ressources non managées, le système doit surveiller ces objets pour y apporter des modifications, puis mettre à jour leurs ressources non managées correspondantes lorsqu’une modification est apportée à l’objet d’origine.Because they contain unmanaged resources, the system must monitor these objects for modifications, and then update their corresponding unmanaged resources when there is a change to the original object. Même si vous ne modifiez pas réellement un objet système Graphics, le système doit toujours consacrer certaines de ses ressources à la surveillance de l’objet, au cas où vous le modifieriez.Even if you don't actually modify a graphics system object, the system must still spend some of its resources monitoring the object, in case you do change it.

Par exemple, supposons que vous SolidColorBrush créez un pinceau et que vous l’utilisiez pour peindre l’arrière-plan d’un bouton.For example, suppose you create a SolidColorBrush brush and use it to paint the background of a button.

Button myButton = new Button();
SolidColorBrush myBrush = new SolidColorBrush(Colors.Yellow);
myButton.Background = myBrush;  
Dim myButton As New Button()
Dim myBrush As New SolidColorBrush(Colors.Yellow)
myButton.Background = myBrush

Lorsque le bouton est rendu, le WPFWPF sous-système Graphics utilise les informations que vous avez fournies pour peindre un groupe de pixels afin de créer l’apparence d’un bouton.When the button is rendered, the WPFWPF graphics sub-system uses the information you provided to paint a group of pixels to create the appearance of a button. Bien que vous ayez utilisé un pinceau de couleur unie pour décrire comment le bouton doit être peint, votre pinceau de couleur unie ne fait pas réellement la peinture.Although you used a solid color brush to describe how the button should be painted, your solid color brush doesn't actually do the painting. Le système graphique génère des objets rapides et de bas niveau pour le bouton et le pinceau, et il s’agit des objets qui s’affichent réellement à l’écran.The graphics system generates fast, low-level objects for the button and the brush, and it is those objects that actually appear on the screen.

Si vous deviez modifier le pinceau, ces objets de bas niveau doivent être régénérés.If you were to modify the brush, those low-level objects would have to be regenerated. La classe Freezable permet à un pinceau de trouver ses objets de bas niveau et générés correspondants, et de les mettre à jour lorsqu’il change.The freezable class is what gives a brush the ability to find its corresponding generated, low-level objects and to update them when it changes. Lorsque cette fonctionnalité est activée, le pinceau est dit « non figé ».When this ability is enabled, the brush is said to be "unfrozen."

La méthode d' Freeze un Freezable vous permet de désactiver cette fonctionnalité de mise à jour automatique.A freezable's Freeze method enables you to disable this self-updating ability. Vous pouvez utiliser cette méthode pour que le pinceau devienne « figé » ou non modifiable.You can use this method to make the brush become "frozen," or unmodifiable.

Notes

Tous les objets Freezable ne peuvent pas être figés.Not every Freezable object can be frozen. Pour éviter de lever InvalidOperationExceptionune exception, vérifiez la valeur de la CanFreeze propriété de l’objet Freezable pour déterminer si elle peut être figée avant d’essayer de la geler.To avoid throwing an InvalidOperationException, check the value of the Freezable object's CanFreeze property to determine whether it can be frozen before attempting to freeze it.

if (myBrush.CanFreeze)
{
    // Makes the brush unmodifiable.
    myBrush.Freeze();
}
If myBrush.CanFreeze Then
    ' Makes the brush unmodifiable.
    myBrush.Freeze()
End If

Lorsque vous n’avez plus besoin de modifier un Freezable, le gel offre des avantages en matière de performances.When you no longer need to modify a freezable, freezing it provides performance benefits. Si vous deviez figer le pinceau dans cet exemple, le système graphique n’aurait plus besoin de le surveiller pour les modifications.If you were to freeze the brush in this example, the graphics system would no longer need to monitor it for changes. Le système graphique peut également effectuer d’autres optimisations, car il sait que le pinceau ne changera pas.The graphics system can also make other optimizations, because it knows the brush won't change.

Notes

Pour plus de commodité, les objets Freezable restent non figés, sauf si vous les figez explicitement.For convenience, freezable objects remain unfrozen unless you explicitly freeze them.

Utilisation de FreezablesUsing Freezables

L’utilisation d’un Freezable non figé est semblable à l’utilisation d’un autre type d’objet.Using an unfrozen freezable is like using any other type of object. Dans l’exemple suivant, la couleur d’un SolidColorBrush est remplacée de jaune par rouge après son utilisation pour peindre l’arrière-plan d’un bouton.In the following example, the color of a SolidColorBrush is changed from yellow to red after it's used to paint the background of a button. Le système graphique fonctionne en arrière-plan pour changer automatiquement le bouton du jaune en rouge lors de la prochaine actualisation de l’écran.The graphics system works behind the scenes to automatically change the button from yellow to red the next time the screen is refreshed.

Button myButton = new Button();
SolidColorBrush myBrush = new SolidColorBrush(Colors.Yellow);
myButton.Background = myBrush;  


// Changes the button's background to red.
myBrush.Color = Colors.Red;
Dim myButton As New Button()
Dim myBrush As New SolidColorBrush(Colors.Yellow)
myButton.Background = myBrush


' Changes the button's background to red.
myBrush.Color = Colors.Red

Figer un FreezableFreezing a Freezable

Pour rendre un Freezable non modifiable, vous devez appeler Freeze sa méthode.To make a Freezable unmodifiable, you call its Freeze method. Quand vous figez un objet qui contient des objets Freezable, ces objets sont également figés.When you freeze an object that contains freezable objects, those objects are frozen as well. Par exemple, si vous figez PathGeometryun, les figures et les segments qu’il contient seraient également figés.For example, if you freeze a PathGeometry, the figures and segments it contains would be frozen too.

Un Freezable ne peut pas être figé si l’une des conditions suivantes est vraie :A Freezable can't be frozen if any of the following are true:

  • Il a des propriétés animées ou liées aux données.It has animated or data bound properties.

  • Ses propriétés sont définies par une ressource dynamique.It has properties set by a dynamic resource. (Pour plus d’informations sur les ressources dynamiques, consultez les ressources XAML .)(See the XAML Resources for more information about dynamic resources.)

  • Il contient Freezable des sous-objets qui ne peuvent pas être figés.It contains Freezable sub-objects that can't be frozen.

Si ces conditions sont fausses et que vous n’envisagez pas Freezablede modifier le, vous devez le geler pour bénéficier des avantages en matière de performances décrits précédemment.If these conditions are false, and you don't intend to modify the Freezable, then you should freeze it to gain the performance benefits described earlier.

Une fois que vous appelez la Freeze méthode d’un Freezable, elle ne peut plus être modifiée.Once you call a freezable's Freeze method, it can no longer be modified. Toute tentative de modification d’un objet figé InvalidOperationException entraîne la levée d’une exception.Attempting to modify a frozen object causes an InvalidOperationException to be thrown. Le code suivant lève une exception, car nous tentons de modifier le pinceau après qu’il a été figé.The following code throws an exception, because we attempt to modify the brush after it's been frozen.


Button myButton = new Button();
SolidColorBrush myBrush = new SolidColorBrush(Colors.Yellow);          

if (myBrush.CanFreeze)
{
    // Makes the brush unmodifiable.
    myBrush.Freeze();
}

myButton.Background = myBrush;  

try {

    // Throws an InvalidOperationException, because the brush is frozen.
    myBrush.Color = Colors.Red;
}catch(InvalidOperationException ex)
{
    MessageBox.Show("Invalid operation: " + ex.ToString());
}


Dim myButton As New Button()
Dim myBrush As New SolidColorBrush(Colors.Yellow)

If myBrush.CanFreeze Then
    ' Makes the brush unmodifiable.
    myBrush.Freeze()
End If

myButton.Background = myBrush

Try

    ' Throws an InvalidOperationException, because the brush is frozen.
    myBrush.Color = Colors.Red
Catch ex As InvalidOperationException
    MessageBox.Show("Invalid operation: " & ex.ToString())
End Try

Pour éviter de lever cette exception, vous pouvez utiliser IsFrozen la méthode pour déterminer si Freezable un est figé.To avoid throwing this exception, you can use the IsFrozen method to determine whether a Freezable is frozen.


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;
}



Dim myButton As New Button()
Dim myBrush As New SolidColorBrush(Colors.Yellow)

If myBrush.CanFreeze Then
    ' Makes the brush unmodifiable.
    myBrush.Freeze()
End If

myButton.Background = myBrush


If myBrush.IsFrozen Then ' Evaluates to true.
    ' If the brush is frozen, create a clone and
    ' modify the clone.
    Dim myBrushClone As SolidColorBrush = 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
End If


Dans l’exemple de code précédent, une copie modifiable a été effectuée d’un objet figé Clone à l’aide de la méthode.In the preceding code example, a modifiable copy was made of a frozen object using the Clone method. La section suivante décrit le clonage plus en détail.The next section discusses cloning in more detail.

Notes

Comme un Freezable figé ne peut pas être animé, le système d’animation crée automatiquement des clones modifiables d’objets figés Freezable quand vous essayez de les animer avec un. StoryboardBecause a frozen freezable cannot be animated, the animation system will automatically create modifiable clones of frozen Freezable objects when you try to animate them with a Storyboard. Pour éliminer la surcharge de performances causée par le clonage, laissez un objet non figé si vous envisagez de l’animer.To eliminate the performance overhead caused by cloning, leave an object unfrozen if you intend to animate it. Pour plus d’informations sur l’animation avec les storyboards, consultez vue d’ensemble des storyboards.For more information about animating with storyboards, see the Storyboards Overview.

Figer à partir du balisageFreezing from Markup

Pour figer Freezable un objet déclaré dans le balisage, PresentationOptions:Freeze vous utilisez l’attribut.To freeze a Freezable object declared in markup, you use the PresentationOptions:Freeze attribute. Dans l’exemple suivant, un SolidColorBrush est déclaré en tant que ressource de page et figé.In the following example, a SolidColorBrush is declared as a page resource and frozen. Elle est ensuite utilisée pour définir l’arrière-plan d’un bouton.It is then used to set the background of a button.

<Page 
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:PresentationOptions="http://schemas.microsoft.com/winfx/2006/xaml/presentation/options" 
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  mc:Ignorable="PresentationOptions">

  <Page.Resources>

    <!-- This resource is frozen. -->
    <SolidColorBrush 
      x:Key="MyBrush"
      PresentationOptions:Freeze="True" 
      Color="Red" />
  </Page.Resources>


  <StackPanel>

    <Button Content="A Button" 
      Background="{StaticResource MyBrush}">
    </Button>

  </StackPanel>
</Page>

Pour utiliser l' Freeze attribut, vous devez mapper à l’espace de noms des http://schemas.microsoft.com/winfx/2006/xaml/presentation/optionsoptions de présentation :.To use the Freeze attribute, you must map to the presentation options namespace: http://schemas.microsoft.com/winfx/2006/xaml/presentation/options. PresentationOptionsest le préfixe recommandé pour le mappage de cet espace de noms :PresentationOptions is the recommended prefix for mapping this namespace:

xmlns:PresentationOptions="http://schemas.microsoft.com/winfx/2006/xaml/presentation/options"

Étant donné que tous les lecteurs XAML ne reconnaissent pas cet attribut, il est recommandé d’utiliser l' attribut MC : Ignorable pour marquer l' Presentation:Freeze attribut comme étant pouvant être ignoré :Because not all XAML readers recognize this attribute, it's recommended that you use the mc:Ignorable Attribute to mark the Presentation:Freeze attribute as ignorable:

xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="PresentationOptions"

Pour plus d’informations, consultez la page de l' attribut MC : Ignorable .For more information, see the mc:Ignorable Attribute page.

« Libération » d’un Freezable"Unfreezing" a Freezable

Une fois figé, Freezable un ne peut jamais être modifié ou non figé ; Toutefois, vous pouvez créer un clone non Clone figé CloneCurrentValue à l’aide de la méthode ou.Once frozen, a Freezable can never be modified or unfrozen; however, you can create an unfrozen clone using the Clone or CloneCurrentValue method.

Dans l’exemple suivant, l’arrière-plan du bouton est défini avec un pinceau et ce pinceau est alors figé.In the following example, the button's background is set with a brush and that brush is then frozen. Une copie non figée est faite du pinceau à l' Clone aide de la méthode.An unfrozen copy is made of the brush using the Clone method. Le clone est modifié et utilisé pour changer l’arrière-plan du bouton du jaune au rouge.The clone is modified and used to change the button's background from yellow to red.

Button myButton = new Button();
SolidColorBrush myBrush = new SolidColorBrush(Colors.Yellow);

// Freezing a Freezable before it provides
// performance improvements if you don't
// intend on modifying it. 
if (myBrush.CanFreeze)
{
    // Makes the brush unmodifiable.
    myBrush.Freeze();
}
            

myButton.Background = myBrush;  

// If you need to modify a frozen brush,
// the Clone method can be used to
// create a modifiable copy.
SolidColorBrush myBrushClone = myBrush.Clone();

// Changing myBrushClone does not change
// the color of myButton, because its
// background is still set by myBrush.
myBrushClone.Color = Colors.Red;

// Replacing myBrush with myBrushClone
// makes the button change to red.
myButton.Background = myBrushClone;
Dim myButton As New Button()
Dim myBrush As New SolidColorBrush(Colors.Yellow)

' Freezing a Freezable before it provides
' performance improvements if you don't
' intend on modifying it. 
If myBrush.CanFreeze Then
    ' Makes the brush unmodifiable.
    myBrush.Freeze()
End If


myButton.Background = myBrush

' If you need to modify a frozen brush,
' the Clone method can be used to
' create a modifiable copy.
Dim myBrushClone As SolidColorBrush = myBrush.Clone()

' Changing myBrushClone does not change
' the color of myButton, because its
' background is still set by myBrush.
myBrushClone.Color = Colors.Red

' Replacing myBrush with myBrushClone
' makes the button change to red.
myButton.Background = myBrushClone

Notes

Quelle que soit la méthode de clonage que vous utilisez, les animations ne Freezablesont jamais copiées dans le nouveau.Regardless of which clone method you use, animations are never copied to the new Freezable.

Les Clone méthodes CloneCurrentValue et produisent des copies complètes du Freezable.The Clone and CloneCurrentValue methods produce deep copies of the freezable. Si le Freezable contient d’autres objets Freezable figés, ils sont également clonés et rendus modifiables.If the freezable contains other frozen freezable objects, they are also cloned and made modifiable. Par exemple, si vous clonez un PathGeometry figé pour le rendre modifiable, les figures et les segments qu’il contient sont également copiés et rendus modifiables.For example, if you clone a frozen PathGeometry to make it modifiable, the figures and segments it contains are also copied and made modifiable.

Création de votre propre classe FreezableCreating Your Own Freezable Class

Une classe qui dérive de Freezable obtient les fonctionnalités suivantes.A class that derives from Freezable gains the following features.

  • États spéciaux : un État en lecture seule (figé) et un état accessible en écriture.Special states: a read-only (frozen) and a writable state.

  • Sécurité des threads : Freezable un figé peut être partagé entre les threads.Thread safety: a frozen Freezable can be shared across threads.

  • Notification de modification détaillée : Contrairement aux DependencyObjectautres, les objets Freezable fournissent des notifications de modification lorsque les valeurs de sous-propriétés changent.Detailed change notification: Unlike other DependencyObjects, Freezable objects provide change notifications when sub-property values change.

  • Clonage facile : la classe Freezable a déjà implémenté plusieurs méthodes qui produisent des clones profonds.Easy cloning: the Freezable class has already implemented several methods that produce deep clones.

Un Freezable est un type de DependencyObject, et par conséquent utilise le système de propriétés de dépendance.A Freezable is a type of DependencyObject, and therefore uses the dependency property system. Vos propriétés de classe n’ont pas besoin d’être des propriétés de dépendance, mais l’utilisation de propriétés de dépendance réduit la quantité de code Freezable que vous devez écrire, car la classe a été conçue avec les propriétés de dépendance à l’esprit.Your class properties don't have to be dependency properties, but using dependency properties will reduce the amount of code you have to write, because the Freezable class was designed with dependency properties in mind. Pour plus d’informations sur le système de propriétés de dépendance, consultez vue d’ensemble des propriétés de dépendance.For more information about the dependency property system, see the Dependency Properties Overview.

Chaque Freezable sous-classe doit se substituer à la CreateInstanceCore méthode.Every Freezable subclass must override the CreateInstanceCore method. Si votre classe utilise des propriétés de dépendance pour toutes ses données, vous avez terminé.If your class uses dependency properties for all its data, you're finished.

Si votre classe contient des membres de données de propriété de non dépendance, vous devez également substituer les méthodes suivantes :If your class contains non-dependency property data members, you must also override the following methods:

Vous devez également respecter les règles suivantes pour l’accès et l’écriture aux membres de données qui ne sont pas des propriétés de dépendance :You must also observe the following rules for accessing and writing to data members that are not dependency properties:

  • Au début de toute API qui lit les données membres de propriété de non dépendance, appelez ReadPreamble la méthode.At the beginning of any API that reads non-dependency property data members, call the ReadPreamble method.

  • Au début de toute API qui écrit des membres de données de propriété de non dépendance, WritePreamble appelez la méthode.At the beginning of any API that writes non-dependency property data members, call the WritePreamble method. (Une fois que vous WritePreamble avez appelé dans une API, vous n’avez pas besoin d’effectuer ReadPreamble un appel supplémentaire à si vous lisez également des membres de données de propriété de non dépendance.)(Once you've called WritePreamble in an API, you don't need to make an additional call to ReadPreamble if you also read non-dependency property data members.)

  • Appelez la WritePostscript méthode avant de quitter les méthodes qui écrivent dans les membres de données de propriété de non dépendance.Call the WritePostscript method before exiting methods that write to non-dependency property data members.

Si votre classe contient des membres de données de propriété non-dépendance DependencyObject qui sont des objets, vous devez OnFreezablePropertyChanged également appeler la méthode chaque fois que vous modifiez l’une de leurs valeurs, même si vous nulldéfinissez le membre sur.If your class contains non-dependency-property data members that are DependencyObject objects, you must also call the OnFreezablePropertyChanged method each time you change one of their values, even if you're setting the member to null.

Notes

Il est très important de commencer chaque Freezable méthode que vous remplacez par un appel à l’implémentation de base.It's very important that you begin each Freezable method you override with a call to the base implementation.

Pour obtenir un exemple de classe Freezable personnalisée, consultez l' exemple animation personnalisée.For an example of a custom Freezable class, see the Custom Animation Sample.

Voir aussiSee also