Freezable Nesnelerine Genel BakışFreezable Objects Overview

Bu konuda, uygulama performansının artırılmasına yardımcı olabilecek özel özellikler sağlayan Freezable nesnelerinin etkin bir şekilde kullanılması ve oluşturulması açıklanmaktadır.This topic describes how to effectively use and create Freezable objects, which provide special features that can help improve application performance. Freezable nesne örnekleri, fırçalar, kalemler, dönüşümler, geometriler ve animasyonları içerir.Examples of freezable objects include brushes, pens, transformations, geometries, and animations.

Freezable nedir?What Is a Freezable?

Freezable, iki durumu olan özel bir nesne türüdür: dondurulmamış ve dondurulmuş.A Freezable is a special type of object that has two states: unfrozen and frozen. Dondurulmamış olduğunda, Freezable diğer herhangi bir nesne gibi davranır.When unfrozen, a Freezable appears to behave like any other object. Dondurulduktan sonra, Freezable artık değiştirilemez.When frozen, a Freezable can no longer be modified.

Freezable, nesne üzerinde yapılan herhangi bir değişiklik için gözlemcilerin 'a bildirimde bulunan Changed bir olay sağlar.A Freezable provides a Changed event to notify observers of any modifications to the object. Bir Freezable dondurmak, artık kaynakları değişiklik bildirimleri üzerinde harcaması gerekmediği için performansını iyileştirebilir.Freezing a Freezable can improve its performance, because it no longer needs to spend resources on change notifications. Dondurulmuş bir Freezable iş parçacıkları arasında da paylaşılabilir, ancak dondurulmamış bir Freezable olamaz.A frozen Freezable can also be shared across threads, while an unfrozen Freezable cannot.

Freezable sınıfında birçok uygulama olsa da, Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) içindeki çoğu Freezable nesne grafik alt sistemiyle ilgilidir.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 sınıfı, belirli grafik sistem nesnelerinin kullanılmasını kolaylaştırır ve uygulama performansının artırılmasına yardımcı olabilir.The Freezable class makes it easier to use certain graphics system objects and can help improve application performance. Freezable 'ten devraldığı türlerin örnekleri Brush, Transformve Geometry sınıflarını içerir.Examples of types that inherit from Freezable include the Brush, Transform, and Geometry classes. Yönetilmeyen kaynaklar içerdiğinden, sistemin bu nesneleri değişikliklere karşı izlemesi gerekir ve özgün nesnede bir değişiklik olduğunda ilgili yönetilmeyen kaynaklarını güncelleştirmelidir.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. Bir grafik sistemi nesnesini gerçekten değiştirmese de, sistemin değişiklik yapması durumunda nesneyi izleyen bazı kaynakları harcaması gerekir.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.

Örneğin, bir SolidColorBrush fırçası oluşturduğunuzu ve düğmenin arka planını boyamak için kullandığınızı varsayalım.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

Düğme işlendiğinde WPFWPF grafik alt sistemi, bir düğmenin görünümünü oluşturmak için bir piksel grubunu boyamak üzere verdiğiniz bilgileri kullanır.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. Düğmenin nasıl boyanması gerektiğini betimleyen bir düz renk fırçası kullansanız da, düz renk fırçanızı gerçekten boyama yapmaz.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. Grafik sistemi, düğme ve fırça için hızlı, alt düzey nesneler oluşturur ve aslında ekranda görünen nesnelerdir.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.

Fırçayı değiştirmek istiyorsanız, bu alt düzey nesnelerin yeniden oluşturulması gerekir.If you were to modify the brush, those low-level objects would have to be regenerated. Freezable sınıfı, bir fırçaya karşılık gelen oluşturulan, alt düzey nesneleri bulma ve değişiklik yaparken bunları güncelleştirme olanağı sunar.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. Bu özellik etkinleştirildiğinde, fırça "dondurulmamış" olarak kabul edilir.When this ability is enabled, the brush is said to be "unfrozen."

