2011-11-20 16 views
36

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

<ComboBox Name="cbBlah"> 
    <ComboBox.ItemsPanel> 
     <ItemsPanelTemplate> 
      <VirtualizingStackPanel /> 
     </ItemsPanelTemplate> 
    </ComboBox.ItemsPanel> 
</ComboBox> 

और समस्या पुन: पेश करने के लिए बाध्य के लिए नमूना कोड:

var list = new List<string>(); 
for (var i = 0; i < new Random().Next(9000, 10000); i++) 
    list.Add(i.ToString()); 
cbBlah.ItemsSource = list; 

मैं ढेर पैनल virtualizing इस तरह देखने के लिए करने की कोशिश की:

<VirtualizingStackPanel VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Recycling" /> 

यहाँ XAML है

लेकिन यह मदद नहीं करता है, ऐसा लगता है कि वर्चुअलाइजेशन मोड को अनदेखा किया गया है, इसलिए पॉपअप केवल पहली बार बहुत तेज़ खुलता है और फिर, बाध्यकारी परिवर्तन के बाद हर बार, यह बहुत धीमी है।

अद्यतन: मैंने हर बार नए संग्रह को बाध्य करने के बारे में सोचा नहीं था, लेकिन एक बार एक पर्यवेक्षण चयन को बांधें और फिर बस अपनी सामग्री को बदल दें। एक ही बात, जैसे ही संग्रह की सामग्री बदलती है, अभी भी एक पॉपअप खोलने के रूप में कई सेकंड :(

+0

इन सवाल है कि मैं http://stackoverflow.com/a/8555403/920384 – punker76

उत्तर

79

लेता है इस ब्लॉग के अनुसार: http://vbcity.com/blogs/xtab/archive/2009/12/15/wpf-using-a-virtualizingstackpanel-to-improve-combobox-performance.aspx

मैं इस कोड के साथ जाँच की है:

<ComboBox Name="cbBlah" ItemsSource="{Binding}"> 
    <ComboBox.ItemsPanel> 
     <ItemsPanelTemplate> 
      <VirtualizingStackPanel /> 
     </ItemsPanelTemplate> 
    </ComboBox.ItemsPanel> 
</ComboBox> 

यह पहली बार है और अगले समय के लिए ठीक काम करता है यह इन पंक्तियों कोड करने के लिए आवश्यक नहीं है:।।

<VirtualizingStackPanel VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Recycling" /> 

मुझे आशा है कि इस मदद करता है

+0

तो थोड़ा कोड के जवाब दिए और एक आकर्षण की तरह काम करता पर एक नज़र डालें! – Tafari

+0

आप, महोदय, एक प्रतिभाशाली हैं! इसने मेरे लिए एक बड़ा प्रदर्शन अंतर बनाया, और फिक्स सुरुचिपूर्ण और सरल है। धन्यवाद! :) – dbeachy1

+1

क्या यह सी # कोड के साथ प्राप्त करना संभव है? मैं एक वर्ग को कार्यान्वित कर रहा हूं जो कम्बोबॉक्स से निकल रहा है, और मैं इसे यहां सेट करना चाहता हूं। – jonas

0

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

<Setter Property="ScrollViewer.CanContentScroll" Value="True"/> 
<Setter Property="VirtualizingStackPanel.IsVirtualizing" Value="True"/> 
<Setter Property="VirtualizingStackPanel.VirtualizationMode" Value="Recycling"/> 
<Popup> 
    <Border/> 
    <ScrollViewer> 
     <VirtualizingStackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Contained"/> 
    </ScrollViewer> 
    </Grid> 
</Popup> 
8

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

ItemsPanel = new ItemsPanelTemplate(); 
var stackPanelTemplate = new FrameworkElementFactory(typeof (VirtualizingStackPanel)); 
ItemsPanel.VisualTree = stackPanelTemplate; 
+0

उस कोड को कन्स्ट्रक्टर में नष्ट कर दिया, खूबसूरती से काम किया। चीयर्स! – Kris

+0

सुंदर समाधान :) धन्यवाद – HuyNA

+0

मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन साथी googlers के लिए, यह सही यहाँ एक सुरुचिपूर्ण समाधान था। चीजों को गति से _tremendously_। – Chris

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