<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Expression Blend</title>
        <link>http://blogs.ugidotnet.org/leonardo/category/Expression Blend.aspx</link>
        <description>Expression Blend</description>
        <language>it</language>
        <copyright>Leonardo</copyright>
        <generator>Subtext Version 2.6.0.0</generator>
        <item>
            <title>Sincronizziamo le animazioni con WPF</title>
            <link>http://blogs.ugidotnet.org/leonardo/archive/2011/01/08/sincronizziamo-le-animazioni-con-wpf.aspx</link>
            <description>&lt;p&gt;WPF offre un gran supporto alle applicazioni che vogliono utilizzare animazioni. Tramite poche righe di Xaml possiamo dire agevolmente che vogliamo animare la proprietà di riempimento di un oggetto da un colore ad un altro in un certo periodo di tempo infinite volte utilizzando perfino delle funzioni matematiche per variare non linearmente l'animazione. &lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/010811_0038_Sincronizzi1.png" /&gt;&lt;br /&gt;
&lt;em&gt;Esempio di animazione di un colore in Xaml&lt;/em&gt; &lt;/p&gt;
&lt;p&gt;&lt;span style="TEXT-DECORATION: underline"&gt;Non è però previsto un modo per aggiungere animazioni in maniera sincronizzata a quelle già esecuzione. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Se iniziamo un'animazione che sfuma dal bianco al rosso un ellisse e, supponiamo a metà dell'animazione, vogliamo iniziare un'altra animazione su un altro oggetto ma allo stesso tempo vogliamo tenere allineate temporalmente le due animazioni come possiamo fare? &lt;/p&gt;
&lt;p style="TEXT-ALIGN: center"&gt;&lt;img alt="" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/010811_0038_Sincronizzi2.png" /&gt; &lt;/p&gt;
&lt;p&gt;Altri esempi di utilizzo possono essere &lt;strong&gt;led che lampeggiano&lt;/strong&gt; continuamente in sincronia nella nostra animazione al cambiamento di determinate proprietà o eventi. &lt;/p&gt;
&lt;p&gt;La tecnica più semplice se non ci preoccupa il fatto di dover fermare a metà le animazioni in esecuzione, è fermare le animazioni in corso e riiniziarle con la nuova. &lt;/p&gt;
&lt;p&gt;Eseguire queste operazioni può significare scrivere tanto codice ogni volta ma vediamo come creare un TriggerAction che ci permette di incapsulare questa funzionalità e renderla &lt;strong&gt;riutilizzabile&lt;/strong&gt; e fruibile da Xaml. &lt;/p&gt;
&lt;p&gt;In sostanza animare la proprietà Fill di un ellisse diventerà facile come scrivere: &lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/010811_0038_Sincronizzi3.png" /&gt;&lt;/p&gt;
&lt;p&gt;Dove il namespace "i" si riferisce al namespace Interactive aggiunto da Expression Blend ma che verrà molto probabilmente incluso ufficialmente nel framework nella prossima versione.&lt;/p&gt;
&lt;p&gt;Sono stati utilizzati gli Interactive Trigger di Expression Blend e quindi è necessario aggiungere al progetto la Reference a System.Windows.Interactive e copiare la relativa .dll assieme all'exe (avviene in automatico dopo aver aggiunto la Reference) perchè a differenza di quelli inclusi nella versione attuale del Framework permettono una maggiore estendibilità ed aprono quindi nuovi scenari come quello descritto in questo articolo.&lt;/p&gt;
&lt;p&gt;Ancora meglio possiamo addirittura fare drag-and-drop da Expression Blend del nostro TriggerAction dagli Asset di tipo Behaviors sul nostro oggetto e settare poco più di un paio di proprietà nella scheda Miscellaneous. &lt;/p&gt;
&lt;div&gt;
&lt;table style="BORDER-COLLAPSE: collapse" border="0"&gt;
    &lt;colgroup&gt;&lt;col style="WIDTH: 332px" /&gt;&lt;col style="WIDTH: 326px" /&gt;&lt;/colgroup&gt;
    &lt;tbody valign="top"&gt;
        &lt;tr&gt;
            &lt;td style="BORDER-BOTTOM: 0.5pt solid; BORDER-LEFT: 0.5pt solid; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BORDER-TOP: 0.5pt solid; BORDER-RIGHT: 0.5pt solid"&gt;
            &lt;p&gt;&lt;img alt="" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/010811_0038_Sincronizzi4.png" /&gt;&lt;/p&gt;
            &lt;/td&gt;
            &lt;td style="BORDER-BOTTOM: 0.5pt solid; BORDER-LEFT: medium none; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BORDER-TOP: 0.5pt solid; BORDER-RIGHT: 0.5pt solid"&gt;
            &lt;p&gt;&lt;img alt="" width="279" height="518" src="/images/blogs_ugidotnet_org/leonardo/010811_0038_Sincronizzi5.png" /&gt;&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt; Vediamo ora come creare la nostra classe che chiameremo &lt;strong&gt;SyncAnimationAction&lt;/strong&gt;. &lt;/p&gt;
