Übersicht über Freezable-ObjekteFreezable Objects Overview

In diesem Thema wird beschrieben, wie Sie- Freezable Objekte effektiv verwenden und erstellen können, die spezielle Funktionen zur Verbesserung der Anwendungsleistung bereitstellen.This topic describes how to effectively use and create Freezable objects, which provide special features that can help improve application performance. Beispiele für frei wählbare Objekte sind Pinsel, Stifte, Transformationen, Geometrien und Animationen.Examples of freezable objects include brushes, pens, transformations, geometries, and animations.

Was ist ein frei wählbarer?What Is a Freezable?

Ein Freezable ist ein spezieller Objekttyp, der zwei Zustände aufweist: nicht fixiert und fixiert.A Freezable is a special type of object that has two states: unfrozen and frozen. Wenn das Objekt nicht fixiert Freezable ist, verhält sich wie ein beliebiges anderes Objekt.When unfrozen, a Freezable appears to behave like any other object. Wenn Sie eingefroren ist Freezable , kann eine nicht mehr geändert werden.When frozen, a Freezable can no longer be modified.

Ein Freezable stellt ein Changed -Ereignis bereit, um Beobachter über Änderungen am-Objekt zu benachrichtigen.A Freezable provides a Changed event to notify observers of any modifications to the object. Das Einfrieren Freezable einer kann die Leistung verbessern, da Sie keine Ressourcen mehr für Änderungs Benachrichtigungen aufwenden muss.Freezing a Freezable can improve its performance, because it no longer needs to spend resources on change notifications. Ein fixierter kann auch Thread übergreifend freigegeben werden, während ein nicht fixiertist.Freezable FreezableA frozen Freezable can also be shared across threads, while an unfrozen Freezable cannot.

Obwohl die Freezable -Klasse über viele Anwendungen verfügt Freezable , sind Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) die meisten Objekte in mit dem Grafik-unter System verknüpft.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.

Die Freezable -Klasse vereinfacht die Verwendung bestimmter Grafiksystem Objekte und kann dabei helfen, die Anwendungsleistung zu verbessern.The Freezable class makes it easier to use certain graphics system objects and can help improve application performance. Beispiele für Typen, die von Freezable erben, Brushsind Transformdie Klassen Geometry , und.Examples of types that inherit from Freezable include the Brush, Transform, and Geometry classes. Da Sie nicht verwaltete Ressourcen enthalten, muss das System diese Objekte auf Änderungen überwachen und dann die entsprechenden nicht verwalteten Ressourcen aktualisieren, wenn Änderungen am ursprünglichen Objekt vorgenommen werden.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. Selbst wenn Sie ein Grafiksystem Objekt nicht tatsächlich ändern, muss das System trotzdem einige Ressourcen für die Überwachung des Objekts aufwenden, falls Sie es ändern.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.

Nehmen Sie beispielsweise an, Sie SolidColorBrush erstellen einen Pinsel und verwenden ihn, um den Hintergrund einer Schaltfläche zu zeichnen.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

Wenn die Schaltfläche gerendert WPFWPF wird, verwendet das Grafik Subsystem die Informationen, die Sie angegeben haben, um eine Gruppe von Pixeln zu zeichnen, um die Darstellung einer Schaltfläche zu erstellen.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. Obwohl Sie einen Pinsel mit voll Tonfarbe verwendet haben, um zu beschreiben, wie die Schaltfläche gezeichnet werden soll, führt der Pinsel mit voll Tonfarbe das Zeichnen nicht aus.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. Das Grafiksystem generiert schnelle, Low-Level-Objekte für die Schaltfläche und den Pinsel, und es handelt sich um die Objekte, die auf dem Bildschirm tatsächlich angezeigt werden.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.

Wenn Sie den Pinsel ändern, müssten diese Objekte auf niedriger Ebene erneut generiert werden.If you were to modify the brush, those low-level objects would have to be regenerated. Die auffüllbare Klasse bietet einem Pinsel die Möglichkeit, die entsprechenden generierten Objekte auf niedriger Ebene zu finden und bei Änderungen zu aktualisieren.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. Wenn diese Fähigkeit aktiviert ist, wird der Pinsel als "nicht eingefroren" bezeichnet.When this ability is enabled, the brush is said to be "unfrozen."

