Freezable Nesnelerine Genel Bakış

Bu konu Freezable , uygulama performansının artırılmasına yardımcı olabilecek özel özellikler sağlayan nesneleri etkin bir şekilde kullanmayı ve oluşturmayı açıklar. Freezable nesne örnekleri, fırçalar, kalemler, dönüşümler, geometriler ve animasyonları içerir.

Freezable nedir?

Freezable, İki durumu olan özel bir nesne türüdür: dondurulmamış ve dondurulmuş. Dondurulmamış olduğunda, Freezable diğer herhangi bir nesne gibi davranır görünür. Dondurulduktan sonra, bir Freezable daha değiştirilemez.

Freezable Changed , Nesne üzerinde yapılan herhangi bir değişiklik için gözlemcilerin 'a bildirimde bulunan bir olay sağlar. FreezableYalnızca değişiklik bildirimleri üzerinde kaynakları harcaması gerekmediği için, bir performansı dondurabilir. Dondurulmuş bir Freezable şekilde, bir dondurulmamış olsa da iş parçacıkları arasında paylaşılabilir Freezable .

FreezableSınıfında birçok uygulama olsa da, içindeki çoğu Freezable nesne Windows Presentation Foundation (WPF) grafik alt sistemiyle ilgilidir.

FreezableSı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. Öğesinden devraldığı türlerin örnekleri,, Freezable Brush Transform ve Geometry sınıflarını içerir. 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. Bir grafik sistemi nesnesini gerçekten değiştirmese de, sistemin değişiklik yapması durumunda nesneyi izleyen bazı kaynakları harcaması gerekir.

Örneğin, bir SolidColorBrush fırça oluşturup bir düğmenin arka planını boyamak için bunu kullandığınızı varsayalım.

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 WPF grafik alt sistemi, bir düğmenin görünümünü oluşturmak üzere bir piksel grubunu boyamak için verdiğiniz bilgileri kullanır. 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. 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.

Fırçayı değiştirmek istiyorsanız, bu alt düzey nesnelerin yeniden oluşturulması gerekir. 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. Bu özellik etkinleştirildiğinde, fırça "dondurulmamış" olarak kabul edilir.

Freezable 'ın Freeze yöntemi bu kendi kendini güncelleştirme yeteneğini devre dışı bırakmanızı sağlar. Fırçayı "dondurulmuş" veya değiştirilemez hale getirmek için bu yöntemi kullanabilirsiniz.

Not

Her Freezable nesnesi dondurulamıyor. Bir oluşturmamaya kaçınmak için, dondurmadan InvalidOperationException CanFreeze önce dondurulmuş olup olmadığını öğrenmek için Freezable nesnesinin özelliğinin değerini kontrol edin.

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. Bu örnekteki fırçayı dondurursanız, grafik sisteminin artık değişiklikleri izlemek zorunda kalmaz. Fırçanın değişmediği bildiğinden, grafik sistemi başka iyileştirmeler de yapabilir.

Not

Daha kolay bir şekilde dondurmadığınız takdirde, Freezable nesneler dondurulmamış olarak kalır.

Freezable nesneleri kullanma

Dondurulmamış bir Freezable kullanmak, herhangi bir nesne türünü kullanmak gibidir. Aşağıdaki örnekte, bir SolidColorBrush düğmenin arka planını boyamak için kullanıldıktan sonra a 'nın rengi sarı olarak kırmızıya değiştirilir. 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.

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 'ı dondurma

Değiştirilemez yapmak için Freezable Freeze yöntemini çağırın. Freezable nesneleri içeren bir nesneyi dondurursanız, bu nesneler de dondurulur. Örneğin, bir dondurursanız PathGeometry , içerdiği şekiller ve segmentler de dondurulur.

Aşağıdakilerden biri doğruysa Freezable dondurulamıyor:

  • Animasyonlu veya veri bağlantılı özelliklere sahiptir.

  • Dinamik bir kaynak tarafından ayarlanan özelliklere sahiptir. (Dinamik kaynaklar hakkında daha fazla bilgi için bkz. xaml kaynakları .)

  • FreezableDondurulamayan alt nesneler içerir.

Bu koşullar yanlışsa ve değiştirmek istemiyorsanız, Freezable daha önce açıklanan performans avantajlarını kazanmak için bu koşulları dondurmanız gerekir.

Freezable Freeze metodunu çağırdığınızda, artık değiştirilemez. Dondurulmuş bir nesneyi değiştirme girişimi bir oluşturulmasına neden olur InvalidOperationException . Aşağıdaki kod bir özel durum oluşturur, çünkü bir fırçayı dondurulmuş olduktan sonra değiştirmeyi deneiyoruz.


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 yöntemini kullanarak bir, IsFrozen dondurulmuş olup olmadığını belirleyebilirsiniz Freezable .


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 nesne yöntemi kullanılarak değiştirilebilir bir kopya yapılmıştır Clone . Sonraki bölümde kopyalamayı daha ayrıntılı olarak ele alınmaktadır.

Not

