Übersicht über Freezable-ObjekteFreezable Objects Overview

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

Was ist ein Freezable-Objekt?What Is a Freezable?

Ein Freezable ist ein spezieller Typ des Objekts, das zwei Status: nicht fixiert und fixiert.A Freezable is a special type of object that has two states: unfrozen and frozen. Wenn nicht fixiert ist, eine Freezable angezeigt wie jedes andere Objekt verhält.When unfrozen, a Freezable appears to behave like any other object. Wenn fixiert, eine Freezable können nicht mehr geändert werden.When frozen, a Freezable can no longer be modified.

Ein Freezable bietet eine Changed Ereignis, um den Beobachter über Änderungen an das Objekt zu benachrichtigen.A Freezable provides a Changed event to notify observers of any modifications to the object. Sperren einer Freezable kann dessen Leistung verbessern, da sie nicht mehr zum Ausgeben von Ressourcen für änderungsbenachrichtigungen muss.Freezing a Freezable can improve its performance, because it no longer needs to spend resources on change notifications. Ein fixiertes Freezable kann auch übergreifend für Threads, während eine nicht fixierte Freezable nicht möglich.A frozen Freezable can also be shared across threads, while an unfrozen Freezable cannot.

Obwohl die Freezable -Klasse verfügt über viele Anwendungen, die meisten Freezable Objekte im Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) beziehen sich auf das untergeordnete Grafiksystem.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 erleichtert es, bestimmte Systemobjekte Grafiken zu verwenden und die Anwendungsleistung verbessern können.The Freezable class makes it easier to use certain graphics system objects and can help improve application performance. Beispiele für Typen, die von erben Freezable enthalten die Brush, Transform, und Geometry Klassen.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 für die Änderungen zu überwachen und aktualisieren Sie dann ihre entsprechenden nicht verwalteten Ressourcen aus, wenn es eine Änderung auf das ursprüngliche Objekt.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. Auch wenn Sie ein Grafikobjekt für das System tatsächlich nicht ändern können, muss das System dennoch einige ihrer Ressourcen, die Überwachung des Objekts, sorgfältig Bedenken für den Fall, dass 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 wir beispielsweise an, die Sie erstellen eine SolidColorBrush Pinsel aus, und verwenden, 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 mit der gerendert wird, die WPFWPF untergeordnete-Grafiksystem verwendet die Informationen, die Sie angegeben haben, um eine Gruppe von Pixel, um die Darstellung einer Schaltfläche erstellen zu zeichnen.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 Volltonfarbe verwendet, um beschreiben, wie die Schaltfläche gezeichnet werden soll, nicht Ihre Pinsel mit Volltonfarbe tatsächlich gezeichnet werden soll.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 der Pinsel, und die Objekte, die tatsächlich auf dem Bildschirm angezeigt werden kann.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.

Würden Sie den Pinsel ändern, müssten die Low-Level-Objekte erneut generiert werden.If you were to modify the brush, those low-level objects would have to be regenerated. Die freezable-Klasse ist, was einem Pinsel bietet die Möglichkeit, die entsprechenden generierten, Low-Level-Objekten zu suchen und diese aktualisieren, wenn sich diese ändern.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 Funktion aktiviert ist, gilt der Pinsel als "nicht fixierten."When this ability is enabled, the brush is said to be "unfrozen."

Eine Freezable Objekts Freeze Methode können Sie diese selbstaktualisierung Fähigkeit zu deaktivieren.A freezable's Freeze method enables you to disable this self-updating ability. Sie können diese Methode verwenden, um den Pinsel zu "fixierte", oder als nicht änderbar fest.You can use this method to make the brush become "frozen," or unmodifiable.

Hinweis

Nicht jede Freezable-Objekts kann fixiert werden.Not every Freezable object can be frozen. Auslösen von vermeiden einer InvalidOperationException, überprüfen Sie den Wert von Freezable-Objekts CanFreeze Eigenschaft, um zu bestimmen, ob sie eingefroren werden kann, bevor Sie versuchen, ihn einfrieren.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

Wenn Sie nicht mehr einem Freezable-Objekt ändern müssen, bietet das Fixieren Leistungsvorteile.When you no longer need to modify a freezable, freezing it provides performance benefits. Würden Sie den Pinsel in diesem Beispiel zu fixieren, würde das Grafiksystem nicht mehr benötigen, um diese Änderungen zu ü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 er weiß, dass der Pinsel nicht ändern.The graphics system can also make other optimizations, because it knows the brush won't change.

Hinweis