&lt;p&gt;Innanzitutto dovremo derivare &lt;strong&gt;SyncAnimationAction&lt;/strong&gt; da &lt;a href="http://msdn.microsoft.com/it-it/library/ff726548(v=expression.40).aspx"&gt;System.Windows.Interactivity.TriggerAction&amp;lt;DependencyObject&amp;gt;&lt;/a&gt; per poter essere richiamata senza scrivere codice da ulteriori &lt;a href="http://blogs.msdn.com/b/expression/archive/2009/03/23/an-introduction-to-behaviors-triggers-and-actions.aspx"&gt;Interaction Trigger&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;I Trigger possono scatenare l'animazione sincronizzata quando cambia una proprietà (PropertyChangedTrigger), allo scatenarsi di un evento (EventTrigger), alla pressione di un pulsante (KeyTrigger), etc.. &lt;/p&gt;
&lt;p&gt;Aggiungiamo quindi alla nostra classe 4 Proprietà che potranno essere impostate dallo Xaml come visto prima: &lt;/p&gt;
&lt;div&gt;
&lt;table style="BORDER-COLLAPSE: collapse" border="0"&gt;
    &lt;colgroup&gt;&lt;col style="WIDTH: 134px" /&gt;&lt;col style="WIDTH: 148px" /&gt;&lt;col style="WIDTH: 296px" /&gt;&lt;/colgroup&gt;
    &lt;tbody valign="top"&gt;
        &lt;tr&gt;
            &lt;td style="BORDER-BOTTOM: 0.5pt solid; BORDER-LEFT: 0.5pt solid; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BORDER-TOP: 0.5pt solid; BORDER-RIGHT: 0.5pt solid"&gt;
            &lt;p&gt;&lt;strong&gt;Proprietà&lt;/strong&gt;&lt;/p&gt;
            &lt;/td&gt;
            &lt;td style="BORDER-BOTTOM: 0.5pt solid; BORDER-LEFT: medium none; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BORDER-TOP: 0.5pt solid; BORDER-RIGHT: 0.5pt solid"&gt;
            &lt;p&gt;&lt;strong&gt;Tipo&lt;/strong&gt;&lt;/p&gt;
            &lt;/td&gt;
            &lt;td style="BORDER-BOTTOM: 0.5pt solid; BORDER-LEFT: medium none; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BORDER-TOP: 0.5pt solid; BORDER-RIGHT: 0.5pt solid"&gt;
            &lt;p&gt;&lt;strong&gt;Descrizione&lt;/strong&gt;&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="BORDER-BOTTOM: 0.5pt solid; BORDER-LEFT: 0.5pt solid; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BORDER-TOP: medium none; BORDER-RIGHT: 0.5pt solid"&gt;
            &lt;p&gt;&lt;em&gt;Animation&lt;/em&gt;&lt;/p&gt;
            &lt;/td&gt;
            &lt;td style="BORDER-BOTTOM: 0.5pt solid; BORDER-LEFT: medium none; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BORDER-TOP: medium none; BORDER-RIGHT: 0.5pt solid"&gt;
            &lt;p&gt;&lt;a href="http://msdn.microsoft.com/it-It/library/system.windows.media.animation.animationtimeline.aspx"&gt;AnimationTimeline&lt;/a&gt;&lt;/p&gt;
            &lt;/td&gt;
            &lt;td style="BORDER-BOTTOM: 0.5pt solid; BORDER-LEFT: medium none; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BORDER-TOP: medium none; BORDER-RIGHT: 0.5pt solid"&gt;
            &lt;p&gt;L'animazione da eseguire&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="BORDER-BOTTOM: 0.5pt solid; BORDER-LEFT: 0.5pt solid; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BORDER-TOP: medium none; BORDER-RIGHT: 0.5pt solid"&gt;
            &lt;p&gt;&lt;em&gt;AnimatedObject&lt;/em&gt;&lt;/p&gt;
            &lt;/td&gt;
            &lt;td style="BORDER-BOTTOM: 0.5pt solid; BORDER-LEFT: medium none; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BORDER-TOP: medium none; BORDER-RIGHT: 0.5pt solid"&gt;
            &lt;p&gt;&lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.media.animation.ianimatable.aspx"&gt;IAnimatable&lt;/a&gt;&lt;/p&gt;
            &lt;/td&gt;
            &lt;td style="BORDER-BOTTOM: 0.5pt solid; BORDER-LEFT: medium none; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BORDER-TOP: medium none; BORDER-RIGHT: 0.5pt solid"&gt;
            &lt;p&gt;L'oggetto su cui eseguire l'animazione&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="BORDER-BOTTOM: 0.5pt solid; BORDER-LEFT: 0.5pt solid; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BORDER-TOP: medium none; BORDER-RIGHT: 0.5pt solid"&gt;
            &lt;p&gt;&lt;em&gt;AnimatedProperty&lt;/em&gt;&lt;/p&gt;
            &lt;/td&gt;
            &lt;td style="BORDER-BOTTOM: 0.5pt solid; BORDER-LEFT: medium none; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BORDER-TOP: medium none; BORDER-RIGHT: 0.5pt solid"&gt;
            &lt;p&gt;&lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.dependencyproperty.aspx"&gt;DependencyProperty&lt;/a&gt;&lt;/p&gt;
            &lt;/td&gt;
            &lt;td style="BORDER-BOTTOM: 0.5pt solid; BORDER-LEFT: medium none; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BORDER-TOP: medium none; BORDER-RIGHT: 0.5pt solid"&gt;
            &lt;p&gt;La proprietà dell'oggetto da animare&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="BORDER-BOTTOM: 0.5pt solid; BORDER-LEFT: 0.5pt solid; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BORDER-TOP: medium none; BORDER-RIGHT: 0.5pt solid"&gt;
            &lt;p&gt;&lt;em&gt;AnimationStopped&lt;/em&gt;&lt;/p&gt;
            &lt;/td&gt;
            &lt;td style="BORDER-BOTTOM: 0.5pt solid; BORDER-LEFT: medium none; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BORDER-TOP: medium none; BORDER-RIGHT: 0.5pt solid"&gt;
            &lt;p&gt;bool&lt;/p&gt;
            &lt;/td&gt;
            &lt;td style="BORDER-BOTTOM: 0.5pt solid; BORDER-LEFT: medium none; PADDING-LEFT: 7px; PADDING-RIGHT: 7px; BORDER-TOP: medium none; BORDER-RIGHT: 0.5pt solid"&gt;
            &lt;p&gt;Flag che indica se l'animazione è da terminare&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt; Le prime 3 proprietà (o anche &lt;em&gt;AnimationStopped&lt;/em&gt; se si ha la necessità) dovranno essere &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.dependencyproperty.aspx"&gt;DependencyProperty&lt;/a&gt; per supportare il Binding tramite XAML. &lt;/p&gt;
