Freezable オブジェクトの概要Freezable Objects Overview

このトピックを効果的に使用して作成する方法について説明Freezableオブジェクトで、アプリケーションのパフォーマンスを改善する特別な機能を提供します。This topic describes how to effectively use and create Freezable objects, which provide special features that can help improve application performance. Freezable オブジェクトの例には、ブラシ、ペン、変換、ジオメトリ、およびアニメーションが含まれます。Examples of freezable objects include brushes, pens, transformations, geometries, and animations.

Freezable は何ですか。What Is a Freezable?

AFreezableを 2 つの状態を持つオブジェクトの特別な種類: 固定おらず、固定されています。A Freezable is a special type of object that has two states: unfrozen and frozen. マスクされていない、ときに、Freezableするその他のオブジェクトと同様に動作が表示されます。When unfrozen, a Freezable appears to behave like any other object. 固定されると、Freezable変更不要になったことができます。When frozen, a Freezable can no longer be modified.

AFreezable提供、Changedオブジェクトに変更を加えるのオブザーバーに通知するイベントです。A Freezable provides a Changed event to notify observers of any modifications to the object. 固定すること、Freezable変更通知にリソースを費やす必要がなくなったため、パフォーマンスを向上することができます。Freezing a Freezable can improve its performance, because it no longer needs to spend resources on change notifications. 固定されたFreezable、固定されていないときに、スレッド間で共有することもFreezableことはできません。A frozen Freezable can also be shared across threads, while an unfrozen Freezable cannot.

Freezableクラスには多くのアプリケーションで最もFreezableオブジェクトWindows Presentation Foundation (WPF)Windows Presentation Foundation (WPF)グラフィックス サブシステムに関連します。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.

Freezableクラスは、特定のグラフィックス システム オブジェクトを使用するが容易し、アプリケーションのパフォーマンスを向上させることができます。The Freezable class makes it easier to use certain graphics system objects and can help improve application performance. 継承する型の例についてはFreezable含める、 BrushTransform、およびGeometryクラスです。Examples of types that inherit from Freezable include the Brush, Transform, and Geometry classes. アンマネージ リソースを含んでいるため、システムがこれらのオブジェクトの変更を監視を更新した後、元のオブジェクトへの変更がある場合に、対応するアンマネージ リソースを更新する必要があります。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. 場合でも、実際には、グラフィックス システム オブジェクトを変更しない、システム使う必要がありますが、オブジェクトの監視にリソースの一部これを変更する場合にします。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.

たとえば、作成する、SolidColorBrushブラシし、ボタンの背景の描画に使用します。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

ボタンが表示されると、WPFWPFグラフィックス サブ システム ボタンの外観を作成するピクセルのグループを描画する提供情報を使用します。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. 純色のブラシを使用して、ボタンを描画する方法について説明した、純色のブラシしない描画を行う実際には。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. グラフィックス システムが、ボタンとブラシに高速で低レベルのオブジェクトを生成し、実際に画面に表示されるこれらのオブジェクトはします。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.

ブラシを変更する場合は、それらの低レベルのオブジェクトが再生成する必要があります。If you were to modify the brush, those low-level objects would have to be regenerated. Freezable クラスは、どのようなことができます、ブラシが変更されたときに更新して、対応する生成され、低レベルのオブジェクトを検索します。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. この機能を有効にすると、ブラシが「固定」すると言います。When this ability is enabled, the brush is said to be "unfrozen."

フリーズのFreezeメソッドでは、この自動更新機能を無効にすることができます。A freezable's Freeze method enables you to disable this self-updating ability. このメソッドを使用すると、「固定」、または不可能な状態になるブラシを作成します。You can use this method to make the brush become "frozen," or unmodifiable.

注意

Freezable オブジェクトすべてを固定することができます。Not every Freezable object can be frozen. スローされないようにする、 InvalidOperationException、Freezable オブジェクトの値をチェックしてCanFreeze固定にする前に固定できるかどうかを決定するプロパティです。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

不要になった、フリーズを修正する必要がある場合は、パフォーマンス上の利点を提供固定します。When you no longer need to modify a freezable, freezing it provides performance benefits. この例では、ブラシを固定する場合は、グラフィックス システムは変更を監視する必要がなくなります。If you were to freeze the brush in this example, the graphics system would no longer need to monitor it for changes. グラフィックス システムは、その他の最適化をブラシが変更されないに認識していることもできます。The graphics system can also make other optimizations, because it knows the brush won't change.

注意

便宜上、freezable オブジェクトは、明示的に固定する場合を除き、固定されていない残ります。For convenience, freezable objects remain unfrozen unless you explicitly freeze them.

Freezable の使用Using Freezables

