2012-12-14 18 views
12

समस्या: स्क्रोल करने योग्य क्षेत्र में बड़ी मात्रा में डेटा प्रदर्शित करना भयानक प्रदर्शन और/या उपयोगकर्ता अनुभवहीनता के साथ वर्चुअलाइजेशन प्रदर्शन समस्या है।बड़े स्क्रॉल करने योग्य डेटा SL4

की कोशिश की: मूल रूप से VirtualizationMode और एक निश्चित ऊंचाई ListBox iteself पर सेट रीसायकल करने के लिए सेट के साथ आबादी वाले डेटा का एक ग्रिड को दिखाने के लिए एक ListBox में एक DataTemplate निर्धारित किया है। नीचे उदाहरण की तरह कुछ।

<ListBox x:Name="Items" 
     TabNavigation="Once" 
     VirtualizingStackPanel.VirtualizationMode="Recycling"  
     Height="500">   
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal" Margin="0,5"> 
         <HyperlinkButton Content="Action" Margin="5"/> 
         <ContentControl 
           cal:View.Model="{Binding}" 
           VerticalContentAlignment="Stretch" 
           HorizontalContentAlignment="Stretch"/> 
        </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 

ContentControl एक और विचार है कि करीब 20 स्थिर है, और 20 डेटा के लिए बाध्य TextBlocks से मिलकर आबादी वाले वस्तुओं के समग्र लेआउट प्रारूप से एक मानक <Grid> में लाने की जाएगी।

यह ठीक काम करता है, और प्रारंभिक भार को आधा में काटता है। हालांकि, अब समस्या यह है कि मुझे ऊंचाई के लिए निश्चित आकार नहीं होने की क्षमता की आवश्यकता है, इसलिए यह अपने माता-पिता में उपलब्ध स्थान लेता है और इसका आकार भी बदला जा सकता है। @DanFox के लिए धन्यवाद, मुझे पता चला है कि आपको वर्चुअलाइजिंग या रेंडरइंजिन का आह्वान करने के लिए ऊंचाई को ठीक करने के लिए एक फॉर्म या दूसरे को ठीक करना होगा, बस सोचता है कि इसमें अनंत कक्ष है।

प्रश्न यह है: क्या ऐसा करने का कोई बेहतर तरीका है, या बेहतर यूएक्स की अनुमति देने के लिए मैं कम से कम वर्तमान तकनीक को कैसे ठीक कर सकता हूं? मैं संभावित रूप से इन वस्तुओं में से सैकड़ों उत्पन्न कर रहा हूं इसलिए मुझे वर्चुअलाइजेशन के प्रदर्शन में वृद्धि की आवश्यकता है। हालांकि मुझे उपयोगकर्ता को विंडो का आकार बदलने और प्रभावी ढंग से स्क्रॉल करने की क्षमता बनाए रखने की अनुमति देने की भी आवश्यकता है।

किसी अंतर्दृष्टि की बहुत सराहना की जाती है, धन्यवाद और शुभ छुट्टियां!

+0

क्या आपने स्क्रॉलव्यूयर और अन्य घटकों की ऊंचाई को अस्थायी रूप से ठीक करने का प्रयास किया है? कभी-कभी प्रदर्शन में गिरावट हो सकती है क्योंकि लेआउट इंजन ScrollViewer को अनंत ऊंचाई दे रहा है। क्षमा करें, मैं और अधिक स्पष्ट नहीं हो सकता, मैं इस क्षेत्र में थोड़ा जंगली हूँ, अब कुछ समय के लिए कोई एसएल नहीं किया है ... –

+0

क्या आपका डेटा जल्दी से लोड हो रहा है? आप किस संग्रह प्रकार से बंधे हैं? –

+0

@ डैन फॉक्स स्क्रॉलव्यूवर की ऊंचाई को ठीक करने के लिए बस हार्डिंग रेंडरिंग गति को प्रभावित कर सकता है? –

उत्तर

1