&lt;p&gt;Effettuiamo poi l'override del metodo &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.interactivity.triggeraction.invoke(v=Expression.40).aspx"&gt;Invoke&lt;/a&gt; che verrà scatenato dai Trigger ed aggiungiamo poi tramite una classe "contenitore" AppliedAnimation i nostri valori ad una variabile List&amp;lt;AppliedAnimation&amp;gt; &lt;strong&gt;statica&lt;/strong&gt; chiamata &lt;em&gt;_animations&lt;/em&gt;. &lt;/p&gt;
&lt;p&gt;Quando verrà chiamato &lt;strong&gt;Invoke&lt;/strong&gt; la nostra classe avrà già popolate le proprietà (&lt;em&gt;AnimatedObject, AnimatedProperty, Animation e AnimationStopped&lt;/em&gt;) da Xaml quindi dovremo solamente controllare che questi dati siano validi per poterli aggiungere alla lista. &lt;/p&gt;
&lt;p&gt;La lista servirà per tenere dei riferimenti alle nostre animazioni e ci permetterà di fermare/riavviare tutte le animazioni nella lista all'aggiunta di una nuova animazione. &lt;/p&gt;
&lt;p&gt;All'aggiunta di una nuova animazione scorreremo tutta la lista delle animazioni fermandole e facendole ripartire. &lt;/p&gt;
&lt;p&gt;Per gestire le animazioni non ci serviremo della classe &lt;a href="http://msdn.microsoft.com/it-it/library/ms634711.aspx"&gt;Storyboard&lt;/a&gt; in quanto trova la sua maggiore utilità nel codice XAML ma semplicemente utilizzeremo il metodo &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.media.animation.ianimatable.beginanimation(v=VS.100).aspx"&gt;BeginAnimation&lt;/a&gt; passando rispettivamente prima il secondo parametro nullo e poi con l'animazione da eseguire. &lt;/p&gt;
&lt;p&gt;&lt;img alt="" width="488" height="64" src="/images/blogs_ugidotnet_org/leonardo/010811_0038_Sincronizzi6.png" /&gt;&lt;/p&gt;
&lt;p&gt;Eviteremo quindi l'overhead dovuto ad instanziare un ulteriore StoryBoard. &lt;/p&gt;
&lt;p&gt;Spostiamo dunque il codice di sincronizzazione vero e proprio in un metodo statico ReSync per poterlo chiamare eventualmente anche da codice C# (o VB.NET). &lt;/p&gt;
&lt;p&gt;&lt;img alt="" width="524" height="335" src="/images/blogs_ugidotnet_org/leonardo/010811_0038_Sincronizzi7.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Come facciamo però a rimuovere un'animazione? &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Qui entra in gioco la quarta proprietà &lt;em&gt;AnimationStopped&lt;/em&gt;, semplicemente nel metodo &lt;strong&gt;Invoke&lt;/strong&gt; dovremo controllare se l'animazione è già presenta in lista e in tal caso fermarla ed eliminarla. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Memory Leak? &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Mantenendo un riferimento agli oggetti IAnimatable nella lista tramite un AppliedAnimation potremmo causare un memory leak, è quindi consigliabile utilizzare la classe &lt;a href="http://msdn.microsoft.com/it-it/library/system.weakreference(v=VS.100).aspx"&gt;WeakReference&lt;/a&gt; al posto del tipo IAnimatable nella lista perché così il Garbage Collector potrà cancellare gli oggetti se sono rimasti solamente nella nostra lista.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;E se aggiungo molte animazioni?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Se si aggiungono tante animazioni, ad ogni animazione aggiunta vengono riavviate le precedenti e questo potrebbe causare qualche problema prestazionale se le animazioni sono complesse e se sono in gran numero.&lt;/p&gt;
&lt;p&gt;Esempio: se aggiungo 100 animazioni avrò 100 &lt;strong&gt;ReSync&lt;/strong&gt; che complessivamente riavvieranno 100+99+98+....+1 animazioni e questo potrebbe non essere desiderato, è quindi necessario inserire una proprietà che permetta di "saltare" il metodo &lt;strong&gt;ReSync&lt;/strong&gt; fino a quando tutte le animazioni non saranno state aggiunte. In questo modo si potrà avere un solo ReSync alla fine dell'aggiunta in blocco delle animazioni.&lt;/p&gt;
&lt;p&gt;Nel &lt;a href="http://cid-7996fa031700f3fe.office.live.com/self.aspx/Pubblica/SyncAnimation.rar"&gt;codice allegato&lt;/a&gt; è presente l'implementazione comprensiva di WeakReference&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/leonardo/aggbug/99607.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Leonardo</dc:creator>
            <guid>http://blogs.ugidotnet.org/leonardo/archive/2011/01/08/sincronizziamo-le-animazioni-con-wpf.aspx</guid>
            <pubDate>Sat, 08 Jan 2011 01:00:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/leonardo/archive/2011/01/08/sincronizziamo-le-animazioni-con-wpf.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/leonardo/comments/commentRss/99607.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/leonardo/services/trackbacks/99607.aspx</trackback:ping>
        </item>
        <item>
            <title>Grafici con WPF e LINQ</title>
            <link>http://blogs.ugidotnet.org/leonardo/archive/2010/08/17/grafici-con-wpf-e-linq-again.aspx</link>
            <description>&lt;p&gt;Aggiornato l’articolo su come creare grafici partendo da zero tramite WPF e LINQ per includere alcune nuove peculiarità del .NET Framework 4.0.&lt;/p&gt;
