<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://www.dotnetzone.gr:443/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Windows Presentation Foundation (WPF)</title><link>https://www.dotnetzone.gr:443/cs/forums/102/ShowForum.aspx</link><description>Συζήτηση σχετικά με το πώς μπορεί το WPF να δημιουργήσει οπτικά ελκυστικές εφαρμογές ώστε να βελτιώσουν το user experience.</description><dc:language>el</dc:language><generator>CommunityServer 2.1 SP3 (Build: 20423.1)</generator><item><title>Απ: WPF image gallery</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/73065.aspx</link><pubDate>Thu, 11 Jul 2013 22:21:24 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:73065</guid><dc:creator>DaltonGR</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/73065.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=102&amp;PostID=73065</wfw:commentRss><description>Ο converter υπάρχει διότι μετά απο ψάξιμο το έδιναν αρκετά forum για λύση, να πώ την αλήθεια σημαντική διαφορά δεν έχω δεί.</description></item><item><title>Απ: WPF image gallery</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/73034.aspx</link><pubDate>Mon, 08 Jul 2013 17:54:15 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:73034</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/73034.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=102&amp;PostID=73034</wfw:commentRss><description>&lt;p&gt;Εγώ θα ρώταγα πρώτα ΓΙΑΤΙ υπάρχει ο converter? Το Image.Source δέχεται απευθείας URIs, δεν υπάρχει λόγος να χρησιμοποιηθεί κάποιος converter. &lt;/p&gt;&lt;p&gt;Το&amp;nbsp;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;πρόβλημα αυτή τη στιγμή είναι ότι ο converter παίρνει ένα Uri και φορτώνει την εικόνα σύγχρονα, στο UI thread με αποτέλεσμα να μπλοκάρει η εφαρμογή.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description></item><item><title>Απ: WPF image gallery</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/73027.aspx</link><pubDate>Sat, 06 Jul 2013 10:37:10 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:73027</guid><dc:creator>George Parissis</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/73027.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=102&amp;PostID=73027</wfw:commentRss><description>&lt;p&gt;Από ότι κατάλαβα η εφαρμογή επειδή φορτώνει τις εικόνες στο ίδιο thread με αυτό του UI φαίνεται πως κολλάει και δεν ανταποκρίνεται στους χειρισμούς του χρήστη.&lt;/p&gt;&lt;p&gt;Αυτό είναι και το πιο σημαντικό πρόβλημα, όσο για την ταχύτητα φόρτωσης των εικόνων στην εφαρμογή δεν νομίζω ότι μπορείς να κάνεις και πολλά πράγματα. Κάνω μία κλήση να φορτώσω μία εικόνα και ανάλογα με το μέγεθός της θα πάρει κάποιο χρόνο, τι παραπάνω μπορώ να κάνω; Τίποτα λέω εγώ. Αυτό όμως που θα μπορούσες να κάνεις είναι να δείχνει&amp;nbsp;η εφαρμογή στον χρήστη ότι κάτι κάνει.&lt;/p&gt;&lt;p&gt;Υπάρχουν διάφοροι τρόποι για αυτό. Άλλοι πονάνε περισσότερο, γιατί συνήθως θα πρέπει να γίνουν αλλαγές στον κώδικα για να έχουμε multi threading και άλλες λιγότερο με την βοήθεια του binding στο WPF.&lt;/p&gt;&lt;p&gt;Για την περίπτωσή σου, θα σου πρότεινα το PriorityBinding. Για πιο λόγο στο προτείνω. Θα μπορούσες να ορίσεις στο source του image ένα priority binding το οποίο θα έχει δύο bindings. Στο πρώτο θα κάνεις bind το thumbs collection των εικόνων που μπορεί να έχεις και στο δεύτερο το κανονικό μέγεθος των εικόνων. Οπότε όταν ξεκινάει η εφαρμογή να δείχνει αρχικά τα thumbs και ασύγχρονα από πίσω να φορτώνει τις εικόνες σε κανονική ανάλυση. Αν δεν έχεις thumbs μπορείς απλά να βάλεις ένα animation και όταν φορτωθεί η εικόνα να αλλαχθεί το animation με την εικόνα.&lt;/p&gt;&lt;p&gt;Όλα αυτά μπορεί να ακούγονται ή να φαντάζουν δύσκολα όμως δεν είναι στο WPF. Για παράδειγμα θα έγραφα.&lt;/p&gt;&lt;p&gt;&amp;lt;Image.Source&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;PriorityBinding&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Binding&lt;/span&gt; &lt;span style="color:red;"&gt;Path&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="color:black;"&gt;"&lt;/span&gt;&lt;span style="color:blue;"&gt;FullImg&lt;/span&gt;&lt;span style="color:black;"&gt;"&lt;/span&gt; &lt;span style="color:red;"&gt;IsAsync&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="color:black;"&gt;"&lt;/span&gt;&lt;span style="color:blue;"&gt;True&lt;/span&gt;&lt;span style="color:black;"&gt;"&lt;/span&gt;&lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Binding&lt;/span&gt; &lt;span style="color:red;"&gt;Path&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="color:black;"&gt;"PleaseWaitImg&lt;/span&gt;&lt;span style="color:black;"&gt;"&lt;/span&gt; &lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;PriorityBinding&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&amp;lt;/Image.Source&lt;/p&gt;&lt;p&gt;Πρόσεξε την χρήση του IsAsync που λέει στο Binding να ξεκινήσει νέο thread για το συγκεκριμένο binding και φυσικά ότι με την πρόταση αυτή οι αλλαγές στο πρόγραμμά σου περιορίζονται μόνο σε XAML. &lt;/p&gt;&lt;p&gt;Όσο το πρώτο binding θέλει τον χρόνο του για να φορτώσει την εικόνα στο source του image θα γίνει bind το PleaseWaitImg. Όταν ολοκληρωθεί το πρώτο binding και φορτώσει την εικόνα, αυτόματα θα γίνει αυτό το current bind του source property. Νομίζω θα βρεις αρκετά παραδείγματα για άρθρα για τα PriorityBindings στο internet. Ελπίζω να σου έδωσα μία ιδέα για να ξεκινήσεις.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description></item><item><title>WPF image gallery</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/73010.aspx</link><pubDate>Sat, 29 Jun 2013 17:08:49 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:73010</guid><dc:creator>DaltonGR</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/73010.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=102&amp;PostID=73010</wfw:commentRss><description>&lt;p&gt;Καλημέρα,&lt;/p&gt;&lt;p&gt;Εχω φτιάξει μια εφαρμογή που φορτώνει εικόνες απο τον σκληρό δίσκο με μια απλή εφαμρογή WPF, το πρόβλημα είναι ότι όταν οι εικόνες έχουν ανάλυση 1500χ1500 και άνω καθυστερεί να τις φορτώσει, και φαίνεται ότι η εφαρμογή δεν κάνει τίποτα. Υπάρχει κάποιος τρόπος η διαδικασία φορρτώματος των εικόνων να γίνει πιό γρήγορη. Παρακάτω είναι ο κώδικας XAML της αρχική φόρμας.&lt;/p&gt;&lt;p&gt;&amp;lt;ListBox Name="Images" ListBox.SelectionChanged="lstImagesChange_Click" Grid.Column="1"&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ScrollViewer.HorizontalScrollBarVisibility="Disabled" VirtualizingStackPanel.IsVirtualizing="True"&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;VirtualizingStackPanel.VirtualizationMode="Recycling" ScrollViewer.IsDeferredScrollingEnabled="True" &amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;ListBox.Resources&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;Style x:Key="{x:Type ScrollBar}" TargetType="{x:Type ScrollBar}"&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;Style.Triggers&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;Trigger Property="Orientation" Value="Vertical"&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;Setter Property="Width" Value="20"/&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;Setter Property="Height" Value="Auto" /&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/Trigger&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/Style.Triggers&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/Style&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/ListBox.Resources&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;ListBox.ItemsPanel&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;ItemsPanelTemplate&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;WrapPanel IsItemsHost="True" Orientation="Horizontal" FlowDirection="LeftToRight" /&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/ItemsPanelTemplate&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/ListBox.ItemsPanel&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;ListBox.ItemTemplate&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;DataTemplate&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;Border BorderThickness="2" BorderBrush="#bb62d8" Background="Black" Width="200" Height="200" Margin="5,5,10,5" CornerRadius="10"&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;Image Source="{Binding Path=Path, Converter={StaticResource UriToBitmapConverter}}" Tag="{Binding ImageID}" /&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/Border&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/DataTemplate&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/ListBox.ItemTemplate&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/ListBox&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:10pt;"&gt;και εδώ μια class που πειράζει τις εικόνες&lt;/span&gt;&lt;/p&gt;&lt;p&gt;public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; BitmapImage bi = new BitmapImage();&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; bi.BeginInit();&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; bi.DecodePixelWidth = 100;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //bi.DecodePixelHeight = 100;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; bi.CacheOption = BitmapCacheOption.OnDemand;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; bi.UriSource = new Uri( value.ToString() );&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; bi.EndInit();&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //return ResizeImage(bi,250,250);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return bi;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:10pt;"&gt;Ευχαριστώ εκ των προτέρων.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description></item></channel></rss>