2010-08-06 19 views
6

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

मैं निम्नलिखित Silverlight XAML है:

<Grid x:Name="LayoutRoot" MaxWidth="500" MinWidth="100" 
    MaxHeight="500" MinHeight="100"> 
    <Grid.DataContext> 
     <app:MainPageViewModel/> 
    </Grid.DataContext> 
    <ScrollViewer> 
    <ItemsControl ItemsSource="{Binding TextItems}" Margin="0,20,0,20"> 
     <ItemsControl.ItemTemplate><DataTemplate> 
      <Border MaxHeight="175" Margin="0,0,0,18" CornerRadius="5"> 
       <TextBlock Margin="2" TextTrimming="WordEllipsis" 
        TextWrapping="Wrap" Text="{Binding}"/> 
      </Border> 
     </DataTemplate></ItemsControl.ItemTemplate> 
    </ItemsControl> 
    </ScrollViewer> 
</Grid> 

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

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

सिल्वरलाइट में यह 4.

उत्तर

15

कुछ चीजें आप इस काम करने के लिए क्या करने की जरूरत हैं।

  1. एक VirtualizingStackPanel को अपने ItemsControl के लिए ItemsPanelTemplate सेट करें।
  2. के अंदर स्क्रॉलव्यूयर को अपने के लिए एक नियंत्रण टेम्पलेट शामिल करें, बस के बजाय आइटम कंट्रोल इसे बाहर के चारों ओर लपेटें।
  3. सुनिश्चित करें ताकि लेआउट प्रणाली काम कर सकते हैं कि कितने आइटम यह व्यूपोर्ट को भरने के लिए की जरूरत है ItemsControl एक निश्चित ऊंचाई है बनाओ। (ऐसा लगता है कि आप पहले से ही एक ग्रिड में ItemsControl रख कर यह कर रहे हैं - कि लेआउट प्रणाली नियंत्रण के लिए आवंटित ऊंचाई निर्धारित करने के लिए अनुमति देगा)

यहाँ है सबसे सरल उदाहरण मैं इस काम के साथ आ सकता है :

<ItemsControl ItemsSource="{Binding TextItems}"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <VirtualizingStackPanel /> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <ItemsControl.Template> 
      <ControlTemplate TargetType="ItemsControl"> 
       <Border> 
        <ScrollViewer> 
         <ItemsPresenter/> 
        </ScrollViewer> 
       </Border> 
      </ControlTemplate> 
     </ItemsControl.Template> 
    </ItemsControl> 
+0

यह एक आकर्षण स्टीव की तरह काम करता था। तो अपने समाधान और मुझे क्या करने की कोशिश कर रहा था के बीच मुख्य अंतर यह है कि आप, ScrollViewer में जोड़ने के लिए है, जबकि मैं तो बस नियंत्रण से बाहर की दुनिया में एक ScrollViewer डाल करने के लिए कोशिश कर रहा था ItemsControl.Template प्रयोग किया जाता है। क्या आप समझा सकते हैं कि आपका काम क्यों करता है और मैं क्या करने की कोशिश कर रहा था? यह समाधान को थोड़ा बेहतर समझने में मेरी मदद कर सकता है। – RationalGeek

+1

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

+0

समझ में आता है। एक बार फिर धन्यवाद! – RationalGeek