&lt;table border="0" cellspacing="0" cellpadding="2" width="400"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="200"&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/GraficiconWPFeLINQ_D792/BlurredText_2.png"&gt;&lt;img style="display: inline" class="wlDisabledImage" title="BlurredText" alt="BlurredText" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/GraficiconWPFeLINQ_D792/BlurredText_thumb.png" width="122" height="116" /&gt;&lt;/a&gt;&lt;/td&gt;
            &lt;td valign="top" width="200"&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/GraficiconWPFeLINQ_D792/clearText_2.png"&gt;&lt;img style="display: inline" class="wlDisabledImage" title="clearText" alt="clearText" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/GraficiconWPFeLINQ_D792/clearText_thumb.png" width="124" height="108" /&gt;&lt;/a&gt;&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Testo più chiaro con TextOptions.TextFormattingMode="Display"&lt;/p&gt;
&lt;p&gt;   &lt;/p&gt;
&lt;table border="0" cellspacing="0" cellpadding="2" width="400"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="200"&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/GraficiconWPFeLINQ_D792/antialiased_thumb_2.gif"&gt;&lt;img style="display: inline" class="wlDisabledImage" title="antialiased_thumb" alt="antialiased_thumb" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/GraficiconWPFeLINQ_D792/antialiased_thumb_thumb.gif" width="186" height="127" /&gt;&lt;/a&gt;&lt;/td&gt;
            &lt;td valign="top" width="200"&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/GraficiconWPFeLINQ_D792/edgeLayoutRound_2.png"&gt;&lt;img style="display: inline" class="wlDisabledImage" title="edgeLayoutRound" alt="edgeLayoutRound" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/GraficiconWPFeLINQ_D792/edgeLayoutRound_thumb.png" width="186" height="127" /&gt;&lt;/a&gt;&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
