2012-03-18 21 views
10

मेरे पास कई डेटाग्रिड्स (सिल्वरलाइट टूलकिट से) के साथ एक एसएल एप्लीकेशन है, प्रत्येक अपने स्वयं के दृश्य पर। यदि कई डेटाग्रिड्स खोले जाते हैं, तो दृश्यों के बीच बदलना (उदाहरण के लिए टैबइटेम्स) में काफी समय लगता है (कुछ सेकंड) और यह पूरे एप्लिकेशन (यूआई थ्रेड) को फ्रीज करता है।कई लोड किए गए नियंत्रणों के साथ सिल्वरलाइट प्रदर्शन

अधिक डेटाग्रिड्स लोड किए जाते हैं, जितना अधिक समय लगता है। यूआई चैनेज को धीमा करने वाले ये डेटाग्रिड्स ऐप में अन्य स्थानों पर हो सकते हैं और उस पल में भी दिखाई नहीं दे सकते हैं। लेकिन एक बार जब वे खोले जाते हैं (और डेटा के साथ लोड होते हैं), तो वे अन्य डेटाग्रिड्स को धीमा कर देते हैं। ध्यान दें कि डेटाग्रिड्स का निपटारा नहीं किया गया है और फिर फिर से बनाया गया है, वे अभी भी स्मृति में रहते हैं, केवल उनके माता-पिता नियंत्रण को छुपाया जा रहा है और फिर से दिखाई दे रहा है।

मैंने एप्लिकेशन का प्रोफाइल किया है। यह दिखाता है कि agcore.dll का SetValue फ़ंक्शन बाधा है। दुर्भाग्य से, ड्राइंग के लिए जिम्मेदार इस सिल्वरलाइट मूल पुस्तकालय के लिए डीबग प्रतीकों उपलब्ध नहीं हैं।

समस्या डेटाग्रिड नियंत्रण में नहीं है - मैंने इसे XCeed के ग्रिड के साथ बदलने की कोशिश की और विचारों को बदलने पर प्रदर्शन भी बदतर है।

क्या आपको कोई समस्या है कि इस समस्या को हल करने का तरीका क्या है? क्यों अधिक खुले नियंत्रण अन्य नियंत्रण धीमा करते हैं?

मैं एक नमूना है कि इस मुद्दे से पता चलता बनाई है: VS solution, live demo

अद्यतन: प्रदान की नमूना पर VS11 प्रोफाइलर का उपयोग करते हुए पता चलता है कि समस्या MeasureOverride में हो सकता है (प्रत्येक DataGridCell के लिए कई बार बुलाया जा रहा है, मैं लगता है)। लेकिन फिर भी, यह धीमा क्यों है क्योंकि अधिक नियंत्रण कहीं और लोड हो जाते हैं? प्रदर्शन में सुधार करने का कोई तरीका है?

अद्यतन 2: मुझे यह उल्लेख करना चाहिए कि मैं अपने विशेष एप्लिकेशन में टैबकंट्रोल का उपयोग नहीं करता हूं। मैं वर्तमान में सक्रिय ViewModel दिखाने के लिए Caliburn.Micro और ContentControl का उपयोग करता हूं। लेकिन एक ही मुद्दा TabControl के साथ है इसलिए मैंने इसे मूल समस्या का वर्णन करने के लिए उपयोग किया।

+2

के साथ अपने datagrid की जगह चर्चा यहाँ (TabControl के बारे में बिट) देखें, यह मदद कर सकता है: http://stackoverflow.com/questions/1389769/wpf-virtualizingstackpanel-for-increased-performance – Phil

+0

असल में, मेरे मूल एप्लिकेशन में, मैं कैलिबर्न का उपयोग करता हूं। मैक्रो (एमवीवीएम फ्रेमवर्क) तो टैबकंट्रोल की बजाय, मेरे पास ContentControl वर्तमान में सक्रिय ViewModel (और इस प्रकार इसका दृश्य) से जुड़ा हुआ है। फिर भी, मैं चर्चा की जांच करूंगा और आपको बता दूंगा। धन्यवाद! – gius

+0

दायरप्रॉपर 404'एड –

उत्तर

5