Mit der- Freeze Methode können Sie diese selbst Aktualisierungs Fähigkeit deaktivieren.A freezable's Freeze method enables you to disable this self-updating ability. Mit dieser Methode können Sie den Pinsel als "eingefroren" oder als nicht änderbar festlegen.You can use this method to make the brush become "frozen," or unmodifiable.

Hinweis

Nicht jedes frei wählbare Objekt kann eingefroren werden.Not every Freezable object can be frozen. Um zu vermeiden, InvalidOperationExceptiondass ein ausgelöst wird, überprüfen Sie den Wert CanFreeze der-Eigenschaft des frei wählbaren Objekts, um zu bestimmen, ob er eingefroren werden kann, bevor versucht wird, ihnTo 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

Wenn Sie nicht mehr die Möglichkeit haben, eine frei wählbare zu ändern, bietet das Einfrieren Leistungsvorteile.When you no longer need to modify a freezable, freezing it provides performance benefits. Wenn Sie in diesem Beispiel den Pinsel fixieren würden, muss das Grafiksystem nicht mehr auf Änderungen überwachen.If you were to freeze the brush in this example, the graphics system would no longer need to monitor it for changes. Das Grafiksystem kann auch andere Optimierungen vornehmen, da es weiß, dass sich der Pinsel nicht ändert.The graphics system can also make other optimizations, because it knows the brush won't change.

Hinweis

Aus Gründen der praktische Arbeit bleiben frei wählbare Objekte nicht fixiert, es sei denn, Sie fixieren Sie explizit.For convenience, freezable objects remain unfrozen unless you explicitly freeze them.

Verwenden von frei wählbaren ElementenUsing Freezables

Die Verwendung eines nicht fixierten, nicht fixierbaren Objekts ähnelt der Verwendung eines beliebigen anderen Objekt Typs.Using an unfrozen freezable is like using any other type of object. Im folgenden Beispiel SolidColorBrush wird die Farbe eines von Gelb in rot geändert, nachdem es verwendet wurde, um den Hintergrund einer Schaltfläche zu zeichnen.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. Das Grafiksystem arbeitet im Hintergrund, um die Schaltfläche automatisch von Gelb in rot zu ändern, wenn der Bildschirm das nächste Mal aktualisiert wird.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

Einfrieren eines frei wählbarenFreezing a Freezable

Um eine Freezable nicht änderbar zu machen, wird die Freeze zugehörige-Methode aufgerufen.To make a Freezable unmodifiable, you call its Freeze method. Wenn Sie ein Objekt fixieren, das frei wählbare Objekte enthält, werden diese Objekte ebenfalls eingefroren.When you freeze an object that contains freezable objects, those objects are frozen as well. Wenn Sie z. b. ein PathGeometryfixieren, werden die darin enthaltenen Abbildungen und Segmente ebenfalls eingefroren.For example, if you freeze a PathGeometry, the figures and segments it contains would be frozen too.

Ein frei wählbares kann nicht eingefroren werden, wenn Folgendes zutrifft:A Freezable can't be frozen if any of the following are true:

  • Sie verfügt über animierte oder Daten gebundene Eigenschaften.It has animated or data bound properties.

  • Sie verfügt über Eigenschaften, die von einer dynamischen Ressource festgelegt werden.It has properties set by a dynamic resource. (Weitere Informationen zu dynamischen Ressourcen finden Sie in den XAML-Ressourcen .)(See the XAML Resources for more information about dynamic resources.)

  • Sie enthält Freezable untergeordnete Objekte, die nicht eingefroren werden können.It contains Freezable sub-objects that can't be frozen.

Wenn diese Bedingungen falsch sind und Sie nicht beabsichtigen, die Freezablezu ändern, sollten Sie diese fixieren, um die zuvor beschriebenen Leistungsvorteile zu erhalten.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.

Nachdem Sie die- Freeze Methode einer frei wählbaren Methode aufgerufen haben, kann Sie nicht mehr geändert werden.Once you call a freezable's Freeze method, it can no longer be modified. Der Versuch, ein fixierte Objekt zu InvalidOperationException ändern, bewirkt, dass eine ausgelöst wird.Attempting to modify a frozen object causes an InvalidOperationException to be thrown. Der folgende Code löst eine Ausnahme aus, da versucht wird, den Pinsel zu ändern, nachdem er eingefroren wurde.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

