Performansı iyileştirme: Denetimler
Windows Presentation Foundation (WPF), çoğu uygulama için kullanılan ortak kullanıcı arabirimi (UI) bileşenlerinin Windows içerir. Bu konu, kullanıcı arabiriminizin performansını geliştirmeye yönelik teknikleri içerir.
Büyük veri kümelerini görüntüleme
ve gibi WPF ListViewComboBox denetimleri, bir uygulamadaki öğe listelerini görüntülemek için kullanılır. Görüntülenecek liste büyükse uygulamanın performansı etkilenebilir. Bunun nedeni, standart düzen sisteminin liste denetimiyle ilişkili her öğe için bir düzen kapsayıcısı oluşturması ve düzen boyutunu ve konumunu hesaplamasıdır. Genellikle, tüm öğeleri aynı anda görüntülemeye gerek olmaz; bunun yerine bir alt küme görüntülersiniz ve kullanıcı listede kayar. Bu durumda kullanıcı arabirimi sanallaştırması kullanmak mantıklıdır. Başka bir ifadeyle öğe için öğe kapsayıcısı oluşturma ve ilişkili düzen hesaplaması öğe görünür olana kadar ertelenebilir.
UI Sanallaştırma, liste denetimlerinin önemli bir yönüdür. UI sanallaştırma, veri sanallaştırma ile karıştırılmamalıdır. UI sanallaştırması yalnızca görünür öğeleri bellekte depolar, ancak veri bağlama senaryosunda veri yapısının tamamı bellekte depolar. Buna karşılık, veri sanallaştırma yalnızca ekranda görünen veri öğelerini bellekte depolar.
Varsayılan olarak, liste öğeleri verilere bağlı olduğunda ListView ve denetimleri için kullanıcı arabirimi sanallaştırma ListBox etkinleştirilir. TreeView sanallaştırma, ekli özelliği olarak VirtualizingStackPanel.IsVirtualizing ayararak true etkinleştirilebilir. veya gibi sınıfını kullanan mevcut öğe denetimlerinden türetilen özel denetimler için UI sanallaştırmayı etkinleştirmek için öğesini olarak ve ItemsControlStackPanel olarak ComboBoxItemsPanelVirtualizingStackPanelIsVirtualizingtrue ayarlayın. Ne yazık ki, bu denetimler için ui sanallaştırmasını fark etmeden devre dışı abilirsiniz. Ui sanallaştırmasını devre dışı bırakan koşulların listesi aşağıda ve ve liste listedir.
Öğe kapsayıcıları doğrudan içine ItemsControl eklenir. Örneğin, bir uygulama açıkça bir ListBoxItem nesnesine nesne ListBoxListBox eklerse, nesneleri ListBoxItem sanallaştırmaz.
içinde öğe ItemsControl kapsayıcıları farklı türlerdedir. Örneğin, ve türünde nesneler içerdiği için nesneleri Menu kullanan bir öğe geri dönüştürme SeparatorMenuSeparatorMenuItem uygulayamaz.
olarak CanContentScroll
falseayarlar.olarak IsVirtualizing
falseayarlar.
Öğe kapsayıcılarını sanallaştırarak dikkat edilmesi gereken önemli nokta, öğeye ait bir öğe kapsayıcısı ile ilişkili ek durum bilgileri olup olmadığıdır. Bu durumda, ek durumu kaydetmelisiniz. Örneğin, bir denetimin içinde bulunan bir öğe olabilir ve durum öğenin kapsayıcısı ile bağlı ExpanderIsExpanded olabilir, öğenin kendisine bağlı değildir. Kapsayıcı yeni bir öğe için yeniden kullanılırken, yeni öğe IsExpanded için geçerli değeri kullanılır. Ayrıca, eski öğe doğru değeri IsExpanded kaybeder.
Şu anda hiçbir WPF denetimi, veri sanallaştırma için yerleşik destek sunmaz.
Kapsayıcı geri dönüştürme
'den devralınan denetimler için .NET Framework 3.5 SP1'e eklenen UI sanallaştırma iyileştirmesi, kapsayıcı geri dönüştürmedir ve bu da kaydırma ItemsControl performansını geliştirebilir. ItemsControl Kullanıcı arabirimi sanallaştırması kullanan bir doldurulduğunda, görünüme kaydıran her öğe için bir öğe kapsayıcısı oluşturur ve görünümden dışarı kaydıran her öğe için öğe ItemsControl kapsayıcısını yok eder. Kapsayıcı geri dönüştürme denetimin mevcut öğe kapsayıcılarını farklı veri öğeleri için yeniden kullanmalarını sağlar; böylece kullanıcı kaydırırken öğe kapsayıcıları sürekli oluşturulmaz ve yok edilemez. Ekli özelliği olarak ayarerek öğe geri dönüştürmeyi VirtualizationMode etkinleştirmeyi Recycling seçebilirsiniz.
Sanallaştırmayı ItemsControl destekleyen herhangi biri kapsayıcı geri dönüştürmeyi kullanabilir. üzerinde kapsayıcı geri dönüştürmeyi etkinleştirme örneği için ListBoxListBox
Çift yönlü sanallaştırmayı destekleme
VirtualizingStackPanel kullanıcı arabirimi sanallaştırması için yatay veya dikey olarak tek yönde yerleşik destek sunar. Denetimleriniz için çift yönlü sanallaştırma kullanmak için sınıfı genişleten özel bir panel uygulamanız VirtualizingStackPanel gerekir. sınıfı VirtualizingStackPanel , , ve gibi sanal yöntemleri ortaya OnViewportSizeChangedLineUpPageUpMouseWheelUp çıkarır. Bu sanal yöntemler, bir listenin görünür bölümünde bir değişikliği algılamaya ve uygun şekilde işlemeye olanak sağlar.
Şablonları iyileştirme
Görsel ağaç, bir uygulamanın tüm görsel öğelerini içerir. Doğrudan oluşturulan nesnelere ek olarak şablon genişletmesi nedeniyle nesneleri de içerir. Örneğin, bir Button oluştururken, görsel ağacında ClassicBorderDecorator ve ContentPresenter nesnelerini de elde edersiniz. Denetim şablonlarınızı en iyi duruma getirilmiş değil, görsel ağacında çok fazla gereksiz nesne oluşturuyor olabilir. Görsel ağaç hakkında daha fazla bilgi için bkz. WPF Grafik İşlemeye Genel Bakış.
Ertelenmiş kaydırma
Varsayılan olarak, kullanıcı başparmak kaydırma çubuğuna sürüklence içerik görünümü sürekli olarak sızıyor. Kaydırma denetiminiz yavaşsa ertelenen kaydırmayı kullanmayı göz önünde bulundurarak. Ertelenen kaydırmada içerik yalnızca kullanıcı başparmak serbest bıraksa güncelleştirilir.
Ertelenen kaydırma uygulamak için özelliğini IsDeferredScrollingEnabled olarak true ayarlayın. IsDeferredScrollingEnabled , ekli bir özelliktir ve üzerinde ScrollViewer ve denetim şablonunda bir ScrollViewer olan herhangi bir denetime ayar olabilir.
Performans özelliklerini uygulayan denetimler
Aşağıdaki tabloda, verileri görüntülemeye ilişkin yaygın denetimler ve performans özelliklerine ilişkin destek listeleniyor. Bu özellikleri etkinleştirme hakkında bilgi için önceki bölümlere bakın.
| Denetim | Sanallaştırma | Kapsayıcı geri dönüştürme | Ertelenmiş kaydırma |
|---|---|---|---|
| ComboBox | Etkinleştirilebilir | Etkinleştirilebilir | Etkinleştirilebilir |
| ContextMenu | Etkinleştirilebilir | Etkinleştirilebilir | Etkinleştirilebilir |
| DocumentViewer | Kullanılamaz | Kullanılamaz | Etkinleştirilebilir |
| ListBox | Varsayılan | Etkinleştirilebilir | Etkinleştirilebilir |
| ListView | Varsayılan | Etkinleştirilebilir | Etkinleştirilebilir |
| TreeView | Etkinleştirilebilir | Etkinleştirilebilir | Etkinleştirilebilir |
| ToolBar | Kullanılamaz | Kullanılamaz | Etkinleştirilebilir |
Not
üzerinde sanallaştırma ve kapsayıcı geri dönüştürmeyi etkinleştirme örneği için TreeViewTreeView