Der Einfachheit halber bleiben freezable-Objekte nicht fixierten, es sei denn, Sie explizit fixieren.For convenience, freezable objects remain unfrozen unless you explicitly freeze them.

Verwenden von Freezable-ObjekteUsing Freezables

Verwenden eine nicht fixierte ist wie jede andere Art von Objekt Freezable-Objekts.Using an unfrozen freezable is like using any other type of object. Im folgenden Beispiel die Farbe des eine SolidColorBrush von Gelb zu Rot geändert wird, nach der Verwendung den Hintergrund einer Schaltfläche gezeichnet.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 automatisch die Schaltfläche mit den von Gelb zu rot der nächsten Anmeldung ändern, wenn der Bildschirm 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

Das Fixieren eines Freezable-ObjektsFreezing a Freezable

Zu einem Freezable nicht änderbar ist, rufen Sie die Freeze Methode.To make a Freezable unmodifiable, you call its Freeze method. Wenn Sie ein Objekt, die von freezable-Objekte enthält fixieren, werden diese Objekte auch fixiert.When you freeze an object that contains freezable objects, those objects are frozen as well. Angenommen, Sie Einfrieren eine PathGeometry, die Abbildungen und Segmente, die es enthält würde zu fixiert werden.For example, if you freeze a PathGeometry, the figures and segments it contains would be frozen too.

Eine Freezable kann nicht fixiert werden, wenn eine der folgenden Bedingungen zutrifft:A Freezable can't be frozen if any of the following are true:

  • Es verfügt über animierte oder datengebundene Eigenschaften.It has animated or data bound properties.

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

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

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

Wenn Sie eine Freezable Objekts aufrufen Freeze -Methode kann nicht mehr geändert werden.Once you call a freezable's Freeze method, it can no longer be modified. Versucht, ein fixiertes Objekt bewirkt, dass ein InvalidOperationException ausgelöst wird.Attempting to modify a frozen object causes an InvalidOperationException to be thrown. Der folgende Code eine Ausnahme auslöst, da wir versuchen, den Pinsel ändern, nachdem es eingefroren ist.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, diese Ausnahme auslöst, können Sie die IsFrozen Methode, um zu bestimmen, ob eine Freezable 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 vorherigen Codebeispiel, erfolgte eine änderbare Kopie eines fixierten Objekts mit der Clone Methode.In the preceding code example, a modifiable copy was made of a frozen object using the Clone method. Im nächste Abschnitt noch ausführlicher Informationen zum Klonen.The next section discusses cloning in more detail.

Hinweis da einen fixierten Freezable-Objekt kann nicht animiert werden kann, das Animationssystem erstellt automatisch änderbare Klone von fixierten Freezable Objekte, wenn Sie versuchen, die sie animieren eine Storyboard.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 die Leistung Mehraufwand durch Klonen verursachte auszuschließen, lassen Sie ein Objekt, das nicht fixiert ist, wenn Sie beabsichtigen, die sie animieren.To eliminate the performance overhead caused by cloning, leave an object unfrozen if you intend to animate it. Weitere Informationen über das Animieren mit Storyboards finden Sie unter den Übersicht über Storyboards.For more information about animating with storyboards, see the Storyboards Overview.

Einfrieren von MarkupFreezing from Markup

So fixieren Sie einen Freezable Objekt deklariert im Markup, das Sie verwenden die PresentationOptions:Freeze Attribut.To freeze a Freezable object declared in markup, you use the PresentationOptions:Freeze attribute. Im folgenden Beispiel eine SolidColorBrush als Seitenressource deklariert und fixiert ist.In the following example, a SolidColorBrush is declared as a page resource and frozen. Es 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>

Verwenden der Freeze -Attribut, müssen Sie auf den Namespace der Präsentation Optionen zuordnen: http://schemas.microsoft.com/winfx/2006/xaml/presentation/options.To use the Freeze attribute, you must map to the presentation options namespace: http://schemas.microsoft.com/winfx/2006/xaml/presentation/options. PresentationOptions ist das empfohlene Präfix für die Zuordnung von diesem 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-Leser dieses Attribut erkannt wird, wird empfohlen, dass Sie verwenden die Mc: Ignorable-Attribut markieren die Presentation:Freeze als ignorierbar Attribut: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 unter den Mc: Ignorable-Attribut Seite.For more information, see the mc:Ignorable Attribute page.

"Aufheben der Fixierung von" einem Freezable-Objekt"Unfreezing" a Freezable

