2010-12-28 32 views
13

मैं इस वर्चुअलाइजेशन फीचर यह पता लगाने की कोशिश कर रहा हूँ, मुझे यकीन है कि अगर मैं गलत समझ रहा हूँ या क्या हो रहा है नहीं कर रहा हूँ, लेकिन मैं में आइटमों की संख्या की जांच करने के चींटियों स्मृति प्रोफाइलर उपयोग कर रहा हूँ वर्चुअलाइज्ड ट्री व्यू, और यह सिर्फ बढ़ता रहता है। मेरे पास 1,001 आइटम (1 रूट, 1000 उप-आइटम) के साथ एक वृक्ष दृश्य है, और मैं हमेशा 1,001 ट्री व्यू इटम्स, 1,001 टॉगलबटन और 1,001 टेक्स्टब्लॉक तक पहुंचता हूं। क्या वर्चुअलाइजेशन आइटम का दोबारा उपयोग नहीं करना चाहिए? यदि हां, तो मेरे पास प्रत्येक का 1,001 क्यों होगा? इसके अलावा, CleanUpVirtualizedItem कभी आग नहीं।WPF TreeView वर्चुअलाइजेशन

मुझे पता है कि अगर मैं यह गलत समझ रहा हूँ हैं और आप यह कैसे उपयोग करने के लिए पर संसाधनों है। मैंने इंटरनेट पर खोज की है लेकिन कुछ भी उपयोगी नहीं मिला है।

संपादित करें:

यहां तक ​​कि पेड़ द्वारा प्रयुक्त स्मृति aporx से बढ़ता है। जब मैं विस्तार करता हूं और सभी वस्तुओं को स्क्रॉल करता हूं तो 4 एमबी से 12 एमबी तक।

मुझे धन्यवाद बताएं।

यह मेरा कोड है।

XAML:

<Window x:Class="RadTreeViewExpandedProblem.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 
    <Grid> 
     <TreeView x:Name="treeView" 
        VirtualizingStackPanel.IsVirtualizing="True" 
        VirtualizingStackPanel.CleanUpVirtualizedItem="TreeView_CleanUpVirtualizedItem"> 
      <TreeView.ItemsPanel> 
       <ItemsPanelTemplate> 
        <VirtualizingStackPanel /> 
       </ItemsPanelTemplate> 
      </TreeView.ItemsPanel> 
     </TreeView> 
    </Grid> 
</Window> 

सी #:

public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 

      TreeViewItem rootItem = new TreeViewItem() { Header = "Item Level 0" }; 

      for (int i = 0; i < 1000; i++) 
      { 
       TreeViewItem itemLevel1 = new TreeViewItem() { Header = "Item Level 1" }; 

       itemLevel1.Items.Add(new TreeViewItem()); 

       rootItem.Items.Add(itemLevel1); 
      } 

      treeView.Items.Add(rootItem); 
     } 

     private void TreeView_CleanUpVirtualizedItem(object sender, CleanUpVirtualizedItemEventArgs e) 
     { 

     } 
    } 

उत्तर

4

ठीक है, समस्या यह है कि वर्चुअलाइजेशन केवल काम करता है जब TreeView बाध्यकारी उपयोग कर रहा है, और नहीं जब नोड्स मेरी उदाहरण की तरह कोड में एक के बाद एक उत्पन्न कर रहे हैं है। निराशाजनक।

+2

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

+0

मुझे आपका विचार पसंद है। जब मुझे पेड़ पर ऊपर या नीचे स्क्रॉल करते समय मुझे और चीजों की आवश्यकता होती है तो मुझे पता चलेगा। क्या आपको लगता है कि इस दृष्टिकोण के साथ काम करेगा? – Carlo

+0

@Calro: यकीन है, यह काम करना चाहिए – Liero

4

अंतर यूआई वर्चुअलाइजेशन बनाम डेटा वर्चुअलाइजेशन (जो WPF अलग नियंत्रण पर बॉक्स से बाहर का समर्थन करता है) (जो WPF से बाहर का समर्थन नहीं करता है डिब्बा)।

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

बिया UI virtualization और data virtualization के बारे में दो महान पोस्ट और मतभेदों और कैसे जो होने के लिए क्या आप के बाद कर रहे हैं प्रकट होता है डेटा वर्चुअलाइजेशन के लिए कोई समर्थन की सीमा वैकल्पिक हल के लिए में चला जाता है।

संपादित करें:

की वर्चुअलाइजेशन के लिए 3.5 एसपी 1 समर्थन TreeView में जोड़ा गया है। शायद आपके आइटम पैनेल टेम्पलेट को हटा रहा है और केवल TreeView पर गुणों को सेट करना पर्याप्त होना चाहिए।

+0

मैं इसे समझता हूं। मेरे प्रश्न में मैं यूआई वर्चुअलाइजेशन के बारे में बात कर रहा हूं, जो मुझे समझ में नहीं आता है कि यह 10001 आइटमों में से प्रत्येक के लिए एक कंटेनर क्यों बनाता है, वायरलैलाइजेशन सत्य होने के बावजूद। – Carlo

+0

@ कार्लोस अपने आइटम पैनल टेम्पलेट को हटाने के बारे में नोट जोड़ा गया; जैसा कि मेरा मानना ​​है कि 3.5 एसपी 1 के रूप में डिफ़ॉल्ट टेम्पलेट वर्चुअलाइजिंगस्टैकपैनल होना चाहिए, इसलिए टेम्पलेट को बदलने की कोई आवश्यकता नहीं होनी चाहिए, केवल वृक्ष दृश्य के माध्यम से संपत्ति को सक्षम करें। –

+0

आपके संपादन में आपने जो उल्लेख किया है उसका प्रयास किया। या तो काम नहीं किया। मैं अभी भी प्रत्येक नियंत्रण में से एक हजार के साथ en up। यह वास्तव में अजीब है। और अभी भी CleanUpVirtualizedItem ईवेंट निकाल दिया नहीं गया है, जो एक और सुराग है कि वर्चुअलाइजेशन काम नहीं कर रहा है। – Carlo

2

सटीक नहीं है। यह सच है कि वर्चुअलाइजेशन केवल बाध्यकारी के साथ काम करता है, हालांकि, जैसा कि मैंने कुछ नमूना अनुप्रयोग में देखा है कि तत्वों का रीसाइक्लिंग केवल वृक्षदृश्य के मूल वस्तुओं पर होता है।

तो आप 1000 बच्चों के साथ केवल 1 जड़ आइटम है, कोई रीसाइक्लिंग रीसाइक्लिंग के लिए केवल 1 कंटेनर उपलब्ध नहीं है क्योंकि थेरेस हो जाएगा।

यदि आपके पास 100 रूट आइटम हैं, और उनमें से प्रत्येक में 100 बच्चे हैं, तो आपको आंशिक रीसाइक्लिंग मिल जाएगा, क्योंकि केवल रूट 100 आइटम रीसाइक्लिंग किए जाएंगे, लेकिन अन्य 9900 बाल आइटम स्मृति में संग्रहीत किए जाएंगे।

निश्चित रूप से

समस्या केवल खराब हो जाता है, तो अपने पेड़ नेस्टिंग स्तर से अधिक 2 या 3 है।

मुझे नहीं पता कि इस समस्या का समाधान क्या है।

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