Um zu vermeiden, dass diese Ausnahme ausgelöst wird, IsFrozen können Sie mithilfe der- Freezable Methode bestimmen, ob ein eingefroren ist.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


Im vorangehenden Codebeispiel wurde mit der Clone -Methode eine änderbare Kopie von einem fixierten-Objekt erstellt.In the preceding code example, a modifiable copy was made of a frozen object using the Clone method. Im nächsten Abschnitt wird das Klonen ausführlicher erläutert.The next section discusses cloning in more detail.

Hinweis Da eine fixierte freisetzbare nicht animiert werden kann, erstellt das Animationssystem automatisch änderbare Klone von Freezable fixierten Objekten, wenn Sie versuchen, Sie mit einem Storyboardzu animieren.Note Because 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. Um den durch das Klonen verursachten Leistungs Aufwand zu vermeiden, lassen Sie ein Objekt nicht fixiert, wenn Sie es animieren möchten.To eliminate the performance overhead caused by cloning, leave an object unfrozen if you intend to animate it. Weitere Informationen zur Animation mit Storyboards finden Sie in der Übersicht über Storyboards.For more information about animating with storyboards, see the Storyboards Overview.

Einfrieren von MarkupFreezing from Markup

Um ein Freezable im Markup deklariertes-Objekt zu fixieren, PresentationOptions:Freeze verwenden Sie das-Attribut.To freeze a Freezable object declared in markup, you use the PresentationOptions:Freeze attribute. Im folgenden Beispiel wird eine SolidColorBrush als Seiten Ressource deklariert und fixiert.In the following example, a SolidColorBrush is declared as a page resource and frozen. Sie wird dann verwendet, um den Hintergrund einer Schaltfläche festzulegen.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>

Um das Freeze -Attribut zu verwenden, müssen Sie den Präsentations Optionen-Namespace http://schemas.microsoft.com/winfx/2006/xaml/presentation/optionszuordnen:.To use the Freeze attribute, you must map to the presentation options namespace: http://schemas.microsoft.com/winfx/2006/xaml/presentation/options. PresentationOptionsist das empfohlene Präfix für die Zuordnung dieses Namespace:PresentationOptions is the recommended prefix for mapping this namespace:

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

Da nicht alle XAML-Reader dieses Attribut erkennen, empfiehlt es sich, das MC: Ignorable-Attribut zu verwenden, Presentation:Freeze um das Attribut als Ignorable zu markieren: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"  

Weitere Informationen finden Sie auf der Seite " MC: Ignorable Attribute ".For more information, see the mc:Ignorable Attribute page.

"Einfrieren" eines frei wählbaren"Unfreezing" a Freezable

Nachdem Sie eingefroren ist Freezable , kann eine nie geändert oder nicht fixiert werden. Sie können jedoch einen nicht fixierten Klon mithilfe Clone der CloneCurrentValue -oder-Methode erstellen.Once frozen, a Freezable can never be modified or unfrozen; however, you can create an unfrozen clone using the Clone or CloneCurrentValue method.

Im folgenden Beispiel wird der Hintergrund der Schaltfläche mit einem Pinsel festgelegt, und der Pinsel wird dann fixiert.In the following example, the button's background is set with a brush and that brush is then frozen. Eine nicht fixierte Kopie wird mithilfe der Clone -Methode aus dem Pinsel erstellt.An unfrozen copy is made of the brush using the Clone method. Der Klon wird geändert und verwendet, um den Hintergrund der Schaltfläche von Gelb in rot zu ändern.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

Hinweis

Unabhängig davon, welche Klon Methode Sie verwenden, werden Animationen nie in den neuen Freezablekopiert.Regardless of which clone method you use, animations are never copied to the new Freezable.

Die Clone - CloneCurrentValue Methode und die-Methode ergeben Tiefe Kopien der frei wählbaren.The Clone and CloneCurrentValue methods produce deep copies of the freezable. Wenn das freisetzbare Objekt andere fixierte, freisetzbare Objekte enthält, werden diese auch geklont und als änderbar festgelegt.If the freezable contains other frozen freezable objects, they are also cloned and made modifiable. Wenn Sie z. b. ein PathGeometry -Element Klonen, um es änderbar zu machen, werden die darin enthaltenen Abbildungen und Segmente ebenfalls kopiert und als änderbar festgelegt.For example, if you clone a frozen PathGeometry to make it modifiable, the figures and segments it contains are also copied and made modifiable.

