Bahsettiğiniz paneller Düzen panelleridir, bu nedenle yerleşim sistemine kısa bir genel bakış, bunun muhtemelen en verimli panelin basit bir listesi olmayacağını, verimlilik ve performans üzerinde en büyük etkiye sahip panelleri nasıl kullandığınızı gösterir.
LayoutSystem_Overview :
En basit haliyle, düzen, bir öğenin boyutlandırılmasına, konumlandırılmasına ve çizilmesine yol açan yinelemeli bir sistemdir. Daha spesifik olarak, düzen, bir Panel öğesinin Çocuk koleksiyonunun üyelerini ölçme ve düzenleme sürecini açıklar. Düzen, yoğun bir süreçtir. Çocuk koleksiyonu ne kadar büyükse, yapılması gereken hesaplama sayısı da o kadar fazladır. Karmaşıklık, koleksiyonun sahibi olan Panel öğesi tarafından tanımlanan düzen davranışına göre de tanıtılabilir. Canvas gibi nispeten basit bir Panel, Grid gibi daha karmaşık bir Panelden önemli ölçüde daha iyi performansa sahip olabilir.
Bir alt UIElement pozisyonunu her değiştirdiğinde, yerleşim sistemi tarafından yeni bir geçişi tetikleme potansiyeline sahiptir. Bu nedenle, gereksiz çağırma kötü uygulama performansına neden olabileceğinden, düzen sistemini çağırabilecek olayları anlamak önemlidir. Aşağıda, yerleşim sistemi çağrıldığında meydana gelen süreç açıklanmaktadır.
1. Bir alt UIElement, ilk olarak temel özelliklerini ölçerek düzen sürecini başlatır.
2. FrameworkElement üzerinde tanımlanan boyutlandırma özellikleri, Genişlik, Yükseklik ve Kenar Boşluğu gibi değerlendirilir.
3. Dock yönü veya istifleme Yönü gibi panele özgü mantık uygulanır.
4. İçerik, tüm çocuklar ölçüldükten sonra düzenlenir.
5. Çocuk koleksiyonu ekrana çizilir.
6. Koleksiyona başka Çocuklar eklenirse, bir LayoutTransform uygulanırsa veya UpdateLayout yöntemi çağrılırsa işlem yeniden çağrılır.
Çocukların ölçülmesi ve düzenlenmesi hakkında daha fazla bilgi için LayoutSystem_Measure_Arrange'a bakın .
LayoutSystem_Performance :
Düzen, yinelemeli bir süreçtir. Bir Çocuk koleksiyonundaki her alt öğe, düzen sisteminin her çağrısı sırasında işlenir. Sonuç olarak, gerekli olmadığında yerleşim sisteminin tetiklenmesinden kaçınılmalıdır. Aşağıdaki hususlar daha iyi performans elde etmenize yardımcı olabilir.
Hangi özellik değeri değişikliklerinin yerleşim sistemi tarafından yinelemeli bir güncellemeye zorlayacağının farkında olun.
Değerleri yerleşim sisteminin başlatılmasına neden olabilecek bağımlılık özellikleri genel bayraklarla işaretlenir. AffectsMeasure ve AffectsArrange, hangi özellik değeri değişikliklerinin yerleşim sistemi tarafından yinelemeli bir güncellemeyi zorlayacağına ilişkin yararlı ipuçları sağlar. Genel olarak, bir öğenin sınırlayıcı kutusunun boyutunu etkileyebilecek herhangi bir özellik, true olarak ayarlanmış bir AffectsMeasure bayrağına sahip olmalıdır. Daha fazla bilgi için bkz. Bağımlılık Özelliklerine Genel Bakış.
Mümkün olduğunda, LayoutTransform yerine RenderTransform kullanın.
LayoutTransform, bir kullanıcı arayüzünün (UI) içeriğini etkilemenin çok yararlı bir yolu olabilir. Ancak, dönüştürme efektinin diğer öğelerin konumunu etkilemesi gerekmiyorsa, bunun yerine bir RenderTransform kullanmak en iyisidir çünkü RenderTransform mizanpaj sistemini çağırmaz. LayoutTransform, dönüşümünü uygular ve etkilenen öğenin yeni konumunu hesaba katmak için yinelemeli bir düzen güncellemesini zorlar.
UpdateLayout'a gereksiz çağrılardan kaçının.
UpdateLayout yöntemi, özyinelemeli bir düzen güncellemesini zorlar ve genellikle gerekli değildir. Tam bir güncellemenin gerekli olduğundan emin değilseniz, bu yöntemi sizin için çağırması için düzen sistemine güvenin.
Büyük bir Çocuk koleksiyonuyla çalışırken, normal bir StackPanel yerine VirtualizingStackPanel kullanmayı düşünün.
Alt koleksiyonun sanallaştırılmasıyla VirtualizingStackPanel yalnızca şu anda ebeveynin ViewPort'unda bulunan nesneleri bellekte tutar. Sonuç olarak, çoğu senaryoda performans önemli ölçüde iyileştirilir.
Performansı Optimize Etme: Düzen ve Tasarım : Bu makale, ağacın verimli bir şekilde nasıl oluşturulacağına dair ayrıntılara giriyor ve karmaşıklıklarına göre basit bir panel listesi veriyor.
Tuval (en az karmaşıkt = daha verimli ve daha iyi performans)
Kafes
Diğer Paneller (daha karmaşık = daha az verimli ve daha kötü performans)
Dikkat edilmesi gereken diğer performans konuları: WPF kullanıcı arayüzü oluşturma hızını iyileştirmenin yolları
- Her şeyi önbelleğe alın. Fırçalar, Renkler, Geometriler, Biçimlendirilmiş Metinler, Glifler. (Örneğin iki sınıfımız var: RenderTools ve TextCache. Her birimin adreslerinin her iki sınıfın paylaşılan örneğine işlenmesi. Yani iki grafikte aynı metin varsa, hazırlığı yalnızca bir kez yürütülür.)
- Uzun süre kullanmayı planlıyorsanız, Dondurulabilir. Özellikle geometriler. Karmaşık çözülmemiş geometriler, HitTest'i son derece yavaş yürütür.
- Her bir ilkeli oluşturmanın en hızlı yollarını seçin. Örneğin, metin oluşturmanın yaklaşık 6 yolu vardır, ancak en hızlısı DrawingContext.DrawGlyphs'dir.
- Konteyner Geri Dönüşümünü etkinleştirin. Sanallaştırma birçok performans iyileştirmesi getiriyor, ancak kaplar atılacak ve yeniden oluşturulacak, bu varsayılandır. Ancak VirtualizingStackPanel.VirtualizationMode = "Recycling" ayarlayarak konteynırları geri dönüştürerek daha fazla performans elde edebilirsiniz.
- Gönderen burada : başvurunuz destekleyebilir iç içe miktarına pratik bir sınır yoktur, ancak, sadece gerçekte istenilen düzen için gerekli olan şu panelleri kullanmak için uygulama sınırlamak için genellikle en iyisidir. Çoğu durumda, bir yerleşim kabı olarak esnekliği nedeniyle iç içe paneller yerine bir Izgara öğesi kullanılabilir. Bu, gereksiz öğeleri ağaçtan uzak tutarak uygulamanızdaki performansı artırabilir.