Dondurulmuş bir Freezable animasyon oluşturamadığı için animasyon sistemi, bir ile animasyon oluşturmaya çalıştığınızda dondurulmuş nesnelerin değiştirilebilir klonlarını otomatik olarak oluşturur Freezable Storyboard . Kopyalamanın neden olduğu performans yükünü ortadan kaldırmak için, hareketlendirmek istiyorsanız nesne dondurulmamış olarak bırakın. Görsel taslaklara animasyon ekleme hakkında daha fazla bilgi için bkz. görsel taslaklara genel bakış

Biçimlendirmeden dondurma

FreezableBiçimlendirme içinde belirtilen bir nesneyi dondurmak için PresentationOptions:Freeze özniteliğini kullanırsınız. Aşağıdaki örnekte, bir SolidColorBrush sayfa kaynağı olarak bildirilmiştir ve donuktur. Daha sonra bir düğmenin arka planını ayarlamak için kullanılır.

<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>

Özniteliğini kullanmak için Freeze , sunu seçenekleri ad alanına eşlemeniz gerekir: http://schemas.microsoft.com/winfx/2006/xaml/presentation/options . PresentationOptions Bu ad alanını eşlemek için önerilen önek:

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

Tüm XAML okuyucuları bu özniteliği tanımadığından, özniteliği yoksayılabilir olarak işaretlemek için mc: Ignorable özniteliğini kullanmanız önerilir Presentation:Freeze :

xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="PresentationOptions"

Daha fazla bilgi için bkz. mc: Ignorable özniteliği sayfası.

Freezable "dondurmayı kaldırma"

Dondurulmuş bir şekilde, a Freezable hiçbir şekilde değiştirilemez veya çözülemez; ancak, veya yöntemini kullanarak dondurulmamış bir kopya oluşturabilirsiniz Clone CloneCurrentValue .

Aşağıdaki örnekte, düğmenin arka planı fırçayla ayarlanır ve bu fırça daha sonra dondurulur. Metodu kullanılarak, dondurulmamış bir kopya fırçayla yapılır Clone . Kopya değiştirilir ve düğmenin arka planını sarıdan kırmızıya değiştirmek için kullanılır.

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 bir şekilde kopyalanmaz Freezable .

CloneVe CloneCurrentValue yöntemleri, Freezable 'ın derin kopyalarını oluşturur. Freezable diğer dondurulmuş Freezable nesnelerini içeriyorsa, bunlar da klonlanır ve değiştirilebilir hale getirilir. Örneğin, PathGeometry değiştirilebilir hale getirmek için dondurulmuş bir kopya yaparsanız, içerdiği şekiller ve segmentler de kopyalanır ve değiştirilebilir hale getirilir.

Kendi Freezable sınıfınızı oluşturma

Öğesinden türetilen bir sınıf Freezable aşağıdaki özellikleri kazandığında.

  • Özel durumlar: salt okunurdur (dondurulmuş) ve yazılabilir bir durumdur.

  • İş parçacığı güvenliği: dondurulmuş bir Freezable şekilde iş parçacıkları arasında paylaşılabilir.

  • Ayrıntılı değişiklik bildirimi: diğer DependencyObject nesnelerin aksine, Freezable nesneleri, alt özellik değerleri değiştiğinde değişiklik bildirimleri sağlar.

  • Kolay kopyalama: Freezable sınıfı derin kopyalar üreten birkaç yöntemi zaten uygulamıştır.

Freezable, Bir türüdür DependencyObject ve bu nedenle bağımlılık özellik sistemini kullanır. Sınıf özelliklerinin 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. Bağımlılık özelliği sistemi hakkında daha fazla bilgi için bkz. bağımlılık özelliklerine genel bakış.

Her Freezable alt sınıf yöntemi geçersiz kılmalıdır CreateInstanceCore . Sınıfınız tüm verileri için bağımlılık özelliklerini kullanıyorsa işiniz tamamlanmıştır.

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:

Bağımlılık özellikleri olmayan veri üyelerine erişmek ve bunlara yazmak için aşağıdaki kuralları da gözlemleyebilirsiniz:

  • Bağımlılık olmayan özellik veri üyelerini okuyan herhangi bir API 'nin başlangıcında ReadPreamble yöntemini çağırın.

  • Bağımlılık olmayan özellik veri üyelerini yazan herhangi bir API 'nin başlangıcında WritePreamble yöntemini çağırın. ( WritePreamble BIR API 'de çağrıldıktan sonra, ReadPreamble bağımlılık olmayan özellik veri üyelerini de okuyabilirsiniz, için ek bir çağrı yapmanız gerekmez.)

  • WritePostscriptBağımlılık olmayan özellik veri üyelerine yazan yöntemleri çıkmadan önce yöntemini çağırın.

Sınıfınız nesneler olan bağımlılık dışı özellik veri üyelerini içeriyorsa DependencyObject , OnFreezablePropertyChanged üyesini olarak ayarlasanız bile, her bir değerini her değiştirdiğinizde yöntemi de çağırmanız gerekir null .

Not

FreezableGeçersiz kıldığınız her yöntemin temel uygulamaya yönelik bir çağrı ile başlaması çok önemlidir.

Özel bir sınıfa bir örnek için Freezable bkz. özel animasyon örneği.

Ayrıca bkz.