使用、固定されていない freezable は、その他の種類のオブジェクトを使用するなどです。Using an unfrozen freezable is like using any other type of object. 次の例では、色、SolidColorBrushが黄色から赤に後に変更ボタンの背景の描画に使用されます。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. グラフィックス システムでは、バック グラウンドで自動的に変更するボタン黄色から赤に画面の [次へ] の更新では動作します。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

Freezable はフリーズFreezing a Freezable

させる、Freezable呼び出して、変更不可能になってそのFreezeメソッドです。To make a Freezable unmodifiable, you call its Freeze method. Freezable オブジェクトを格納しているオブジェクトを固定すると、それらのオブジェクトが固定されているとします。When you freeze an object that contains freezable objects, those objects are frozen as well. 保持する場合など、PathGeometry図形やが含まれているセグメントは固定すぎます。For example, if you freeze a PathGeometry, the figures and segments it contains would be frozen too.

Freezableできません次のいずれかに当てはまる場合に固定します。A Freezable can't be frozen if any of the following are true:

  • アニメーション化されたか、データ バインドされたプロパティ。It has animated or data bound properties.

  • 動的リソースによって設定されるプロパティがあります。It has properties set by a dynamic resource. (を参照してください、 XAML リソース動的なリソースの詳細についてはします)。(See the XAML Resources for more information about dynamic resources.)

  • 含まれているFreezableサブオブジェクトを固定することはできません。It contains Freezable sub-objects that can't be frozen.

これらの条件が false の場合、および変更にしないかどうか、 Freezable、その前に説明したパフォーマンス メリットを得られることを固定する必要があります。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.

呼び出す、freezable のFreezeメソッドを変更できません。Once you call a freezable's Freeze method, it can no longer be modified. 固定された変更しようとしています。 オブジェクトの原因として、InvalidOperationExceptionがスローされます。Attempting to modify a frozen object causes an InvalidOperationException to be thrown. 次のコードでは、フリーズした後にブラシを変更するために、例外がスローされます。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

この例外がスローされることを避けるためには、使用することができます、IsFrozenメソッドを呼び出せば確認するかどうか、Freezableが固定されています。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


前のコード例では、変更可能なコピーが行われたの固定されたオブジェクトを使用して、Cloneメソッドです。In the preceding code example, a modifiable copy was made of a frozen object using the Clone method. 次のセクションでは、さらに詳しくクローン作成について説明します。The next section discusses cloning in more detail.

ため固定された freezable できませんアニメーション化、アニメーションは自動的に作成の変更可能な複製固定されたFreezableオブジェクトをアニメーション化をしようとすると、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. によるパフォーマンスのオーバーヘッドが複製をなくすためには、アニメーション化する場合にマスクされていないオブジェクトのままにします。To eliminate the performance overhead caused by cloning, leave an object unfrozen if you intend to animate it. ストーリー ボードでのアニメーション化の詳細については、次を参照してください。、ストーリー ボードの概要です。For more information about animating with storyboards, see the Storyboards Overview.

マークアップからのフリーズFreezing from Markup

固定するのには、Freezableオブジェクトを使用するマークアップで宣言された、PresentationOptions:Freeze属性。To freeze a Freezable object declared in markup, you use the PresentationOptions:Freeze attribute. 次の例で、SolidColorBrushはページ リソースとして宣言されており、固定されています。In the following example, a SolidColorBrush is declared as a page resource and frozen. ボタンの背景を設定するのには使用されます。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>

使用する、Freeze属性、プレゼンテーションのオプションの名前空間にマップする必要があります: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 この名前空間のマッピングの推奨されるプレフィックスを示します。PresentationOptions is the recommended prefix for mapping this namespace:

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

すべての XAML リーダーは、この属性を認識、ためにを使用することをお勧めしますが、 mc: Ignorable 属性をマークする、Presentation:Freeze属性を無視できます。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"  

詳細については、次を参照してください。、 mc: Ignorable 属性ページ。For more information, see the mc:Ignorable Attribute page.

「固定解除」フリーズ"Unfreezing" a Freezable

1 回凍結されている場合、Freezable決してを変更または固定です。 ただし、を使用して、固定されていない複製を作成することができます、CloneまたはCloneCurrentValueメソッドです。Once frozen, a Freezable can never be modified or unfrozen; however, you can create an unfrozen clone using the Clone or CloneCurrentValue method.

次の例では、ブラシを使用してボタンの背景が設定され、そのブラシは、固定されています。In the following example, the button's background is set with a brush and that brush is then frozen. ブラシを使用して、固定されていないコピーされる、Cloneメソッドです。An unfrozen copy is made of the brush using the Clone method. クローンが変更し、赤、黄色からボタンの背景を変更するために使用します。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