Freezable 'ın Freeze yöntemi, bu kendi kendini güncelleştirme yeteneğini devre dışı bırakmanızı sağlar.A freezable's Freeze method enables you to disable this self-updating ability. Fırçayı "dondurulmuş" veya değiştirilemez hale getirmek için bu yöntemi kullanabilirsiniz.You can use this method to make the brush become "frozen," or unmodifiable.

Not

Her Freezable nesnesi dondurulamıyor.Not every Freezable object can be frozen. Bir InvalidOperationExceptionoluşturmamaya kaçınmak için, dondurmadan önce dondurulmuş olup olmadığını öğrenmek üzere Freezable nesnesinin CanFreeze özelliğinin değerini denetleyin.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 'ı değiştirmenize gerek kalmadığında performans avantajları sağlar.When you no longer need to modify a freezable, freezing it provides performance benefits. Bu örnekteki fırçayı dondurursanız, grafik sisteminin artık değişiklikleri izlemek zorunda kalmaz.If you were to freeze the brush in this example, the graphics system would no longer need to monitor it for changes. Fırçanın değişmediği bildiğinden, grafik sistemi başka iyileştirmeler de yapabilir.The graphics system can also make other optimizations, because it knows the brush won't change.

Not

Daha kolay bir şekilde dondurmadığınız takdirde, Freezable nesneler dondurulmamış olarak kalır.For convenience, freezable objects remain unfrozen unless you explicitly freeze them.

Freezable nesneleri kullanmaUsing Freezables

Dondurulmamış bir Freezable kullanmak, herhangi bir nesne türünü kullanmak gibidir.Using an unfrozen freezable is like using any other type of object. Aşağıdaki örnekte, bir düğmenin arka planını boyamak için kullanıldıktan sonra bir SolidColorBrush rengi sarıya kırmızıya dönüştürülür.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. Grafik sistemi, ekranın arkasında bir sonraki sefer yenilendiğinde düğme sarıdan kırmızıya otomatik olarak değiştirilmesini sağlar.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 'ı dondurmaFreezing a Freezable

Freezable değiştirilemez yapmak için, Freeze yöntemini çağırın.To make a Freezable unmodifiable, you call its Freeze method. Freezable nesneleri içeren bir nesneyi dondurursanız, bu nesneler de dondurulur.When you freeze an object that contains freezable objects, those objects are frozen as well. Örneğin, bir PathGeometrydondurursanız, içerdiği şekiller ve segmentler de dondurulur.For example, if you freeze a PathGeometry, the figures and segments it contains would be frozen too.

Aşağıdakilerden biri doğruysa Freezable dondurulamıyor:A Freezable can't be frozen if any of the following are true:

  • Animasyonlu veya veri bağlantılı özelliklere sahiptir.It has animated or data bound properties.

  • Dinamik bir kaynak tarafından ayarlanan özelliklere sahiptir.It has properties set by a dynamic resource. (Dinamik kaynaklar hakkında daha fazla bilgi için bkz. xaml kaynakları .)(See the XAML Resources for more information about dynamic resources.)

  • Dondurulamayan Freezable alt nesneler içerir.It contains Freezable sub-objects that can't be frozen.

Bu koşullar yanlışsa ve Freezabledeğiştirmeyi düşünmüyorsanız, daha önce açıklanan performans avantajlarını kazanmak için bu koşulları dondurmanız gerekir.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 'ın Freeze yöntemini çağırdığınızda, artık değiştirilemez.Once you call a freezable's Freeze method, it can no longer be modified. Dondurulmuş bir nesneyi değiştirme girişimi bir InvalidOperationException oluşturulmasına neden olur.Attempting to modify a frozen object causes an InvalidOperationException to be thrown. Aşağıdaki kod bir özel durum oluşturur, çünkü bir fırçayı dondurulmuş olduktan sonra değiştirmeyi deneiyoruz.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

Bu özel durumun üretilmesini önlemek için, bir Freezable dondurulmuş olup olmadığını anlamak üzere IsFrozen yöntemini kullanabilirsiniz.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


