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.

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 클래스에는 많은 응용 프로그램이 있지만 WPF(Windows Presentation Foundation)Windows Presentation Foundation (WPF)Freezable 개체 대부분은 그래픽 하위 시스템과 관련 되어 있습니다.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, TransformGeometry 클래스가 있습니다.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. 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

이 예외가 throw 되지 않도록 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에 애니메이션을 적용할 수 없으므로 Storyboard를 사용 하 여 애니메이션을 적용 하려고 할 때 애니메이션 시스템은 고정 Freezable 개체의 수정 가능한 복제본을 자동으로 만듭니다.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에 애니메이션을 적용 하는 방법에 대 한 자세한 내용은 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.

FreezableDependencyObject형식 이므로 종속성 속성 시스템을 사용 합니다.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:

  • 비 종속성 속성 데이터 멤버를 읽는 API의 시작 부분에서 ReadPreamble 메서드를 호출 합니다.At the beginning of any API 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. API에서 WritePreamble를 호출한 후에는 종속성이 아닌 속성 데이터 멤버도 읽을 경우 ReadPreamble에 대 한 추가 호출을 수행할 필요가 없습니다.(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.)

  • 비 종속성 속성 데이터 멤버에 쓰는 메서드를 종료 하기 전에 WritePostscript 메서드를 호출 합니다.Call the WritePostscript method before exiting methods that write to non-dependency property data members.

클래스에 DependencyObject 개체를 포함 하는 비 종속성 속성 데이터 멤버가 포함 된 경우 멤버를 null로 설정 하더라도 해당 값 중 하나를 변경할 때마다 OnFreezablePropertyChanged 메서드를 호출 해야 합니다.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