注意

アニメーションを決してを新しいコピーを使用するどの複製方法に関係なくFreezableです。Regardless of which clone method you use, animations are never copied to the new Freezable.

CloneCloneCurrentValueメソッドが、freezable のディープ コピーを作成します。The Clone and CloneCurrentValue methods produce deep copies of the freezable. 場合は、格納されているその他の固定 freezable オブジェクトも複製され変更可能です。If the freezable contains other frozen freezable objects, they are also cloned and made modifiable. たとえば、固定された複製するPathGeometryを変更可能なため、図とが含まれているセグメントもコピーされ変更可能です。For example, if you clone a frozen PathGeometry to make it modifiable, the figures and segments it contains are also copied and made modifiable.

Freezable クラスの作成Creating Your Own Freezable Class

派生したクラスFreezable次の機能を取得します。A class that derives from Freezable gains the following features.

  • 特殊な状態: 読み取り専用 (固定)、書き込み可能な状態です。Special states: a read-only (frozen) and a writable state.

  • スレッド セーフ: 固定されたFreezableスレッド間で共有できます。Thread safety: a frozen Freezable can be shared across threads.

  • 変更通知の詳細: その他のとは異なりDependencyObjects、Freezable オブジェクトでは、変更通知サブ プロパティの値を変更します。Detailed change notification: Unlike other DependencyObjects, Freezable objects provide change notifications when sub-property values change.

  • 簡単な複製: Freezable のクラスが既にディープ クローンを生成するいくつかのメソッドを実装します。Easy cloning: the Freezable class has already implemented several methods that produce deep clones.

AFreezableの種類は、 DependencyObject、ため、依存関係プロパティ システムを使用します。A Freezable is a type of DependencyObject, and therefore uses the dependency property system. クラスのプロパティの依存関係プロパティを指定する必要はありませんが、依存関係プロパティを使用する必要のあるコードを記述するための量を削減は、Freezable注意の依存関係プロパティをクラスが設計されています。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. 依存関係プロパティ システムの詳細については、次を参照してください。、依存関係プロパティの概要です。For more information about the dependency property system, see the Dependency Properties Overview.

Freezableサブクラスをオーバーライドする必要があります、CreateInstanceCoreメソッドです。Every Freezable subclass must override the CreateInstanceCore method. クラスは、そのすべてのデータの依存関係プロパティを使用している場合は、作業が終了します。If your class uses dependency properties for all its data, you're finished.

クラスに依存関係のないプロパティのデータ メンバーが含まれている場合も、次のメソッドをオーバーライドする必要があります。If your class contains non-dependency property data members, you must also override the following methods:

次のルールにアクセスして、依存関係プロパティではないデータ メンバーへの書き込みを確認する必要がも。You must also observe the following rules for accessing and writing to data members that are not dependency properties:

  • いずれかの先頭にAPIAPI依存関係のないプロパティのデータ メンバーを読み取る、呼び出し、ReadPreambleメソッドです。At the beginning of any APIAPI that reads non-dependency property data members, call the ReadPreamble method.

  • 依存関係のないプロパティのデータ メンバーの書き込みをすべての API の先頭には、呼び出し、WritePreambleメソッドです。At the beginning of any API that writes non-dependency property data members, call the WritePreamble method. (呼び出した後WritePreambleで、 APIAPI、追加の呼び出しを行う必要はありませんReadPreambleも依存関係のないプロパティのデータ メンバーを読み取るかどうかです)。(Once you've called WritePreamble in an APIAPI, you don't need to make an additional call to ReadPreamble if you also read non-dependency property data members.)

  • 呼び出す、WritePostscript依存関係のないプロパティのデータ メンバーへの書き込みメソッドを終了する前にメソッドです。Call the WritePostscript method before exiting methods that write to non-dependency property data members.

クラスにある非依存関係プロパティのデータ メンバーが含まれて かどうかDependencyObjectオブジェクトも呼び出す必要があります、OnFreezablePropertyChangedメソッド メンバーを設定している場合でもでは、これらの値、変更のするたびに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 on of their values, even if you're setting the member to null.

注意

各を開始することが非常に重要Freezable呼び出し基本実装をオーバーライドするメソッド。It's very important that you begin each Freezable method you override with a call to the base implementation.

カスタムの例についてはFreezableクラスを参照してください、カスタム アニメーション サンプルです。For an example of a custom Freezable class, see the Custom Animation Sample.

関連項目See Also

Freezable
カスタム アニメーションのサンプルCustom Animation Sample
依存関係プロパティの概要Dependency Properties Overview
カスタム依存関係プロパティCustom Dependency Properties