Performansı İyileştirme: Düzen ve Tasarım

WPF uygulama tasarımı, düzeni hesaplama ve nesne başvurularını doğrulama konusunda gereksiz yük oluşturarak performansını etkileyebilir. Özellikle çalışma zamanında nesnelerin yapısı, uygulamanın performans özelliklerini etkileyebilir.

Bu konu, bu alanlarda performans önerileri sağlar.

Layout

"Düzen geçişi" terimi, türetilmiş bir nesnenin çocuk koleksiyonunun üyelerini ölçme ve düzenleme ve sonra bunları ekranda çizme Panel sürecini açıklar. Düzen geçişi matematiksel olarak yoğun bir işlemdir; koleksiyonda çocuk sayısı ne kadar büyükse gerekli hesaplama sayısı o kadar fazladır. Örneğin, koleksiyonda bir alt nesne konumunu her değiştirse, düzen sistemi UIElement tarafından yeni bir geçiş tetikleme potansiyeline sahiptir. Nesne özellikleri ile düzen davranışı arasındaki yakın ilişki nedeniyle, düzen sistemini çağıran olayların türünü anlamak önemlidir. Uygulamanız, düzen geçişinin gereksiz çağrılarını mümkün olduğunca azaltarak daha iyi bir performans sergilemektedir.

Düzen sistemi, bir koleksiyonda her alt üye için iki geçiş tamamlar: ölçü geçişi ve düzenleme geçişi. Her alt nesne, kendi özel düzen davranışını sağlamak için ve yöntemlerinin kendi geçersiz MeasureArrange kılınan uygulamasını sağlar. En basit şekilde düzen, ekranda boyutlandırilen, konumlandı ve çizilen bir öğeye yol açan bir recursive sistemidir.

  • Alt UIElement nesne, temel özelliklerinin ölçülerek düzen işlemini başlar.

  • Nesnenin boyutla ilgili , ve gibi özellikleri FrameworkElementWidthHeightMargin değerlendirilir.

  • Panel-specific mantığı , veya DockDockPanel özelliğinin özelliği Orientation gibi StackPanel uygulanır.

  • Tüm alt nesneler ölçtükten sonra içerik düzenlenmiş veya konumlandı.

  • Alt nesneler koleksiyonu ekrana çizilir.

Aşağıdaki eylemlerden herhangi biri gerçekleşirse düzen geçiş işlemi yeniden çağrılır:

  • Koleksiyona bir alt nesne eklenir.

  • Alt LayoutTransform nesneye uygulanır.

  • yöntemi UpdateLayout alt nesne için çağrılır.

  • Ölçü veya düzenleme geçişlerini etkileyen meta verilerle işaretlenmiş bağımlılık özelliğinin değerinde bir değişiklik olduğunda.

Mümkün Olduğunca En Verimli Paneli Kullanma

Düzen işleminin karmaşıklığı, doğrudan, kullanmakta olduğunu türetilmiş öğelerin Panel düzen davranışına göre değişir. Örneğin, bir Grid veya StackPanel denetimi denetimden çok daha fazla işlev Canvas sağlar. İşlevsellikte bu büyük artışın fiyatı, performans maliyetlerde daha büyük bir artıştır. Ancak, bir denetimin sağladığı işlevlere ihtiyaç yoksa, veya özel panel gibi daha düşük Grid maliyetli Canvas alternatifleri kullansanız iyi olur.

Daha fazla bilgi için bkz. Panellere Genel Bakış.

RenderTransform Değiştirmek Yerine Güncelleştirme

değerini bir özelliğin Transform değeri olarak değiştirmek yerine RenderTransform güncelleştire biliyor olabilirsiniz. Bu özellikle animasyon içeren senaryolarda doğrudur. Mevcut bir 'yi Transform güncelleştirerek, gereksiz düzen hesaplaması yapmaktan kaçınabilirsiniz.

Ağaç Top-Down

Mantıksal ağaçtan bir düğüm ekleniyor veya kaldırılıyorsa, düğümün üst öğesinde ve tüm alt öğesinde özellik geçersiz kılınmaları ortaya çıkar. Sonuç olarak, önceden doğrulanmış düğümlerde gereksiz geçersiz kılınmalardan kaçınmak için her zaman bir üstten aşağıya yapı düzeni izlensin. Aşağıdaki tabloda, ağacın tek ve her düzeyde 150 düzey derinliğinde olduğu bir ağacın yukarıya ve alta doğru inşası arasındaki yürütme TextBlockDockPanel hızındaki farklar yer almaktadır.

Eylem Ağaç bina (ms) İşleme—ağaç binalarını içerir (ms olarak)
Alttan yukarı 366 454
Üstten aşağıya 11 96

Aşağıdaki kod örneği, aşağıdan aşağıya doğru bir ağacın nasıl oluşturulacaklarını gösteriyor.

private void OnBuildTreeTopDown(object sender, RoutedEventArgs e)
{
    TextBlock textBlock = new TextBlock();
    textBlock.Text = "Default";

    DockPanel parentPanel = new DockPanel();
    DockPanel childPanel;

    myCanvas.Children.Add(parentPanel);
    myCanvas.Children.Add(textBlock);

    for (int i = 0; i < 150; i++)
    {
        textBlock = new TextBlock();
        textBlock.Text = "Default";
        parentPanel.Children.Add(textBlock);

        childPanel = new DockPanel();
        parentPanel.Children.Add(childPanel);
        parentPanel = childPanel;
    }
}
Private Sub OnBuildTreeTopDown(ByVal sender As Object, ByVal e As RoutedEventArgs)
    Dim textBlock As New TextBlock()
    textBlock.Text = "Default"

    Dim parentPanel As New DockPanel()
    Dim childPanel As DockPanel

    myCanvas.Children.Add(parentPanel)
    myCanvas.Children.Add(textBlock)

    For i As Integer = 0 To 149
        textBlock = New TextBlock()
        textBlock.Text = "Default"
        parentPanel.Children.Add(textBlock)

        childPanel = New DockPanel()
        parentPanel.Children.Add(childPanel)
        parentPanel = childPanel
    Next i
End Sub

Mantıksal ağaç hakkında daha fazla bilgi için bkz. WPF'de Ağaçlar.

Ayrıca bkz.