Grafici più definiti con UseLayoutRounding (precedentemente veniva disabilitato solamente l’Anti-Aliasing dei bordi)
&lt;p&gt;&lt;a href="https://1drv.ms/u/s!Av7zABcD-pZ5gwdg7wSjiY3Q95Ev?e=TnTgEM"&gt;Progetto scaricabile in formato Visual Studio 2010&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/leonardo/archive/2008/11/10/articolo-grafici-con-wpf-e-linq.aspx"&gt;Leggi l’articolo aggiornato al 17/08/2010&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/leonardo/aggbug/99079.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Leonardo</dc:creator>
            <guid>http://blogs.ugidotnet.org/leonardo/archive/2010/08/17/grafici-con-wpf-e-linq-again.aspx</guid>
            <pubDate>Tue, 17 Aug 2010 16:26:19 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/leonardo/archive/2010/08/17/grafici-con-wpf-e-linq-again.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/leonardo/comments/commentRss/99079.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/leonardo/services/trackbacks/99079.aspx</trackback:ping>
        </item>
        <item>
            <title>WPF e il 3D (sesta parte)</title>
            <link>http://blogs.ugidotnet.org/leonardo/archive/2009/06/23/wpf-e-il-3d-sesta-parte.aspx</link>
            <description>&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/leonardo/articles/wpf_3d.aspx"&gt;Indice degli articoli su WPF e il 3D&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;I pennelli di WPF&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Per colorare un cubo di Rosso abbiamo assegnato al nostro modello 3D (&lt;a href="http://blogs.ugidotnet.org/leonardo/archive/2009/04/07/wpf-e-il-3d-quinta-parte.aspx"&gt;creato in precedenza&lt;/a&gt;) il materiale &lt;strong&gt;DiffuseMaterial&lt;/strong&gt; con la proprietà &lt;strong&gt;Brush&lt;/strong&gt; impostata a Red tramite codice XAML.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/leonardo/articles/wpf_3d.aspx"&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="DiffuseMaterialBrush" border="0" alt="DiffuseMaterialBrush" width="286" height="52" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3Dsestaparte_11381/DiffuseMaterialBrush_a2a0dc59-f12b-4de4-a7ca-f100c32e6fef.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Così facendo dietro le quinte è stato utilizzato il pennello predefinito &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.media.brushes.aspx"&gt;Brushes&lt;/a&gt;.Red che altro non è che un &lt;strong&gt;Brush&lt;/strong&gt; (parola che in italiano si può tradurre letteralmente in &lt;strong&gt;pennello&lt;/strong&gt;) di tipo &lt;strong&gt;SolidColorBrush&lt;/strong&gt; (colore uniforme) con la proprietà Color impostata su Red. Avremmo potuto scrivere anche il seguente codice XAML per ottenere lo stesso risultato:&lt;/p&gt;