Erstellen einer eigenen, frei wählbaren KlasseCreating Your Own Freezable Class

Eine Klasse, die von Freezable abgeleitet wird, erhält die folgenden Funktionen.A class that derives from Freezable gains the following features.

  • Sonderzustände: schreibgeschützt (fixiert) und beschreibbar.Special states: a read-only (frozen) and a writable state.

  • Thread Sicherheit: eine Freezable fixierte kann über mehrere Threads gemeinsam genutzt werden.Thread safety: a frozen Freezable can be shared across threads.

  • Ausführliche Änderungs Benachrichtigung: Im Gegensatz DependencyObjectzu anderen s bieten frei wählbare Objekte Änderungs Benachrichtigungen, wenn sich untergeordnete Eigenschaftswerte ändern.Detailed change notification: Unlike other DependencyObjects, Freezable objects provide change notifications when sub-property values change.

  • Einfaches Klonen: die Klasse, die frei wählbar ist, hat bereits mehrere Methoden implementiert, die Tiefe Klone ergeben.Easy cloning: the Freezable class has already implemented several methods that produce deep clones.

Ein Freezable ist ein Typ von DependencyObjectund verwendet daher das Abhängigkeits Eigenschaften System.A Freezable is a type of DependencyObject, and therefore uses the dependency property system. Die Klasseneigenschaften müssen keine Abhängigkeits Eigenschaften sein, aber die Verwendung von Abhängigkeits Eigenschaften verringert die Menge an Code, den Sie schreiben müssen Freezable , da die-Klasse mit den Abhängigkeits Eigenschaften entworfen wurde.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. Weitere Informationen zum Abhängigkeits Eigenschafts System finden Sie unter Übersicht über Abhängigkeits Eigenschaften.For more information about the dependency property system, see the Dependency Properties Overview.

Jede Freezable Unterklasse muss die CreateInstanceCore -Methode überschreiben.Every Freezable subclass must override the CreateInstanceCore method. Wenn Ihre Klasse Abhängigkeits Eigenschaften für alle Ihre Daten verwendet, sind Sie fertig.If your class uses dependency properties for all its data, you're finished.

Wenn Ihre Klasse Datenelemente für nicht-Abhängigkeits Eigenschaften enthält, müssen Sie auch die folgenden Methoden überschreiben:If your class contains non-dependency property data members, you must also override the following methods:

Außerdem müssen Sie die folgenden Regeln für den Zugriff auf und das Schreiben von Datenmembern beachten, die keine Abhängigkeits Eigenschaften sind:You must also observe the following rules for accessing and writing to data members that are not dependency properties:

  • Zum Anfang einer API, die Datenmember ohne Abhängigkeits Eigenschaften liest, wird die ReadPreamble -Methode aufgerufen.At the beginning of any API that reads non-dependency property data members, call the ReadPreamble method.

  • Zum Anfang einer API, die nicht-Abhängigkeits eigenschaftendatenmember schreibt, WritePreamble wird die-Methode aufgerufen.At the beginning of any API that writes non-dependency property data members, call the WritePreamble method. (Nachdem Sie in einer WritePreamble API aufgerufen haben, müssen Sie keinen zusätzlichen Aufruf von ReadPreamble durchführen, wenn Sie auch nicht-Abhängigkeits eigenschaftendatenmember lesen.)(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.)

  • Ruft die WritePostscript -Methode auf, bevor Methoden beendet werden, die in Datenelemente ohne Abhängigkeits Eigenschaften schreiben.Call the WritePostscript method before exiting methods that write to non-dependency property data members.

Wenn die Klasse nicht-Abhängigkeits Eigenschafts Datenmember enthält, DependencyObject die Objekte sind, müssen Sie auch OnFreezablePropertyChanged die-Methode jedes Mal, wenn Sie einen ihrer Werte ändern, auch dann aufzurufen, nullWenn Sie den-Member auf festlegen.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.

Hinweis

Es ist sehr wichtig, dass Sie jede Freezable Methode, die Sie überschreiben, mit einem-Befehl der Basis Implementierung starten.It's very important that you begin each Freezable method you override with a call to the base implementation.

Ein Beispiel für eine benutzerdefinierte Freezable Klasse finden Sie im Beispiel für eine Benutzerdefinierte Animation.For an example of a custom Freezable class, see the Custom Animation Sample.

Siehe auchSee also