2010-06-30 9 views
6

मेरे पास लगभग 45 सभ्य बड़ी छवियां हैं (लगभग 680x1000) जिन्हें एक साधारण उपयोगकर्ता नियंत्रण (भरने, छवि, टेक्स्टब्लॉक, और 2 तरफ आयतों के साथ गोलाकार बैकबॉर्डर) में लोड करने की आवश्यकता होती है और फिर एक रैप पैनेल में प्रदर्शित होती है। वर्चुअलाइजिंग वास्तव में यहां मदद नहीं करेगा क्योंकि छवियों को प्रोग्राम लोड पर सभी दिखाई दे रहे हैं।डब्ल्यूपीएफ: रैप पैनेल में तेजी से बड़ी छवियों को कैसे लोड करें?

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

मैंने How do I load images in the background? (पहला उत्तर) में मिली बहुप्रचारित दृष्टिकोण की कोशिश की, हालांकि इसने कार्यक्रम को लोड करने में बहुत अधिक समय लगाया!

कोई विचार?

वर्तमान लोड कोड:

BitmapImage bmp = new BitmapImage(); 
bmp.BeginInit(); 
//bmp.DecodePixelWidth = 400; 
bmp.UriSource = new Uri(file.FullName); 
bmp.EndInit(); 
bmp.Freeze(); 
images.Add(bmp); 

नमूना XAML कोड:

 <Border x:Name="backBorder" Background="Black" Padding="2" Margin="3" CornerRadius="3,3,4,4" 
      BorderBrush="Black" BorderThickness="1" 
      MouseEnter="backBorder_MouseEnter" MouseLeave="backBorder_MouseLeave" MouseLeftButtonUp="backBorder_MouseLeftButtonUp" > 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition /> 
      <RowDefinition Height="16" /> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition /> 
      <ColumnDefinition Width="15" /> 
     </Grid.ColumnDefinitions> 
     <Image x:Name="imageBox" Stretch="Fill" Width="{Binding Path=ImageWidth, ElementName=me}" Height="{Binding Path=ImageHeight, ElementName=me}" /> 
     <Border x:Name="backRatingBorder" Grid.Column="1" Margin="3,0,0,0" BorderBrush="Blue" Background="White" BorderThickness="1"/> 
     <Border x:Name="frontRatingBorder" Grid.Column="1" Margin="3,0,0,0" BorderBrush="Blue" Background="LightBlue" BorderThickness="1" VerticalAlignment="Bottom" Height="50"/> 
     <TextBlock x:Name="textBlock" Grid.Row="1" Grid.ColumnSpan="2" TextAlignment="Center" Background="Transparent" Foreground="White" FontFamily="Segoe UI" FontWeight="SemiBold" FontSize="12" /> 
    </Grid> 
</Border> 

अद्यतन:

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

उत्तर

1

यदि आप समग्र प्रदर्शन से खुश हैं, तो बस छवियों की लोडिंग, आप this Multithreaded UI tutorial. आजमा सकते हैं, मैं इसे आसानी से काम करने में कामयाब रहा, लेकिन यदि आप सभी छवियों को लूप में लोड कर रहे हैं तो यह ' जब तक आप सभी छवियों को लोड करना समाप्त नहीं कर लेते तब तक दृश्य को अपडेट न करें। यूआई इस समय के दौरान उत्तरदायी है, हालांकि, सभी लोडिंग एक अलग थ्रेड पर है।

वैकल्पिक रूप से, यदि आप अपनी सभी छवियों को लूप में लोड कर रहे हैं तो आप improved version of Windows Forms DoEvents method (उदाहरण के लिए नीचे स्क्रॉल करें) आज़मा सकते हैं। आप प्रत्येक छवि को लोड करने के बाद इसे कॉल करेंगे और यह यूआई को खुद को अपडेट करने का मौका देगा (प्रक्रिया उपयोगकर्ता इंटरैक्शन इत्यादि)। यह वह दृष्टिकोण है जिसका उपयोग मैंने प्रोजेक्ट के लिए मैप टाइल्स लोड करते समय किया था और पहले से आसान है।

+1

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

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