&lt;p&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="DiffuseMaterialSolidColorBrush" border="0" alt="DiffuseMaterialSolidColorBrush" width="352" height="121" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3Dsestaparte_11381/DiffuseMaterialSolidColorBrush_4ea8e067-7b9b-4c7c-8c2b-2504636ce76b.png" /&gt;&lt;/p&gt;
&lt;p&gt;Scrivendo il codice in quest’ultima forma è possibile sostituire il tipo &lt;strong&gt;SolidColorBrush&lt;/strong&gt; con qualsiasi pennello, vediamo quali WPF ci fornisce:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.media.solidcolorbrush.aspx"&gt;SolidColorBrush&lt;/a&gt; come abbiamo visto ci permette di colorare con un colore a tinta unita &lt;br /&gt;
&lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.media.lineargradientbrush.aspx"&gt;LinearGradientBrush&lt;/a&gt; permette di colorare con sfumature lineari &lt;br /&gt;
&lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.media.imagebrush.aspx"&gt;ImageBrush&lt;/a&gt; permette di disegnare un’immagine &lt;br /&gt;
&lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.media.radialgradientbrush.aspx"&gt;RadialGradientBrush&lt;/a&gt; permette di colorare con sfumature radiali &lt;br /&gt;
&lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.media.drawingbrush.aspx"&gt;DrawingBrush&lt;/a&gt; permette di disegnare un disegno 2D (o un oggetto &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.media.drawing.aspx"&gt;Drawing&lt;/a&gt;) &lt;br /&gt;
&lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.media.visualbrush.aspx"&gt;VisualBrush&lt;/a&gt;   permette di disegnare un oggetto visualizzabile (o un oggetto &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.media.visual.aspx"&gt;Visual&lt;/a&gt;) &lt;br /&gt;
&lt;em&gt;I pennelli sono ordinati dal più al meno performante.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;WPF è estremamente &lt;strong&gt;coerente&lt;/strong&gt; e permette di utilizzare su oggetti sia &lt;strong&gt;2D&lt;/strong&gt; sia &lt;strong&gt;3D&lt;/strong&gt; tutti i pennelli.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3Dsestaparte_11381/Blend_4.png"&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="Blend" border="0" alt="Blend" width="534" height="612" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3Dsestaparte_11381/Blend_thumb_1.png" /&gt;&lt;/a&gt;  &lt;br /&gt;
&lt;em&gt;Tramite Expression Blend è possibile impostare visualmente qualsiasi pennello e vederne un anteprima applicata sull’oggetto anche se tridimensionale&lt;/em&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Coloriamo oggetti 3D coi pennelli&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;L’uso di pennelli avanzati pone il problema di &lt;strong&gt;mappare&lt;/strong&gt; eventuali immagini 2D (chiamate &lt;strong&gt;texture&lt;/strong&gt;) sulle superfici tridimensionali, per risolverlo dobbiamo inserire delle coordinate chiamate &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.media.media3d.meshgeometry3d.texturecoordinates.aspx"&gt;TextureCoordinates&lt;/a&gt; nelle nostre geometrie.&lt;/p&gt;
&lt;p&gt;Ad esempio il seguente pennello &lt;strong&gt;LinearGradientBrush&lt;/strong&gt; genera un gradiente dal bianco al nero passando per il rosso:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3Dsestaparte_11381/LinearGradientBrush_2.png"&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="LinearGradientBrush" border="0" alt="LinearGradientBrush" width="461" height="152" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3Dsestaparte_11381/LinearGradientBrush_thumb.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Per colorare un cubo col gradiente di esempio oltre ad impostarlo come materiale (vedere I pennelli di WPF ad inizio articolo) dobbiamo provvedere a mappare ogni punto alle corrispondenti coordinate della &lt;strong&gt;texture&lt;/strong&gt; che come possiamo notare utilizzano il &lt;strong&gt;sistema di riferimento 2D&lt;/strong&gt;. La mappatura si concretizza tramite la proprietà &lt;strong&gt;TextureCoordinates &lt;/strong&gt;della geometria &lt;strong&gt;MeshGeometry3D&lt;/strong&gt;. &lt;/p&gt;
&lt;table border="0" cellspacing="0" cellpadding="2" width="238"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="200"&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3Dsestaparte_11381/texture_4.png"&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="texture" border="0" alt="texture" width="239" height="146" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3Dsestaparte_11381/texture_thumb_1.png" /&gt;&lt;/a&gt;&lt;/td&gt;
            &lt;td valign="top" width="36"&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3Dsestaparte_11381/TextureCoordinates_4.png"&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="TextureCoordinates" border="0" alt="TextureCoordinates" width="284" height="123" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3Dsestaparte_11381/TextureCoordinates_thumb_1.png" /&gt;&lt;/a&gt;&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;em&gt;Il codice XAML per brevità è relativo alla sola faccia centrale del cubo&lt;/em&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/leonardo/aggbug/96499.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Leonardo</dc:creator>
            <guid>http://blogs.ugidotnet.org/leonardo/archive/2009/06/23/wpf-e-il-3d-sesta-parte.aspx</guid>
            <pubDate>Tue, 23 Jun 2009 00:43:24 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/leonardo/archive/2009/06/23/wpf-e-il-3d-sesta-parte.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/leonardo/comments/commentRss/96499.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/leonardo/services/trackbacks/96499.aspx</trackback:ping>
        </item>
        <item>
            <title>Da Visual Studio a Expression Blend.. in un lampo</title>
            <link>http://blogs.ugidotnet.org/leonardo/archive/2009/02/13/da-visual-studio-a-expression-blend.-in-un-lampo.aspx</link>
            <description>&lt;p&gt;Spesso chi programma utilizzando WPF ha la necessità di passare da Visual Studio a Expression Blend molto spesso, ecco un piccolo suggerimento per passare rapidamente da un ambiente all’altro:&lt;/p&gt;  &lt;p&gt;Per prima cosa apriamo Visual Studio e tramite il menù &lt;strong&gt;Tools&lt;/strong&gt; andiamo su &lt;strong&gt;External Tools&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;img title="1" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="305" alt="1" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/DaVisualStudioaExpressionBlend.inunlampo_8B6A/1_dae73b41-35e4-4cad-b1b2-85e84b424d37.png" width="419" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;Si aprirà la finestra di dialogo External Tools. Aggiungiamo una nuove voce facendo click su &lt;strong&gt;Add&lt;/strong&gt; e inserendo come titolo “Expression &amp;amp;Blend”, come comando il percorso dell’eseguibile Blend.exe, come argomento il nome del file della soluzione (o del progetto se si desidera aprire in Blend solamente il progetto corrente) e come directory iniziale la cartella della soluzione (o del progetto).&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;u&gt;UPDATE:&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt; inserendo come argomento “&lt;strong&gt;$(ProjectDir)$(ProjectFileName) /file:$(ItemFileName)$(ItemExt)&lt;/strong&gt;” si aprirà il progetto corrente in Expression Blend assieme al file su cui si sta lavorando (in maniera analoga al menù contestuale “Open in Expression Blend…” disponibile nei progetti Silverlight)&lt;/p&gt;  &lt;p&gt;Inserendo il carattere &amp;amp; prima della B creeremo un collegamento rapido da tastiera (Alt+T/B).&lt;/p&gt;  &lt;p&gt;Per poter impostare rapidamente tutti i percorsi è possibile utilizzare i pulsanti alla destra delle caselle di testo.&lt;/p&gt;  &lt;p&gt;Se si utilizzano raramente gli altri strumenti è consigliato spostare (tramite il pulsante &lt;strong&gt;Move Up&lt;/strong&gt;) la voce aggiunta in prima posizione per far poi “meno strada” col mouse.&lt;/p&gt;  &lt;p&gt;&lt;img title="2" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="343" alt="2" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/DaVisualStudioaExpressionBlend.inunlampo_8B6A/2_89e59496-6ed3-4a6f-bb2d-c931e8e57741.png" width="353" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;Adesso possiamo aprire rapidamente le nostre soluzioni in Expression Blend tramite &lt;strong&gt;Tools &lt;/strong&gt;/ &lt;strong&gt;Expression Blend&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;img title="3" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="461" alt="3" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/DaVisualStudioaExpressionBlend.inunlampo_8B6A/3_c49d31de-4f00-4319-861a-0516520602f6.png" width="414" border="0" /&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/leonardo/aggbug/95460.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Leonardo</dc:creator>
            <guid>http://blogs.ugidotnet.org/leonardo/archive/2009/02/13/da-visual-studio-a-expression-blend.-in-un-lampo.aspx</guid>
            <pubDate>Fri, 13 Feb 2009 10:54:56 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/leonardo/archive/2009/02/13/da-visual-studio-a-expression-blend.-in-un-lampo.aspx#feedback</comments>
            <slash:comments>5</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/leonardo/comments/commentRss/95460.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/leonardo/services/trackbacks/95460.aspx</trackback:ping>
        </item>
        <item>
            <title>Grafici con WPF e LINQ</title>
            <link>http://blogs.ugidotnet.org/leonardo/archive/2008/11/10/grafici-con-wpf-e-linq.aspx</link>
            <description>&lt;p&gt;Un problema molto comune durante lo sviluppo di applicazioni è la visualizzazione dei dati. Windows Presentation Foundation non fornisce grafici già pronti e sebbene esistano diversi controlli gratuiti di terze parti vedremo passo passo come costruirne uno “from scratch” (da zero).&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/GraficiconWPFeLINQ_BC02/history_graph_4.jpg"&gt;&lt;img title="history_graph" style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="337" alt="history_graph" width="550" border="0" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/GraficiconWPFeLINQ_BC02/history_graph_thumb_1.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/leonardo/articles/articolo-grafici-con-wpf-e-linq.aspx"&gt;Leggi l'articolo completo&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/leonardo/aggbug/94565.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Leonardo</dc:creator>
            <guid>http://blogs.ugidotnet.org/leonardo/archive/2008/11/10/grafici-con-wpf-e-linq.aspx</guid>
            <pubDate>Mon, 10 Nov 2008 13:50:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/leonardo/archive/2008/11/10/grafici-con-wpf-e-linq.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/leonardo/comments/commentRss/94565.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/leonardo/services/trackbacks/94565.aspx</trackback:ping>
        </item>
    </channel>
</rss>