Yukarıdaki kod örneğinde, dondurulmuş bir nesneden Clone yöntemi kullanılarak değiştirilebilir bir kopya yapılmıştır.In the preceding code example, a modifiable copy was made of a frozen object using the Clone method. Sonraki bölümde kopyalamayı daha ayrıntılı olarak ele alınmaktadır.The next section discusses cloning in more detail.

Not

Dondurulmuş bir Freezable animasyon uygulanamadığından, bir Storyboardhareketlendirmek istediğinizde animasyon sistemi otomatik olarak dondurulmuş Freezable nesnelerinin değiştirilebilir klonlarını oluşturur.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. Kopyalamanın neden olduğu performans yükünü ortadan kaldırmak için, hareketlendirmek istiyorsanız nesne dondurulmamış olarak bırakın.To eliminate the performance overhead caused by cloning, leave an object unfrozen if you intend to animate it. Görsel taslaklara animasyon ekleme hakkında daha fazla bilgi için bkz. görsel taslaklara genel bakışFor more information about animating with storyboards, see the Storyboards Overview.

Biçimlendirmeden dondurmaFreezing from Markup

Biçimlendirme içinde belirtilen bir Freezable nesnesini dondurmak için PresentationOptions:Freeze özniteliğini kullanırsınız.To freeze a Freezable object declared in markup, you use the PresentationOptions:Freeze attribute. Aşağıdaki örnekte, bir SolidColorBrush sayfa kaynağı olarak bildirildiği ve dondurulmuş.In the following example, a SolidColorBrush is declared as a page resource and frozen. Daha sonra bir düğmenin arka planını ayarlamak için kullanılır.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 özniteliğini kullanmak için, sunu seçenekleri ad alanına eşlemeniz gerekir: 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, bu ad alanını eşlemek için önerilen önekidir:PresentationOptions is the recommended prefix for mapping this namespace:

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

Tüm XAML okuyucuları bu özniteliği tanımadığı için, Presentation:Freeze özniteliğini yoksayılabilir olarak işaretlemek için mc: Ignorable özniteliğini kullanmanız önerilir: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"

Daha fazla bilgi için bkz. mc: Ignorable özniteliği sayfası.For more information, see the mc:Ignorable Attribute page.

Freezable "dondurmayı kaldırma""Unfreezing" a Freezable

Dondurulduktan sonra, Freezable hiçbir şekilde değiştirilemez veya çözülemez; Ancak, Clone veya CloneCurrentValue yöntemini kullanarak dondurulmamış bir kopya oluşturabilirsiniz.Once frozen, a Freezable can never be modified or unfrozen; however, you can create an unfrozen clone using the Clone or CloneCurrentValue method.

Aşağıdaki örnekte, düğmenin arka planı fırçayla ayarlanır ve bu fırça daha sonra dondurulur.In the following example, the button's background is set with a brush and that brush is then frozen. Clone yöntemi kullanılarak fırçayla dondurulmamış bir kopya yapılır.An unfrozen copy is made of the brush using the Clone method. Kopya değiştirilir ve düğmenin arka planını sarıdan kırmızıya değiştirmek için kullanılır.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

Not

Kullandığınız kopya yönteminden bağımsız olarak, animasyonlar hiçbir şekilde yeni Freezablekopyalanmaz.Regardless of which clone method you use, animations are never copied to the new Freezable.

Clone ve CloneCurrentValue yöntemleri, Freezable 'ın derin kopyalarını oluşturur.The Clone and CloneCurrentValue methods produce deep copies of the freezable. Freezable diğer dondurulmuş Freezable nesnelerini içeriyorsa, bunlar da klonlanır ve değiştirilebilir hale getirilir.If the freezable contains other frozen freezable objects, they are also cloned and made modifiable. Örneğin, değiştirilebilir yapmak için dondurulmuş bir PathGeometry klonladığınızda, içerdiği şekiller ve segmentler de kopyalanır ve değiştirilebilir hale getirilir.For example, if you clone a frozen PathGeometry to make it modifiable, the figures and segments it contains are also copied and made modifiable.

Kendi Freezable sınıfınızı oluşturmaCreating Your Own Freezable Class