ठीक है तो मैं यहां क्या कर रहा हूं और कहना है कि यह एक बड़ा सुधार है! हमने इस विशेष टुकड़े के लिए डॉट पर 77 सेकेंड के लोड समय के साथ शुरुआत की। कुछ रिफैक्टरिंग के साथ कि हम पिछली बार बाध्यकारी कैसे थे, हमने लगभग 20 सेकंड बंद कर दिए थे, इसलिए समस्या यूआई प्रतिपादन में अभी भी थी। नीचे दिया गया जवाब स्पष्ट रूप से अधिक सरल है जैसा कि मैंने मूल रूप से सोचा था कि अब यह होगा और अब हम 15-20 सेकंड (पाठ्यक्रम के वर्चुअलाइजेशन के साथ) में भारी मात्रा में डेटा लोड कर रहे हैं और छोटे लोड मूल रूप से तत्काल तात्कालिक हैं जो हमें ट्रैक पर वापस डालते हैं।

यहां मैंने जो किया है;

<!-- This needs to be contained in a parent panel like a grid --> 
<ListBox x:Name="Items" > 
       <ListBox.Template> 
        <ControlTemplate> <!-- Broke it out to allow resizing --> 
         <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"> 
          <ItemsPresenter/> <!-- This little fella does magical things -->    
         </ScrollViewer>   
        </ControlTemplate>  
       </ListBox.Template> 
       <ListBox.ItemsPanel> 
        <ItemsPanelTemplate> 
         <VirtualizingStackPanel VirtualizingStackPanel.VirtualizationMode="Recycling"/> <!-- Recycle was a must -->   
        </ItemsPanelTemplate>  
       </ListBox.ItemsPanel> 
       <ListBox.ItemTemplate> 
        <DataTemplate> 
         <StackPanel Orientation="Horizontal"> 
          <HyperlinkButton VerticalAlignment="Top" Margin="5" /> 
           <!-- This guy I did need to set a minwidth on to retain nice and predictable scrolling 
when datacontext was potentially changing --> 
          <ContentControl cal:View.Model="{Binding}" MinWidth="1160" 
              VerticalContentAlignment="Stretch" HorizontalContentAlignment="Stretch" /> 
         </StackPanel> 
        </DataTemplate>   
       </ListBox.ItemTemplate>   
      </ListBox> 

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

1

अनुरोध किया था कि मैं कुछ भी "जवाब" अब तक :-) मैं महसूस नहीं किया था ...

आप बिल्कुल सही कर रहे हैं, वहाँ ऊंचाई गतिशील होने का तरीका होना चाहिए। इसे निश्चित ऊंचाई पर सेट करना केवल यह सुनिश्चित करने के लिए एक त्वरित जांच है कि वर्चुअलाइजेशन काम कर रहा है। क्या आप प्रदर्शन प्रोफाइलर के साथ कहीं भी, या शायद SilverlightSpy का उपयोग कर रहे थे? मैंने इसे और अधिक कुशल बनाने के लिए यूआई/वीएम पर बाध्यकारी पुन: सक्रिय करके इन मुद्दों में से एक को दूर कर दिया है। संभावित रूप से अच्छे समाधान के साथ WinPhone7 SL के लिए एक अच्छा संसाधन था, मैं देखता हूं कि क्या मैं इसे खोद सकता हूं (सिद्धांत को पूर्ण-वसा एसएल में स्थानांतरित करना चाहिए)

This पर कैशिंग पर एक अच्छा बिंदु है के रूप में यह एक छोटे से अधिक

और एक couple of hints WinPho 7 देव टीम से लोड हो रहा है Laxy बताते हैं अपने वीएम वास्तुकला

This उपयोगी हो सकता है।

आशा है कि मदद करता है

0

तो अपने ही निश्चित ऊंचाई की वजह से, क्यों न आप सिर्फ इस प्रयास करें:

<Grid>  
<ListBox x:Name="Items" 
     TabNavigation="Once" 
     VirtualizingStackPanel.VirtualizationMode="Recycling"  
     Height="{Binding Path=Height,RelativeSource={RelativeSource AncestorType=Grid}}">   
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal" Margin="0,5"> 
         <HyperlinkButton Content="Action" Margin="5"/> 
         <ContentControl 
           cal:View.Model="{Binding}" 
           VerticalContentAlignment="Stretch" 
           HorizontalContentAlignment="Stretch"/> 
        </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
</Grid> 

महत्वपूर्ण है कि आप एक कंटेनर है कि बाह्य अंतरिक्ष और के लिए नहीं करने के लिए फिट बैठता है में ListBox एक stackpanel की तरह आंतरिक अंतरिक्ष।

इसे आज़माएं और मुझे बताएं कि यह मदद करता है या नहीं। :)

+0