तो, मैंने कस्टम नियंत्रण बनाने के विचार का पालन किया और परिणाम यह है: http://www.baud.cz/blog/fast-switching-between-viewmodels-in-caliburn.micro।MVVM डेमो आवेदन करने के लिए

त्वरित लिंक: Original और Fixed

+0

+1। यही वह है जिसे हम एक परियोजना में कर रहे थे। दृश्य के खोने के साथ हमारे पास एक ही सेटअप 'टैबकंट्रोल' था और हमने कैलिबर्न का भी उपयोग किया था। और समाधान कैबिबर्न में 'IViewAware.GetView' – nemesv

+1

AFAIK, IViewAware.GetView के साथ कैश किए गए दृश्यों को कैश करना और वापस करना था। माइक्रोरो पहले से ही विचारों को कैश करता है। मुझे लगता है कि कोई टैबकंट्रोल में विचारों को बदलकर बता सकता है जहां स्क्रॉलबार स्थिति बनी रहती है (यह वीएम में सहेजी नहीं जाती है)। – gius

0

हमने इस तरह कुछ अनुभव किया, हम गतिशील रूप से कई भारी नियंत्रण-लड़े उपयोगकर्ता नियंत्रण लोड कर रहे थे और जितना अधिक धीमा हो गया था उतना ही ऐप लग रहा था। जैसा कि यह पागल लगता है, जब हम प्रत्येक नियंत्रण के लेआउट रूट को सीमा नियंत्रण में सेट करते हैं तो प्रदर्शन समस्याएं काफी कम हो जाती हैं क्योंकि लेआउट सिस्टम को सभी संसाधनों को अद्यतन करने के लिए कठिन रूप से लड़ना नहीं पड़ता था।

बस कुछ ऐसा साझा करना चाहता था जो हमारे लिए एक चमत्कार करता है जिसे आप कोशिश कर सकते हैं।

0

यह एक अर्ध-जंगली अनुमान है, लेकिन मुझे आश्चर्य है कि क्या यह चयनित टैबों पर संपीड़ित करने की दृश्यता सेट करने में मदद करेगा। (मैं पंक्ति वर्चुअलाइजेशन डेटा ग्रिड पर सक्षम है मान लेते हैं। यही कारण है कि मुझे अतीत में बहुत मदद की है।)

मेरे अर्द्ध जंगली अनुमान ज्यादातर इस tip पर और जानकारी के अपने मध्यवर्ती समझ पाया here पर आधारित है।

+1

मैं वास्तव में एमवीवीएम का उपयोग करने में प्रदान किए गए नमूने को फिर से लिखता हूं और सामग्री कंट्रोल में सक्रिय सामग्री दिखाता हूं जो केवल एक सक्रिय के साथ विचार प्रस्तुत करने के लिए कनवर्टर का उपयोग करता है और यह अभी भी धीमा था। – Bryant

+0

@ ब्रायंट जो बिल्कुल मेरी समस्या है। मैंने अभी टैबकंट्रोल का उपयोग किया जितना संभव हो सके इसे सरल बनाने के लिए। संभव समाधान मैं देख सकता हूं कि एक कस्टम ContentContr बनाना है ओएल (शायद आइटम कंट्रोल पर आधारित) जो कि सक्रिय आइटम के अलावा किसी भी तरह के अन्य विचारों को पकड़ लेगा ताकि उन्हें दृश्य पेड़ से हटाया न जा सके और इस प्रकार संबंधित दृश्य सक्रिय होने पर उन्हें पुन: प्रयास करने की आवश्यकता नहीं है। – gius

0

मैं c1DataGrid के साथ इस मुद्दे था, मैंने पाया कि विषयों बंद करने के बाद, बदल रहा है टैब तेज था, और कर अन्य यूआई संचालन तत्काल थे।

भी आज़माएं:

  1. अपने कोड की कि कोई भी सुनिश्चित बनाम साथ के माध्यम से कदम से बुलाया जा रहा है
  2. अगर अभी भी धीमी गति से घटक द्वारा घटक को खत्म करने, शायद इसकी न सिर्फ डेटा ग्रिड
  3. सभी आवेदन किया शैलियों निकालें
  4. c1datagrid
संबंधित मुद्दे