Einmal fixiert ist, eine Freezable können nicht geändert und nicht fixiert ist; Sie können jedoch mit einen nicht fixierten Klon erstellen die Clone oder CloneCurrentValue Methode.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 des Hintergrunds der Schaltfläche mit einem Pinsel festgelegt ist, und klicken Sie dann den Pinsel eingefroren ist.In the following example, the button's background is set with a brush and that brush is then frozen. Eine nicht fixierte Kopie des Pinsels mit erfolgt die Clone Methode.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 zu 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 Clone-Methode, die Sie verwenden, Animationen nie in die neue kopiert werden Freezable.Regardless of which clone method you use, animations are never copied to the new Freezable.

Die Clone und CloneCurrentValue Methoden erzeugt tiefe Kopien von Freezable-Objekts.The Clone and CloneCurrentValue methods produce deep copies of the freezable. Freezable-Objekts Weitere fixierte freezable-Objekte enthält, werden sie auch geklont und änderbaren vorgenommen werden soll.If the freezable contains other frozen freezable objects, they are also cloned and made modifiable. Wenn Sie ein fixiertes klonen, z. B. PathGeometry damit geändert werden können, die Abbildungen und Segmente, die es enthält auch kopiert und geändert werden vorgenommen.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 Freezable-KlasseCreating Your Own Freezable Class

Eine abgeleitete Klasse Freezable erhält die folgenden Features.A class that derives from Freezable gains the following features.

  • Besondere Zustände: eine schreibgeschützt (fixiert) und einen beschreibbaren Status.Special states: a read-only (frozen) and a writable state.

  • Threadsicherheit: ein fixiertes Freezable über Threads freigegeben werden können.Thread safety: a frozen Freezable can be shared across threads.

  • Detaillierte änderungsbenachrichtigung: Im Gegensatz zu anderen DependencyObjects, angeben Freezable-Objekte von änderungsbenachrichtigungen an, wenn untergeordnete Eigenschaftswerte ändern.Detailed change notification: Unlike other DependencyObjects, Freezable objects provide change notifications when sub-property values change.

  • Klonen einfach: die Freezable-Klasse verfügt über mehrere Methoden, die tiefe Klone erstellen bereits implementiert.Easy cloning: the Freezable class has already implemented several methods that produce deep clones.

Ein Freezable ist eine Art von DependencyObject, und daher verwendet das Abhängigkeitseigenschaftensystem.A Freezable is a type of DependencyObject, and therefore uses the dependency property system. Ihre Klasseneigenschaften müssen Abhängigkeitseigenschaften sein, aber die Verwendung von Abhängigkeitseigenschaften reduziert die Menge des Codes, die Sie schreiben da, müssen die Freezable Klasse wurde entwickelt, mit Abhängigkeitseigenschaften Bedenken.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 zu das Abhängigkeitseigenschaftensystem, finden Sie unter den Übersicht über Abhängigkeitseigenschaften.For more information about the dependency property system, see the Dependency Properties Overview.

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

Wenn Ihre Klasse ohne Abhängigkeitseigenschaft-Datenmember 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:

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

  • Rufen Sie am Anfang jeder API, die nicht als Abhängigkeitseigenschaft Datenmember liest, die ReadPreamble Methode.At the beginning of any API that reads non-dependency property data members, call the ReadPreamble method.

  • Rufen Sie am Anfang jeder API, die nicht als Abhängigkeitseigenschaft Datenmember schreibt, die WritePreamble Methode.At the beginning of any API that writes non-dependency property data members, call the WritePreamble method. (Nachdem Sie aufgerufen haben WritePreamble in einer API müssen Sie keine stellen einen zusätzlichen Aufruf ReadPreamble , wenn Sie auch ohne Abhängigkeiten eigenschaftsdatenmember 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.)

  • Rufen Sie die WritePostscript Methode vor dem Beenden der Methoden, die auf nicht-Abhängigkeitseigenschaft Datenmember zu schreiben.Call the WritePostscript method before exiting methods that write to non-dependency property data members.

Wenn Ihre Klasse nicht Abhängigkeitseigenschaften Datenelemente enthält, sind DependencyObject Objekte, Sie müssen auch aufrufen, die OnFreezablePropertyChanged Methode jedes Mal, die Sie die Werte, ändern auch wenn Sie das Element festlegen können, auf null.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 nun Freezable Methode, die Sie durch einen Aufruf der basisimplementierung überschreiben.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 unter den Beispiel für die benutzerdefinierte Animation.For an example of a custom Freezable class, see the Custom Animation Sample.

Siehe auchSee also