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?

Freezable 는 특별 한 유형의 두 가지 상태에 있는 개체: 않음과 고정 합니다.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.

A Freezable 제공을 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 개체 WPF(Windows Presentation Foundation)Windows Presentation Foundation (WPF) 그래픽 하위 시스템에 관련 된 합니다.Although the Freezable class has many applications, most Freezable objects in WPF(Windows Presentation Foundation)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 포함 된 Brush, Transform, 및 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."

Freezable의 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. Throw 되지 않도록 하는 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

Freezable을 수정 해야 하는 더 이상, 고정 성능상의 이점을 제공 합니다.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 throw 됩니다.Attempting to modify a frozen object causes an InvalidOperationException to be thrown. 다음 코드를 고정 한 후 브러시를 수정 하려고 하기 때문에 예외를 throw 합니다.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. Storyboard로 애니메이션 효과 적용 하는 방법에 대 한 자세한 내용은 참조는 스토리 보드 개요합니다.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.

"고정 해제"를 Freezable"Unfreezing" a Freezable

하지만 고정 하면를 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은 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.

A Freezable 유형의 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. (호출한 후 WritePreambleAPIAPI를 추가로 호출할 필요가 없습니다 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 one 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