Freezable türetilen bir sınıf aşağıdaki özellikleri kazanır.A class that derives from Freezable gains the following features.

  • Özel durumlar: salt okunurdur (dondurulmuş) ve yazılabilir bir durumdur.Special states: a read-only (frozen) and a writable state.

  • İş parçacığı güvenliği: dondurulmuş bir Freezable, iş parçacıkları arasında paylaşılabilir.Thread safety: a frozen Freezable can be shared across threads.

  • Ayrıntılı değişiklik bildirimi: diğer DependencyObjectöğelerinden farklı olarak, Freezable nesneleri, alt özellik değerleri değiştiğinde değişiklik bildirimleri sağlar.Detailed change notification: Unlike other DependencyObjects, Freezable objects provide change notifications when sub-property values change.

  • Kolay kopyalama: Freezable sınıfı derin kopyalar üreten birkaç yöntemi zaten uygulamıştır.Easy cloning: the Freezable class has already implemented several methods that produce deep clones.

Freezable bir DependencyObjecttürüdür ve bu nedenle bağımlılık özellik sistemini kullanır.A Freezable is a type of DependencyObject, and therefore uses the dependency property system. Sınıf özelliklerindeki bağımlılık özellikleri olması gerekmez, ancak bağımlılık özelliklerinin kullanılması, Freezable sınıfı bağımlılık özellikleriyle birlikte tasarlandığından, yazmanız gereken kod miktarını azaltır.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. Bağımlılık özelliği sistemi hakkında daha fazla bilgi için bkz. bağımlılık özelliklerine genel bakış.For more information about the dependency property system, see the Dependency Properties Overview.

Her Freezable alt sınıfı CreateInstanceCore yöntemi geçersiz kılmalıdır.Every Freezable subclass must override the CreateInstanceCore method. Sınıfınız tüm verileri için bağımlılık özelliklerini kullanıyorsa işiniz tamamlanmıştır.If your class uses dependency properties for all its data, you're finished.

Sınıfınız bağımlılık olmayan özellik verisi üyeleri içeriyorsa, aşağıdaki yöntemleri de geçersiz kılmanız gerekir:If your class contains non-dependency property data members, you must also override the following methods:

Bağımlılık özellikleri olmayan veri üyelerine erişmek ve bunlara yazmak için aşağıdaki kuralları da gözlemleyebilirsiniz:You must also observe the following rules for accessing and writing to data members that are not dependency properties:

  • Bağımlılık olmayan özellik veri üyelerini okuyan herhangi bir API 'nin başlangıcında ReadPreamble yöntemini çağırın.At the beginning of any API that reads non-dependency property data members, call the ReadPreamble method.

  • Bağımlılık olmayan özellik veri üyelerini yazan herhangi bir API 'nin başlangıcında WritePreamble yöntemini çağırın.At the beginning of any API that writes non-dependency property data members, call the WritePreamble method. (Bir API 'de WritePreamble çağrıldıktan sonra, bağımlılık olmayan özellik veri üyelerini de okuduğunuzda ReadPreamble için ek bir çağrı yapmanız gerekmez.)(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.)

  • Bağımlılık olmayan özellik veri üyelerine yazılan yöntemlerden çıkmadan önce WritePostscript yöntemini çağırın.Call the WritePostscript method before exiting methods that write to non-dependency property data members.

Sınıfınız DependencyObject nesneler olan bağımlılık dışı özellik veri üyelerini içeriyorsa, üyeyi nullolarak ayarlasanız bile, değerlerinden birini her değiştirişinizde OnFreezablePropertyChanged yöntemini de çağırmanız gerekir.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.

Not

Geçersiz kıldığınız her bir Freezable yöntemi temel uygulamaya yapılan bir çağrı ile başlamanız çok önemlidir.It's very important that you begin each Freezable method you override with a call to the base implementation.

Özel bir Freezable sınıfına bir örnek için bkz. özel animasyon örneği.For an example of a custom Freezable class, see the Custom Animation Sample.

Ayrıca bkz.See also