2012-03-18 8 views
10

Her biri kendi görünümünde birçok DataGrids (Silverlight Toolkit'ten) içeren bir SL uygulamasına sahibim. Birkaç DataGrids açılırsa, görünümler arasında geçiş yapmak (örneğin, TabItems) uzun bir süre alır (birkaç saniye) ve tüm uygulamayı (UI iş parçacığı) dondurur.Yüklü birçok denetleyici ile Silverlight performansı

Daha fazla DataGrids yüklenir, değişiklik ne kadar uzun sürer. UI değişimini yavaşlatan bu DataGrids, uygulamada başka yerlerde olabilir ve o anda bile görünmeyebilir. Fakat bir kez açıldığında (ve veri ile yüklendiklerinde), diğer DataGrids'i göstererek yavaşlarlar. DataGrids'in imha edilmediğini ve yeniden oluşturulmadığını unutmayın, yine de bellekte kalırlar, yalnızca ebeveyn denetimi gizlenir ve tekrar görünür olur.

Uygulamayı geliştirdim. Bu agcore.dll SetValue işlevi darboğaz olduğunu gösterir. Ne yazık ki, çizimden sorumlu bu Silverlight yerel kitaplığı için hata ayıklama sembolleri mevcut değildir.

Sorun, DataGrid denetiminde değil - XCeed'in ızgarasıyla değiştirmeyi denedim ve görünümleri değiştirirken performansı daha da kötü.

Bu sorunun nasıl çözüleceği hakkında bir fikriniz var mı? Neden daha açık kontroller diğer kontrolleri yavaşlatıyor?

Ben bu sorunu gösteren bir örnek oluşturduk

: VS solution, live demo

GÜNCELLEME: sağlanan örnek üzerinde VS11 profilcisini kullanma , sorun MeasureOverride içinde olabileceğini düşündürmektedir her DataGridCell için (birçok kez çağrılan ben tahmin). Yine de, neden başka bir yerde daha fazla kontrol yüklendiğinden daha yavaş oluyor? Performansı iyileştirmenin bir yolu var mı?

UPDATE 2: Belirli bir uygulamamda TabControl kullanmıyorum. Halen etkin ViewModel'i göstermek için Caliburn.Micro ve ContentControl kullanıyorum. Ama aynı sorun TabControl ile bu yüzden çekirdek problemi tanımlamak için kullandım.

+2

ile veri kılavuzunu değiştirin tüm uygulanan stilleri çıkarın burada (TabControl hakkında bit) tartışma bakın yardımcı olabilir: http://stackoverflow.com/questions/1389769/wpf-virtualizingstackpanel-for-increased-performance – Phil

+0

Aslında, benim özgün uygulamada, bir TabControl yerine, Caliburn.Micro (MVVM framework) kullanın. ContentControl, şu anda aktif olan ViewModel'e (ve dolayısıyla Görünümüne) bağlıdır. Yine de, tartışmayı kontrol edip size bildiririm. Teşekkür ederim! – gius

+0

filedropper 404'ed –

cevap

5

Özel denetim oluşturma fikrini takip ettim ve sonuç şu: http://www.baud.cz/blog/fast-switching-between-viewmodels-in-caliburn.micro.MVVM demo uygulamalara

Hızlı bağlantılar: Original ve Fixed ben c1DataGrid ile bu sorunu vardı

+0

+1. Bu bir projede işimiz bitti. Görsel ayarlı aynı ayar 'TabControl 'vardı ve ayrıca Caliburn'u da kullandık. Ve çözüm, önbellek ve önbelleğe alınan görünümleri 'IViewAware.GetView' – nemesv

+1

AFAIK, Caliburn.Micro içinde IViewAware.GetView ile görüşlerini önbelleğe almak oldu. Bence, kaydırma çubuğu konumunun devam ettiği TabControl'deki görünümleri değiştirerek bunu anlayabilirsiniz (bu VM'de kaydedilmez). – gius

0

Buna benzer bir şey yaşadık, çok sayıda ağır denetim yüklü kullanıcı denetimlerini dinamik olarak yükledik ve uygulama ne kadar yavaş olursa o kadar yavaş görünüyordu. Göründüğü kadar çılgınca, her kontroldeki yerleşim kökenini bir Sınır kontrolüne ayarladığımızda, yerleşim sisteminin tüm kaynakları güncellemekte zorlandığı gibi performans sorunları önemli ölçüde azaldı.

Sadece deneyebileceğiniz bir mucize yaratan şeyleri paylaşmak istedim.

0

Bu, yarı vahşi bir tahmindir, ancak seçilemeyen sekmelerde Daraltılmış Görünürlük ayarlanmasına yardımcı olup olmayacağını merak ediyorum. (Ben satır sanallaştırma DataGrid üzerinde etkindir varsayalım. Bu bana geçmişte çok yardımcı oluyor.)

Benim yarı Tahminen çoğunlukla bu tip ve bilgilerin benim ara anlayış here bulundu dayanmaktadır.

+1

Ben gerçekten MVVM kullanarak sağlanan örnek yeniden yazdı ve bir ContentControl etkin içeriği gösteren bir ContentControl gösteren sadece bir aktif ile görüşlerini işlemek için bir dönüştürücü kullanılan ve hala yavaş oldu.Only tam olarak benim sorunum olan – Bryant

+0

@Bryant kullandım. Mümkün olduğu kadar basitleştirmek için özel bir ContentContr oluşturmak mümkün olabilir Olumlu öğenin yanı sıra, bir şekilde diğer öğelere de sahip olan ol (muhtemelen ItemsControl'e dayanır), böylece görsel ağaçtan kaldırılmazlar ve böylece ilgili görünüm etkinleştirildiğinde yeniden oluşturulmaları gerekmez. – gius

0

buradan ayrılacağım temaları açtıktan sonra, değişen sekmeler hızlı olduğu bulundu ve yapan başka UI işlemleri anlık idi. Ayrıca

deneyin:

  1. Kodunuzdaki hiçbirinin olun VS ile gözatarak çağrıldığını
  2. , onu hala yavaş, bileşen tarafından belki de zaman değil sadece veri ızgara bileşenini ortadan kaldırmak
  3. eğer
  4. c1datagrid