2014-08-27 8 views
5

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

स्टैकपैनल स्क्रॉलव्यूयर का एक बच्चा है यह सुनिश्चित करने के लिए कि इसकी सामग्री हमेशा स्क्रॉल करने योग्य है।

स्टैकपैनल में से एक नियंत्रण एक सूची बॉक्स है।

इसका आइटमसोर्स डेटा एक विशाल संग्रह से जुड़ा हुआ है, और प्रत्येक आइटम को समझने के लिए एक जटिल डेटा टेम्पलेट का उपयोग किया जाता है।

दुर्भाग्यवश, मुझे इसके साथ वास्तव में खराब प्रदर्शन (उच्च सीपीयू/मेमोरी) मिल रहा है।

मैंने कोशिश की

  • एक VirtualizingStackPanel को ListBox के ItemsPanel की स्थापना, और
  • केवल एक ItemsPresenter करने के लिए अपने ControlTemplate अधिभावी (ListBox के ScrollViewer निकालने के लिए)।

लेकिन प्रदर्शन में कोई अंतर नहीं था। मुझे लगता है कि स्टैकपैनल माप के दौरान अपने आंतरिक बच्चों को अनंत ऊंचाई देता है?

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

क्या इस दृश्य के सीपीयू/मेमोरी प्रदर्शन को बेहतर बनाने के लिए मेरे पास कोई तरीका है?

enter image description here

[अपडेट 1]

मूल नमूना परियोजना: http://s000.tinyupload.com/index.php?file_id=29810707815310047536

[अपडेट 2]

मैं restyling/templating TreeView/TreeViewItems की कोशिश की के साथ आने के लिए निम्नलिखित उदाहरण। यह अभी भी उच्च स्मृति उपयोग शुरू करने के लिए एक लंबा समय लगता है। लेकिन एक बार लोड होने पर, स्क्रॉलिंग मूल नमूना से बहुत अधिक प्रतिक्रियाशील महसूस करती है।

आश्चर्य है कि स्टार्ट अप समय/मेमोरी उपयोग को और बेहतर करने के लिए कोई और तरीका है?

जिसका ढांचा TreeView परियोजना: http://s000.tinyupload.com/index.php?file_id=00117351345725628185

[अद्यतन 2]

pushpraj समाधान एक आकर्षण

  • मूल की तरह काम करता है:
    • स्टार्टअप: 35s,
    • मेमोरी : 3 9 3 एमबी
    • स्क्रॉल: धीरे
  • TreeView:
    • स्टार्टअप: 18s,
    • मेमोरी 377MB,
    • स्क्रॉल: फास्ट
  • pushpraj के समाधान:
    • स्टार्टअप : < 1s,
    • मेमोरी: 20MB,
    • स्क्रॉल: फास्ट

उत्तर

9

आप शायद विशाल सूची बॉक्स का अधिकतम आकार को सीमित करने और सक्रिय कर सकते हैं Virtualization

जैसे

<ListBox MaxHeight="500" 
     VirtualizingPanel.IsVirtualizing="true" 
     VirtualizingPanel.VirtualizationMode="Recycling" /> 

इससे लिस्टबॉक्स केवल कुछ आइटम लोड करने में सक्षम होगा और एक स्क्रो सक्षम करेगा यदि आवश्यक हो तो बाकी वस्तुओं को स्क्रॉल करने के लिए सूची बॉक्स पर llbar।

एक ही समय में VirtualizationModeRecycling पर सेट करने से आप जटिल डेटा टेम्पलेट्स का पुन: उपयोग करने में मदद करेंगे जिससे कि प्रत्येक आइटम के लिए उन्हें फिर से बनाने की आवश्यकता को समाप्त किया जा सके।


संपादित

यहाँ एक समाधान अपने नमूने के आधार पर है, मैं Virtualization साथ CompositeCollection का इस्तेमाल किया है को प्राप्त करने के वांछित।

XAML

<Grid xmlns:sys="clr-namespace:System;assembly=mscorlib" 
     xmlns:l="clr-namespace:PerfTest"> 
    <Grid.Resources> 
     <DataTemplate DataType="{x:Type l:Permission}"> 
      <StackPanel Orientation="Horizontal"> 
       <CheckBox /> 
       <TextBlock Text="{Binding Name}" /> 
       <Button Content="+" /> 
       <Button Content="-" /> 
       <Button Content="..." /> 
      </StackPanel> 
     </DataTemplate> 
     <CompositeCollection x:Key="data"> 
      <!-- Content 1 --> 
      <TextBlock Text="Title" 
         FontSize="24" 
         FontWeight="Thin" /> 
      <!-- Content 2 --> 
      <TextBlock Text="Subtitle" 
         FontSize="16" 
         FontWeight="Thin" /> 
      <!-- Content 3 --> 
      <CollectionContainer Collection="{Binding DataContext, Source={x:Reference listbox}}" /> 
      <!-- Content 4 --> 
      <TextBlock Text="User must scroll past the entire list box before seeing this" 
         FontSize="16" 
         FontWeight="Thin" 
         Padding="5" 
         TextWrapping="Wrap" 
         Background="#99000000" 
         Foreground="White" /> 
     </CompositeCollection> 
    </Grid.Resources> 
    <ListBox x:Name="listbox" 
      VirtualizingPanel.IsVirtualizing="True" 
      VirtualizingPanel.VirtualizationMode="Recycling" 
      ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
      ItemsSource="{StaticResource data}" /> 
</Grid> 

कोड

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     var items = new ObservableCollection<Permission>(); 
     foreach (var i in Enumerable.Range(0, 10000).Select(i => new Permission() { Name = "Permission " + i })) 
     { items.Add(i); } 
     DataContext = items; 
    } 
} 

public class Permission 
{ 
    public string Name { get; set; } 
} 

के बाद से हम स्ट्रिंग के लिए डेटा टेम्पलेट नहीं बना सकते तो मैं Permission संग्रह करने के लिए स्ट्रिंग संग्रह बदल दिया है। मुझे आशा है कि आपकी वास्तविक परियोजना में यह कुछ समान होगा।

इसे आज़माएं और देखें कि यह आपके लिए आवश्यक है या नहीं।

ध्यान दें: अगर वहाँ Collection="{Binding DataContext, Source={x:Reference listbox}}"

+0

लिस्टबॉक्स की अधिकतम ऊंचाई फिक्सिंग पर किसी भी डिजाइनर चेतावनी 2 स्क्रॉलबार कारण (http://i.imgur.com/s1MJ6BO.png?1 देखें) प्रकट करने के लिए होता है आप सुरक्षित रूप से अनदेखा कर सकते हैं – jayars

+1

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

+0

नमूना प्रोजेक्ट – jayars

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