मैं गलत हो सकता हूं, लेकिन मुझे नहीं लगता कि आप इस तरह सापेक्ष स्रोत का उपयोग कर सकते हैं SL4? मुझे लगता है कि यह एसएल 5 में सुधार हुआ था? –

+0

दान का सही, एसएल 4 केवल स्व और टेम्पलेटेड माता-पिता करता है, पूर्वजों टाइप कोई शर्म की बात नहीं है क्योंकि मैं ऐसे मामलों में भाग लेता हूं जहां मैं इसे हर समय इस्तेमाल कर सकता हूं। उसी मार्ग पर हालांकि मैंने ऊंचाई = {बाइंडिंग एक्टुअल हाइट, एलिमेंटनाम = पेरेंटग्रिड कोंटेन्टर} का प्रयास किया था और उसके पास कोई भाग्य नहीं था। मैंने संपत्ति के लिए टेक्स्टब्लॉक बाध्य किया है और यह पूरी तरह से अमान्य संख्या देता है ... लेकिन यह एक और विषय है lol। –

+0

हाँ मुझे खेद है पूर्वजों टाइप एसएल 5 में नया है। ऊंचाई से बांधने की कोशिश करें और वास्तविक नहीं –

0

मुझे लगता है कि अगर आप अपने डेटामैप्लेट में यूआई नियंत्रण में जादुई रूप से खींच रहे हैं, तो आप वर्चुअलाइजेशन के उद्देश्य को हरा रहे हैं। क्या ये नियंत्रण (ग्रिड) का पुन: उपयोग किया जा रहा है? क्या होता है जब {बाध्यकारी} बदलता है?संलग्न व्यवहार की तरह दिखने में कितना कोड चलाया जाता है? शायद आपने जो किया है उसे निष्पादित किया जा सकता है। लेकिन अगर आप सीधे सीधा-आगे डेटामैप्लेट (या इसे सामान्य उपयोगकर्ता नियंत्रण में डालते हैं) बनाते हैं, तो आप जान लेंगे कि इसमें सभी नियंत्रणों का पुन: उपयोग किया जाएगा और उनके डेटाकॉन्टेक्स्ट को स्विच करने में न्यूनतम दंड होगा।

मुझे ऊंचाई के साथ इस मुद्दे के बारे में निश्चित नहीं है। इसे काम करना चाहिए (व्यवस्था में एक सीमित ऊंचाई प्राप्त करें), लेकिन यह इस बात पर निर्भर करता है कि यह हुड के नीचे क्या कर रहा है (शायद यह ऊंचाई को उपलब्ध कराने से पहले सब कुछ समझने की कोशिश कर रहा है)।

आप हमेशा अपना खुद का वर्चुअलाइजिंग आइटम नियंत्रण बना सकते हैं। पैनल से निकालें, इसे स्क्रॉलव्यूअर के अंदर रखें, और पैनल पर IScrollInfo लागू करें। फिर आप सभी कारणों को जानेंगे कि चीजें किस प्रकार हैं :)

+0

पर बाइबल बाध्य टेक्स्ट को बाध्य कर सकते हैं आप वर्चुअलाइजिंगस्टैक पैनेल को सीधे स्क्रॉलव्यूअर के अंदर भी उपयोग करने का प्रयास कर सकते हैं। यह वर्चुअलाइजेशन को मजबूर करने का एक बेहतर तरीका हो सकता है। आप वर्चुअलाइजिंगस्टैक पैनेल से भी प्राप्त कर सकते हैं, जो पैनल से प्राप्त करने के फायदे दे सकता है लेकिन कम काम के साथ। –

0

मुझे यकीन नहीं है, अगर यह आपके उपयोग के मामले के लिए एक स्वीकार्य समाधान होगा, लेकिन मैंने DelayedLayoutUpdateContainer नामक सामग्री नियंत्रण बनाया है जो लपेटता है एक जटिल लेआउट और प्रदर्शन में सुधार करने में मदद करता है। DelayedLayoutUpdateContainer के पीछे विचार यह है कि यह केवल अपनी सामग्री के आकार को समायोजित करता है जब इसे किसी दिए गए समय अवधि के लिए स्वयं का आकार नहीं बदला जाता है। ControlTemplate के अंदर ContentPresenter का आकार पूर्ण मानों पर सेट है। तो हो सकता है कि ListBoxes ऊंचाई को पूर्ण मान पर सेट करने के समान प्रभाव हो।

संबंधित मुद्दे