<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>Il blog di Leonardo</title>
        <link>http://blogs.ugidotnet.org/leonardo/Default.aspx</link>
        <description />
        <language>it</language>
        <copyright>Leonardo</copyright>
        <generator>Subtext Version 2.1.0.3</generator>
        <image>
            <title>Il blog di Leonardo</title>
            <url>http://blogs.ugidotnet.org/images/RSS2Image.gif</url>
            <link>http://blogs.ugidotnet.org/leonardo/Default.aspx</link>
            <width>77</width>
            <height>60</height>
        </image>
        <item>
            <title>DependencyProperty e valore di default</title>
            <category>WPF</category>
            <link>http://blogs.ugidotnet.org/leonardo/archive/2011/10/10/dependencyproperty-e-valore-di-default.aspx</link>
            <description>&lt;p&gt;Quando si crea una &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.dependencyproperty.aspx"&gt;proprietà di dipendenza&lt;/a&gt; non si gestisce direttamente il valore di default ma lo si specifica attraverso i &lt;strong&gt;metadati&lt;/strong&gt;. Se la proprietà è un &lt;a href="http://msdn.microsoft.com/en-us/library/490f96s2.aspx"&gt;Reference Type&lt;/a&gt; il valore di default viene applicato a &lt;strong&gt;tutte&lt;/strong&gt; le istanze del tipo e non alle singole istanze. Questo comportamento è &lt;a href="http://msdn.microsoft.com/it-it/library/aa970563.aspx"&gt;particolarmente critico&lt;/a&gt; quando si lavora con delle collezioni. &lt;/p&gt;
&lt;p&gt;Per capire meglio questo comportamento e le sue conseguenze consideriamo una semplice applicazione con una finestra contenente due istanze di un UserControl &lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/101011_2102_DependencyP1.png" /&gt; 	&lt;/p&gt;
&lt;p&gt;L'UserControl (chiamato SampleUserControl) possiede una DependencyProperty con dati di tipo Reference come ad esempio il tipo Person. &lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/101011_2102_DependencyP2.png" /&gt;&lt;br /&gt;
&lt;em&gt;Codice dell'UserControl (il codice XAML è omesso)&lt;/em&gt; 	&lt;/p&gt;
&lt;p&gt;Il valore di default della DependencyProperty è impostato ad una nuova istanza di Person &lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/101011_2102_DependencyP3.png" /&gt;&lt;/p&gt;
&lt;p&gt;Il controllo contiene una TextBox collegata tramite databinding (UpdateSourceTrigger=PropertyChanged) alla proprietà Name della proprietà Person del controllo stesso (TextBox.Text &amp;lt;=&amp;gt; UserControl.Person.Name). &lt;/p&gt;
&lt;p&gt;Lanciando l'applicazione e iniziando a scrivere sulla TextBox del primo controllo cosa succederà?&lt;br /&gt;
Automaticamente &lt;strong&gt;anche&lt;/strong&gt; la seconda TextBox verrà valorizzata con quanto scritto. &lt;/p&gt;
&lt;p&gt;Cerchiamo di capire cosa succede: &lt;/p&gt;
&lt;p&gt;- Alla creazione della prima istanza del controllo, dato che la proprietà non è valorizzata viene assegnato il valore di default, "una sorta di puntatore" ad un nuovo oggetto Person &lt;/p&gt;
&lt;p&gt;- Alla creazione della seconda istanza del controllo la proprietà viene valorizzata con lo stesso puntatore. Entrambi i controlli puntano quindi allo stesso oggetto Person. &lt;/p&gt;
&lt;p&gt;- Modificando la prima proprietà verrà modificato l'oggetto Person "puntato" anche dal secondo controllo. La modifica sarà quindi visibile anche dal secondo controllo. &lt;/p&gt;
&lt;p&gt;Concludendo il comportamento è a prima vista &lt;strong&gt;differente&lt;/strong&gt; dalle normali aspettative di un programmatore ma consente un notevole &lt;strong&gt;risparmio&lt;/strong&gt; di memoria in controlli con molte proprietà non inizializzate. &lt;/p&gt;
&lt;p&gt;&lt;a href="https://skydrive.live.com/self.aspx/Pubblica/DefaultValueDependencyProperty.zip?cid=7996fa031700f3fe"&gt;Scarica l'applicazione di esempio&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/leonardo/aggbug/100440.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Leonardo</dc:creator>
            <guid>http://blogs.ugidotnet.org/leonardo/archive/2011/10/10/dependencyproperty-e-valore-di-default.aspx</guid>
            <pubDate>Mon, 10 Oct 2011 21:02:04 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/leonardo/comments/100440.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/leonardo/archive/2011/10/10/dependencyproperty-e-valore-di-default.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/leonardo/comments/commentRss/100440.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/leonardo/services/trackbacks/100440.aspx</trackback:ping>
        </item>
        <item>
            <title>Aruba e SMTP</title>
            <category>Aruba</category>
            <link>http://blogs.ugidotnet.org/leonardo/archive/2011/05/09/aruba-e-smtp.aspx</link>
            <description>&lt;p&gt;Inviare la posta da una casella @miodominio.it in hosting presso Aruba tramite un client di posta comporta alcune difficoltà, riporta il sito di aruba la seguente nota: &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Attenzione&lt;/strong&gt;: E' possibile che alcuni fornitori di connessioni internet (ad esempio Tele2, Tre, ecc.. ) NON consentano l'invio dei messaggi da indirizzi legati a domini registrati con Aruba utilizzando smtp.nomedominio.xxx: in questi casi il parametro da inserire potrebbe ad esempio essere smtp.tele2.it e relativa autenticazione oppure smtp.tre.it. Ovviamente per ulteriori dettagli fare riferimento specifico al proprio provider di connessione. &lt;/p&gt;
&lt;p&gt;Ma purtroppo non viene data direttamente una soluzione.&lt;/p&gt;
&lt;p&gt;Per risolvere il problema alla radice è sufficiente &lt;a href="http://vademecum.aruba.it/start/email/mail_ssl.asp"&gt;utilizzare il protocollo SSL&lt;/a&gt; per inviare (ma è possibile anche per leggere) la propria posta da connessioni come l'adsl di Alice. &lt;/p&gt;
&lt;p&gt;I dati da impostare nel proprio account sono: &lt;/p&gt;
&lt;p&gt;Server posta in arrivo:         pop3s.aruba.it&lt;br /&gt;
Server posta in uscita (SMTP):     smtps.aruba.it &lt;/p&gt;
&lt;p&gt;E' necessario impostare anche altre impostazioni: &lt;/p&gt;
&lt;p&gt;Spuntare "Il server della posta in uscita (SMTP) richiede l'autenticazione" e selezionare "Utilizza le stesse impostazioni del server della posta in arrivo" &lt;/p&gt;
&lt;p&gt;Nella scheda Impostazioni avanzate è necessario impostare la porta POP3 a 995, selezionare "Il server richiede una connessione crittografata (SSL)", impostare la porta SMTP a 465 e selezionare dal menù a discesa SSL come tipo di connessione crittografata.  &lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/050911_2104_ArubaeSMTP1.png" /&gt;&lt;/p&gt;
&lt;p&gt;Buona lettura della posta dal vostro client di posta preferito&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/leonardo/aggbug/100027.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Leonardo</dc:creator>
            <guid>http://blogs.ugidotnet.org/leonardo/archive/2011/05/09/aruba-e-smtp.aspx</guid>
            <pubDate>Mon, 09 May 2011 21:04:49 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/leonardo/comments/100027.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/leonardo/archive/2011/05/09/aruba-e-smtp.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/leonardo/comments/commentRss/100027.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/leonardo/services/trackbacks/100027.aspx</trackback:ping>
        </item>
        <item>
            <title>Da testo a string in C#</title>
            <link>http://blogs.ugidotnet.org/leonardo/archive/2011/04/15/incollare-del-testo-come-string-in-c.aspx</link>
            <description>&lt;p&gt;Durante il test di alcune classi che elaborano file XML ho avuto la necessità di convertire diversi file XML in stringhe C# per evitare di avere dipendenze da file esterni. &lt;/p&gt;
&lt;p&gt;Diciamo che convertire del testo in stringhe C# è un'operazione abbastanza noiosa perché comprende l'aggiunta di doppi apici per ogni riga e di slash aggiuntive, '\' diventa '\\' a meno di usare la keyword @. &lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/041511_1656_Incollarede1.png" /&gt; 	&lt;/p&gt;
&lt;p&gt;Ho quindi creato una piccola utility che permette di svolgere in modo rapido questa operazione, se vi serve potete scaricarla assieme al sorgente per adattare meglio il programma alle vostre esigenze &lt;/p&gt;
&lt;p&gt;&lt;a href="http://cid-7996fa031700f3fe.office.live.com/self.aspx/Pubblica/PasteTextAsCSharpString.rar"&gt;Scarica "Paste Text as C# String"&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/leonardo/aggbug/99958.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Leonardo</dc:creator>
            <guid>http://blogs.ugidotnet.org/leonardo/archive/2011/04/15/incollare-del-testo-come-string-in-c.aspx</guid>
            <pubDate>Fri, 15 Apr 2011 16:56:44 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/leonardo/comments/99958.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/leonardo/archive/2011/04/15/incollare-del-testo-come-string-in-c.aspx#feedback</comments>
            <slash:comments>7</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/leonardo/comments/commentRss/99958.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/leonardo/services/trackbacks/99958.aspx</trackback:ping>
        </item>
        <item>
            <title>Riconoscimento della scrittura in Windows Forms</title>
            <category>Windows 7</category>
            <category>Windows Forms</category>
            <link>http://blogs.ugidotnet.org/leonardo/archive/2011/01/25/riconoscimento-della-scrittura-in-windows-forms.aspx</link>
            <description>&lt;p&gt;Una novità passata perlopiù dietro le quinte di Windows 7 (HomePremium e versioni superiori) è l'inclusione dell'Assembly &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.ink.aspx"&gt;Microsoft.Ink&lt;/a&gt; (versione 6.1) nella &lt;a href="http://en.wikipedia.org/wiki/Global_Assembly_Cache"&gt;GAC&lt;/a&gt;. Prima era necessario installare l'&lt;a href="http://www.microsoft.com/downloads/en/details.aspx?familyid=69640b5c-0ee9-421e-8d5c-d40debee36c2&amp;amp;displaylang=en"&gt;SDK&lt;/a&gt; dedicato e distribuire assieme alla propria applicazione le relative librerie.
&lt;/p&gt;&lt;p&gt;Questo Assembly permette di utilizzare in applicazioni Windows Forms due nuovi controlli per supportare la scrittura ed il riconoscimento della calligrafia in maniera molto semplice: InkEdit ed InkPicture&lt;br /&gt;Rimando all'articolo &lt;a href="http://msdn.microsoft.com/en-us/magazine/cc163869.aspx"&gt;Add Support for Digital Ink to Your Windows Applications&lt;/a&gt; per una descrizione dell'uso di Microsoft.Ink e delle sue classi e controlli, anche se l'articolo fa riferimento alla versione dell'SDK e non a quella shippata con Windows 7, l'utilizzo è analogo.
&lt;/p&gt;&lt;p&gt;Purtroppo l'Assembly non include controlli per WPF e quindi se si vuole utilizzare il riconoscimento automatico della scrittura in WPF la strada più semplice rimane installare l'SDK dedicato allo sviluppo per Tablet PC.
&lt;/p&gt;&lt;p&gt;Per poter iniziare a utilizzare questo Assembly ho trovato molto utile l'Addin &lt;a href="http://visualstudiogallery.msdn.microsoft.com/36a6eb45-a7b1-47c3-9e85-09f0aef6e879/"&gt;Muse&lt;/a&gt; per Visual Studio 2010 che permette di visualizzare e filtrare gli Assembly nella GAC. Ricordo che per Visual Studio normalmente non mostra tutti gli Assembly della GAC ma solamente un sottoinsieme contenuto in C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0
&lt;/p&gt;&lt;p&gt;&lt;img src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/012511_1441_Riconoscime1.png" alt="" /&gt;
	&lt;/p&gt;&lt;p&gt;Una volta aggiunto il riferimento alla versione 6.1.0 di Microsoft.Ink sarà sufficiente scegliere Choose Items.. tramite tasto destro sulla barra degli strumenti e tramite Sfoglia cercare C:\Windows\assembly\GAC_32\Microsoft.Ink\6.1.0.0__31bf3856ad364e35\Microsoft.Ink.dll (per la versione a 32 bit) ovvero il percorso fisico dell'Assembly.
&lt;/p&gt;&lt;p&gt;&lt;img src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/012511_1441_Riconoscime2.png" alt="" /&gt;
	&lt;/p&gt;&lt;p&gt;Troveremo ora nella nostra casella degli strumenti i due nuovi controlli e trascinando il controllo InkEdit sul nostro forms avremo un RichEditControl evoluto che riconoscerà in automatico evenutuali scritte a mano (bisogna avere una tavoletta grafica o una schermo touch per poter scrivere sul controllo) e le convertirà senza scrivere una riga di codice in testo dopo qualche istante.
&lt;/p&gt;&lt;p&gt;
		&lt;img src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/012511_1441_Riconoscime3.png" alt="" /&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/leonardo/aggbug/99653.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Leonardo</dc:creator>
            <guid>http://blogs.ugidotnet.org/leonardo/archive/2011/01/25/riconoscimento-della-scrittura-in-windows-forms.aspx</guid>
            <pubDate>Tue, 25 Jan 2011 14:41:06 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/leonardo/comments/99653.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/leonardo/archive/2011/01/25/riconoscimento-della-scrittura-in-windows-forms.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/leonardo/comments/commentRss/99653.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/leonardo/services/trackbacks/99653.aspx</trackback:ping>
        </item>
        <item>
            <title>DataBinding di specifici oggetti in collezioni</title>
            <category>WPF</category>
            <link>http://blogs.ugidotnet.org/leonardo/archive/2011/01/21/databinding-di-specifici-oggetti-in-collezioni.aspx</link>
            <description>&lt;p&gt;Il &lt;a href="http://msdn.microsoft.com/it-IT/library/ms752347.aspx"&gt;DataBinding&lt;/a&gt; in WPF è sicuramente un elemento essenziale ed un primo cittadino ma supponiamo di avere una collezione generica come &lt;a href="http://msdn.microsoft.com/it-it/library/ms668604.aspx"&gt;ObservableCollection&amp;lt;T&amp;gt;&lt;/a&gt;, dove T è una nostra classe, per esempio la classica classe &lt;strong&gt;Person&lt;/strong&gt; contenente le proprietà &lt;em&gt;Nome&lt;/em&gt;, &lt;em&gt;Cognome&lt;/em&gt; e &lt;em&gt;Descrizione&lt;/em&gt;: &lt;strong&gt;&lt;em&gt;come facciamo a visualizzare tramite XAML nella nostra finestra la descrizione di Mario Rossi?&lt;/em&gt;&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/012111_2247_DataBinding1.png" /&gt;&lt;br /&gt;
&lt;em&gt;Diagramma della classe Person&lt;/em&gt; &lt;/p&gt;
&lt;p&gt;Questo scenario non è direttamente supportato in quanto la sintassi di Binding permette di &lt;a href="http://msdn.microsoft.com/it-IT/library/ms752300.aspx"&gt;specificare&lt;/a&gt; proprietà, sottoproprietà ed indicizzatori ma non selezionare oggetti in collezioni dato il valore di alcune loro proprietà. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NON&lt;/strong&gt; è possibile per esempio scrivere, supponendo come contesto dei dati la collezione (DataContext=Collezione), codice XAML di questo tipo &lt;/p&gt;
&lt;p&gt;&lt;span style="COLOR: blue"&gt;&lt;span style="FONT-FAMILY: Consolas; FONT-SIZE: 10pt"&gt;&amp;lt;&lt;span style="COLOR: #a31515"&gt;TextBlock&lt;span style="COLOR: red"&gt; Text&lt;span style="COLOR: blue"&gt;="{&lt;span style="COLOR: #a31515"&gt;Binding&lt;span style="COLOR: red"&gt; Path&lt;span style="COLOR: blue"&gt;='Name=[Mario],SurName=[Rossi],Path=[Description]'}" /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;per selezionare la descrizione dell'oggetto della collezione che ha come valore della proprietà &lt;em&gt;Name&lt;/em&gt; "Mario" e come valore della proprietà &lt;em&gt;SurName&lt;/em&gt; il valore "Rossi". &lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE: 12pt"&gt;&lt;strong&gt;Vediamo come risolvere questo problema: &lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Per semplicità ci limiteremo a supportare la selezione della proprietà &lt;strong&gt;ToString&lt;/strong&gt; che nel caso della classe &lt;strong&gt;Person&lt;/strong&gt; restituirà esattamente "Name Surname". &lt;/p&gt;
&lt;p&gt;Potremmo cioè poter scrivere &lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;span style="FONT-FAMILY: Consolas; COLOR: blue"&gt;&amp;lt;&lt;span style="COLOR: #a31515"&gt;TextBlock&lt;span style="COLOR: red"&gt; Text&lt;span style="COLOR: blue"&gt;="{&lt;span style="COLOR: #a31515"&gt;Binding&lt;span style="COLOR: red"&gt; Path&lt;span style="COLOR: blue"&gt;='Mario Rossi.Description'}" /&amp;gt;&lt;/span&gt;&lt;br /&gt;
 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
ma nulla vieta di estendere questo esempio per supportare una sintassi &lt;strong&gt;"XPath o Linq Like"&lt;/strong&gt;. &lt;/p&gt;
&lt;p&gt;Ricapitolando il DataBinding viene effettuato su Proprietà, dobbiamo perciò &lt;strong&gt;far credere&lt;/strong&gt; al motore di DataBinding di WPF che la nostra collezione espone una proprietà "Nome Cognome" che restituisce il nostro oggetto &lt;strong&gt;Person&lt;/strong&gt; selezionato. &lt;/p&gt;
&lt;p&gt;Questo problema è risolvibile estendendo tramite l'ereditarietà la classe &lt;strong&gt;ObservableCollection&amp;lt;T&amp;gt;&lt;/strong&gt; e implementando l'interfaccia &lt;a href="http://msdn.microsoft.com/it-it/library/system.componentmodel.icustomtypedescriptor.aspx"&gt;ICustomTypeDescriptor&lt;/a&gt; che per l'appunto permette di fornire informazioni dinamiche di tipo personalizzato come ad esempio le proprietà che espone una classe. &lt;/p&gt;
&lt;p&gt;Se la nostra classe non espone questa interfaccia il motore di DataBinding utilizzerà la &lt;a href="http://msdn.microsoft.com/it-it/library/ms173183(v=VS.100).aspx"&gt;Reflection&lt;/a&gt; per capire quali proprietà sono disponibili.&lt;br /&gt;
&lt;span style="TEXT-DECORATION: underline"&gt;&lt;strong&gt;&lt;em&gt;&lt;br /&gt;
NOTA BENE:&lt;/em&gt;&lt;/strong&gt;&lt;/span&gt; La Reflection è relativamente lenta e sebbene possano essere utilizzati internamente dei meccanismi di caching, per velocizzare questa operazione sono nati progetti come &lt;a href="http://www.codeproject.com/KB/cs/HyperPropertyDescriptor.aspx"&gt;HyperDescriptor&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;L'interfaccia &lt;strong&gt;ICustomTypeDescriptor&lt;/strong&gt; non è tra le più snelle del Framework ed infatti contiene 12 metodi ed è in genere preferibile derivare dalla classe &lt;a href="http://msdn.microsoft.com/it-it/library/system.componentmodel.customtypedescriptor.aspx"&gt;CustomTypeDescriptor&lt;/a&gt; ed effettuare solamente gli override di nostro interesse ma purtroppo la nostra ereditarietà è già stata "bruciata" con &lt;strong&gt;ObservableCollection&amp;lt;T&amp;gt;&lt;/strong&gt; e la nostra scelta deve ricadere obbligatoriamente sull'interfaccia. &lt;/p&gt;
&lt;p&gt;Anche se a prima vista questa interfaccia potrebbe intimorire a noi interessa veramente solo il metodo &lt;strong&gt;GetProperties&lt;/strong&gt;, possiamo quindi limitarci nell'implementazione degli altri metodi a ritornare i valori di default.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;u&gt;NOTA BENE:&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt; Per migliorare le prestazioni possiamo implementare un sistema di caching&lt;/p&gt;
&lt;p&gt;Il metodo &lt;strong&gt;GetProperties&lt;/strong&gt; dell'interfaccia &lt;strong&gt;ICustomTypeDescriptor&lt;/strong&gt; serve proprio a ritornare al Framework una collezione di proprietà, basterà quindi eseguire un ciclo su tutti gli elementi della collezione e ritornare per ogni elemento una proprietà chiamata con il metodo &lt;strong&gt;ToString&lt;/strong&gt; dell'oggetto e che contenga come valore l'oggetto stesso. &lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/012111_2247_DataBinding2.png" /&gt;&lt;br /&gt;
&lt;em&gt;Esempio di implementazione di GetProperties&lt;/em&gt; &lt;/p&gt;
&lt;p&gt;Le proprietà sono rappresentate dalla classe astratta &lt;a href="http://msdn.microsoft.com/it-it/library/system.componentmodel.propertydescriptor(v=VS.100).aspx"&gt;PropertyDescriptor&lt;/a&gt;, creiamo dunque una classe generica &lt;strong&gt;GenericPropertyDescriptor&amp;lt;T&amp;gt;&lt;/strong&gt; derivante da tale classe con un semplice costruttore che accetta in ingresso un oggetto T e che tramite gli override ad &lt;strong&gt;GetValue&lt;/strong&gt; ed &lt;strong&gt;SetValue&lt;/strong&gt; restituisce ed imposta il valore dell'oggetto. Per impostare il nome della proprietà la classe dovrà chiamare il costruttore della classe base passandogli in questo caso la stringa ritornata dal metodo &lt;strong&gt;ToString&lt;/strong&gt; dell'oggetto. &lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/012111_2247_DataBinding3.png" /&gt; &lt;/p&gt;
&lt;p&gt;&lt;span style="TEXT-DECORATION: underline"&gt;&lt;strong&gt;&lt;em&gt;NOTA BENE:&lt;/em&gt;&lt;/strong&gt;&lt;/span&gt; In uno scenario più flessibile probabilmente vorremmo poter passare una funzione agente sull'oggetto per determinare il nome della proprietà&lt;br /&gt;
&lt;span style="TEXT-DECORATION: underline"&gt;&lt;strong&gt;&lt;em&gt;ATTENZIONE: &lt;/em&gt;&lt;/strong&gt;&lt;/span&gt;Il nome della proprietà non dovrebbe contenere caratteri come il punto che sono interpretati come sottoproprietà dal motore di DataBinding di WPF &lt;/p&gt;
&lt;p&gt;La classe astratta &lt;strong&gt;PropertyDescriptor&lt;/strong&gt; definisce anche altre proprietà e metodi astratti che possiamo però semplicemente implementare con valori di default visto che l'importante è che la proprietà restituisca, imposti e si chiami in un certo modo. Rimando all'analisi del codice allegato per i dettagli. &lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/012111_2247_DataBinding4.png" /&gt;&lt;br /&gt;
&lt;em&gt;Diagramma della classe GenericPropertyDescriptor&amp;lt;T&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Il gioco è quasi ultimato, creiamo ora per provare le nostre classi una &lt;strong&gt;Window&lt;/strong&gt; con impostata essa stessa come &lt;strong&gt;DataContext&lt;/strong&gt; e con esposta tramite una proprietà la nostra &lt;strong&gt;ObservablePropertyCollection&amp;lt;Person&amp;gt;&lt;/strong&gt; popolata con alcune persone di esempio. &lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/012111_2247_DataBinding5.png" /&gt; &lt;/p&gt;
&lt;p&gt;Nelllo XAML corrispettivo aggiungiamo uno StackPanel che visualizzi tramite TextBlock le varie proprietà dell'elemento Mario Rossi &lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/012111_2247_DataBinding6.png" /&gt; &lt;/p&gt;
&lt;p&gt;E il gioco è fatto. Lo XAML risulta immediatamente intuitivo anche se a Design-Time purtroppo non visualizzerà alcun risultato. &lt;/p&gt;
&lt;p&gt;Nel codice allegato è presente inoltre un pulsante che dimostra come la soluzione proposta, a differenza di soluzioni a base di Converter, &lt;strong&gt;supporta la notifica delle singole proprietà dell'elemento selezionato&lt;/strong&gt;. &lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/012111_2247_DataBinding7.png" /&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href="http://cid-7996fa031700f3fe.office.live.com/self.aspx/Pubblica/ObservablePropertyCollection.zip"&gt;Codice Allegato&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Missione completata&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/leonardo/aggbug/99644.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Leonardo</dc:creator>
            <guid>http://blogs.ugidotnet.org/leonardo/archive/2011/01/21/databinding-di-specifici-oggetti-in-collezioni.aspx</guid>
            <pubDate>Fri, 21 Jan 2011 22:47:01 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/leonardo/comments/99644.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/leonardo/archive/2011/01/21/databinding-di-specifici-oggetti-in-collezioni.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/leonardo/comments/commentRss/99644.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/leonardo/services/trackbacks/99644.aspx</trackback:ping>
        </item>
        <item>
            <title>Sincronizziamo le animazioni con WPF</title>
            <category>WPF</category>
            <category>Expression Blend</category>
            <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>Fri, 07 Jan 2011 23:00:00 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/leonardo/comments/99607.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/leonardo/archive/2011/01/08/sincronizziamo-le-animazioni-con-wpf.aspx#feedback</comments>
            <slash:comments>5</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>NHibernate 3.0 RTM e Medium Trust</title>
            <category>NHibernate</category>
            <category>Aruba</category>
            <link>http://blogs.ugidotnet.org/leonardo/archive/2010/12/09/nhibernate-3.0-rtm-e-medium-trust.aspx</link>
            <description>&lt;p&gt;&lt;strong&gt;&lt;u&gt;Update 18/05/2011:&lt;/u&gt;&lt;/strong&gt; Scarica la versione di &lt;font face="Arial"&gt;&lt;a href="http://cid-7996fa031700f3fe.office.live.com/self.aspx/Pubblica/NHibernate-3.1.0.GA-LinFu-1.0.3.28303%20Medium%20Trust.zip"&gt;NHibernate-3.1.0.GA compilata con LinFu-1.0.3.28303&lt;/a&gt; compatibile con Medium Trust (leggere comunque il resto l'articolo per modificare il file di configurazione)&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://nhforge.org/Default.aspx"&gt;NHibernate 3.0&lt;/a&gt; è finalmente stato rilasciato in versione finale ma purtroppo presenta qualche problema con hosting Medium Trust (e quindi i siti in hosting su Aruba), vediamo come ricompilare il nostro ORM per renderlo finalmente funzionante anche in tali condizioni.&lt;/p&gt;
&lt;p&gt;Premetto che non dobbiamo modificare il sorgente di NHibernate ma semplicemente ricompilarlo con le nuove versioni delle librerie &lt;a href="http://code.google.com/p/linfu/"&gt;LinFu&lt;/a&gt; e &lt;a href="http://relinq.codeplex.com/"&gt;RemotionRelinq&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Scarichiamo: &lt;br /&gt;
- i &lt;a href="http://sourceforge.net/projects/nhibernate/files/NHibernate/3.0.0.GA/NHibernate-3.0.0.GA-src.zip/download"&gt;sorgenti di NHibernate 3.0GA&lt;/a&gt;  &lt;br /&gt;
- &lt;a href="http://linfu.googlecode.com/files/LinFu.DynamicProxy-1.031-release.zip"&gt;LinFu.DynamicProxy 1.031&lt;/a&gt; &lt;br /&gt;
- &lt;a href="https://www.re-motion.org/builds/RemotionRelinq_1.13.84.zip"&gt;RemotionRelinq  1.13.84&lt;/a&gt; (o comunque una versione successiva alla 1.13.63, le versioni con l’ultimo numero pari sono più stabili) &lt;br /&gt;
- &lt;a href="http://downloads.sourceforge.net/project/nant/nant/0.90/nant-0.90-bin.zip?r=&amp;amp;ts=1291674057&amp;amp;use_mirror=freefr"&gt;NAnt 0.90&lt;/a&gt; ci servirà per compilare il tutto&lt;/p&gt;
&lt;p&gt;Come primo passo scompattiamo i sorgenti di NHibernate e al loro interno scompattiamo NAnt che sarà quindi contenuto dentro alla cartella nant-0.90. &lt;br /&gt;
Creiamo ora il file “Build.bat” che ci permetterà di compilare tramite NAnt col seguente contenuto:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;@nant-0.90\bin\NAnt.exe -t:net-3.5 -D:project.config=release clean package &lt;br /&gt;
pause&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Prima di lanciare la compilazione però andiamo a copiare nella cartella lib/net/3.5 dei sorgenti di NHibernate il file LinFu.DynamicProxy.dll contenuto nel secondo download e il file Remotion.Data.Linq.dll contenuto nella cartella net-3.5/bin/release del terzo download.&lt;/p&gt;
&lt;p&gt;Lanciamo adesso il file Build.bat creato in precedenza e aspettando qualche secondo troveremo la cartella build che conterrà al suo interno il nostro NHibernate pronto per essere utilizzato in ambienti Medium Trust.&lt;/p&gt;
&lt;p&gt;NB: La compilazione della documentazione potrebbe fallire ma ciò non influisce sulla compilazione delle dll.&lt;/p&gt;
&lt;p&gt;Per poter utilizzare NHibernate in ambienti Medium Trust nel file di configurazione App.config dobbiamo ricordarci di specificare requirePermission="false" nelle sezioni di configurazione di NHibernate e Log4Net. Esempio:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;lt;configuration&amp;gt; &lt;br /&gt;
    &amp;lt;configSections&amp;gt; &lt;br /&gt;
        &amp;lt;section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" requirePermission="false"/&amp;gt; &lt;br /&gt;
        &amp;lt;section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" requirePermission="false"/&amp;gt; &lt;br /&gt;
    &amp;lt;/configSections&amp;gt; &lt;br /&gt;
...&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Mentre nella hibernate-configuration dobbiamo specificare reflection-optimizer use="false" e come proxyfactory Linfu&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;lt;hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"&amp;gt; &lt;br /&gt;
    &amp;lt;reflection-optimizer use="false"/&amp;gt; &lt;br /&gt;
    &amp;lt;session-factory&amp;gt; &lt;br /&gt;
        ... &lt;br /&gt;
        &amp;lt;property name="proxyfactory.factory_class"&amp;gt;NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu&amp;lt;/property&amp;gt; &lt;br /&gt;
        ... &lt;br /&gt;
    &amp;lt;/session-factory&amp;gt; &lt;br /&gt;
&amp;lt;/hibernate-configuration&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;That’s all!&lt;/p&gt;
&lt;p&gt;Voglio infine ringraziare &lt;a href="http://www.padovaboy.it/"&gt;Padova Boy&lt;/a&gt; per l'&lt;a href="http://www.padovaboy.it/blog/post.aspx?ID=32"&gt;eccellente articolo&lt;/a&gt; su come utilizzare NHibernate 2.1.2 in ambienti Medium Trust.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/leonardo/aggbug/99544.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Leonardo</dc:creator>
            <guid>http://blogs.ugidotnet.org/leonardo/archive/2010/12/09/nhibernate-3.0-rtm-e-medium-trust.aspx</guid>
            <pubDate>Thu, 09 Dec 2010 19:35:19 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/leonardo/comments/99544.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/leonardo/archive/2010/12/09/nhibernate-3.0-rtm-e-medium-trust.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/leonardo/comments/commentRss/99544.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/leonardo/services/trackbacks/99544.aspx</trackback:ping>
        </item>
        <item>
            <title>Scatenare gli eventi del Mouse o della Stilo in un Panel</title>
            <category>WPF</category>
            <link>http://blogs.ugidotnet.org/leonardo/archive/2010/10/05/scatenare-gli-eventi-del-mouse-o-della-stilo-in-un.aspx</link>
            <description>&lt;p&gt;Controlli &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.controls.panel.aspx"&gt;Panel&lt;/a&gt; come &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.controls.grid.aspx"&gt;Grid&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.controls.stackpanel.aspx"&gt;StackPanel&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.controls.canvas.aspx"&gt;Canvas&lt;/a&gt; e &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.controls.dockpanel.aspx"&gt;DockPanel&lt;/a&gt; (ma anche &lt;a href="http://msdn.microsoft.com/it-it/library/ms754152.aspx"&gt;altri&lt;/a&gt;) ereditano una serie di eventi del Mouse e della Stilo da &lt;a href="http://msdn.microsoft.com/it-it/library/ms590078.aspx"&gt;UIElement&lt;/a&gt; come &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.uielement.mousedown.aspx"&gt;MouseDown&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.uielement.mouseup.aspx"&gt;MouseUp&lt;/a&gt;, etc.. che però in genere non ricevono (vengono ricevuti solamente dagli elementi figli tramite il bubbling o il tunneling).&lt;/p&gt;
&lt;p&gt;Ad esempio il seguente codice XAML con la relativa funzione&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/Windows-Live-Writer/928c7088992c_C7D4/GridMouseDown_2.png"&gt;&lt;img style="BACKGROUND-IMAGE: none; BORDER-RIGHT-WIDTH: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; PADDING-TOP: 0px" title="GridMouseDown" border="0" alt="GridMouseDown" width="513" height="94" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/Windows-Live-Writer/928c7088992c_C7D4/GridMouseDown_thumb.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/Windows-Live-Writer/928c7088992c_C7D4/GridMouseDownFunction_5.png"&gt;&lt;img style="BACKGROUND-IMAGE: none; BORDER-RIGHT-WIDTH: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; PADDING-TOP: 0px" title="GridMouseDownFunction" border="0" alt="GridMouseDownFunction" width="465" height="64" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/Windows-Live-Writer/928c7088992c_C7D4/GridMouseDownFunction_thumb_1.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;non scatenerà mai l’evento e di conseguenza la MessageBox alla pressione del mouse.&lt;/p&gt;
&lt;p&gt;La documentazione della Grid purtroppo non ci è di grande aiuto per risolvere la situazione ma all’interno della documentazione della classe base &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.controls.panel.aspx"&gt;Panel&lt;/a&gt; troviamo la risposta:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Gli elementi Panel non ricevono eventi del mouse o dello stilo se non viene definito un &lt;/em&gt;&lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.controls.panel.background.aspx"&gt;&lt;em&gt;Background&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.Se è necessario gestire eventi del mouse o dello stilo ma non si desidera uno sfondo per Panel, utilizzare &lt;/em&gt;&lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.media.brushes.transparent.aspx"&gt;&lt;em&gt;Transparent&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Seguendo le istruzioni e inserendo un Background Transparent possiamo quindi abilitare la ricezione dei suddetti eventi e a far apparire il nostro messaggio.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/Windows-Live-Writer/928c7088992c_C7D4/GridMouseDownTransparent_2.png"&gt;&lt;img style="BACKGROUND-IMAGE: none; BORDER-RIGHT-WIDTH: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; PADDING-TOP: 0px" title="GridMouseDownTransparent" border="0" alt="GridMouseDownTransparent" width="512" height="96" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/Windows-Live-Writer/928c7088992c_C7D4/GridMouseDownTransparent_thumb.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NB:&lt;/strong&gt; Anche impostando Visibility a Collapsed vengono soppressi tali eventi&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/leonardo/aggbug/99318.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Leonardo</dc:creator>
            <guid>http://blogs.ugidotnet.org/leonardo/archive/2010/10/05/scatenare-gli-eventi-del-mouse-o-della-stilo-in-un.aspx</guid>
            <pubDate>Tue, 05 Oct 2010 12:39:00 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/leonardo/comments/99318.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/leonardo/archive/2010/10/05/scatenare-gli-eventi-del-mouse-o-della-stilo-in-un.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/leonardo/comments/commentRss/99318.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/leonardo/services/trackbacks/99318.aspx</trackback:ping>
        </item>
        <item>
            <title>Grafici con WPF e LINQ</title>
            <category>WPF</category>
            <category>Expression Blend</category>
            <category>LINQ</category>
            <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="http://cid-7996fa031700f3fe.skydrive.live.com/self.aspx/Pubblica/StepGraphSample4.0.zip"&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 13:26:19 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/leonardo/comments/99079.aspx</wfw:comment>
            <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>NHibernate 3</title>
            <category>NHibernate</category>
            <category>LINQ</category>
            <link>http://blogs.ugidotnet.org/leonardo/archive/2010/07/30/nhibernate-3.aspx</link>
            <description>&lt;p&gt;NHibernate, famoso ORM per .NET ha raggiunto lo stadio &lt;u&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt;&lt;/u&gt; RTM per la terza release. &lt;/p&gt;
&lt;p&gt;Tante le novità, quelle che ho trovato personalmente più utili sono la compatibilità con l’esecuzione Medium Trust in applicazioni web ASP.NET (niente più ricompilazioni con modifiche apposite ad ogni nuova versione, evviva!) ed un nuovo supporto a LINQ totalmente riscritto per una maggiore flessibilità.&lt;/p&gt;
&lt;p&gt;UPDATE: Purtroppo Medium Trust è supportato completamente in NHibernate.dll ma non in alcune librerie distribuite assieme alla versione finale. Per risolvere il problema leggere l'articolo &lt;a href="http://blogs.ugidotnet.org/leonardo/archive/2010/12/09/nhibernate-3.0-rtm-e-medium-trust.aspx"&gt;NHibernate 3 e Medium Trust&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Le modifiche da apportare per provare il supporto a LINQ della nuova versione sono solamente il cambio di un paio di righe di codice:&lt;/p&gt;
&lt;p&gt;NHibernate 2.x&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/NHibernate3_11A1/NHibernateOldLinq_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="NHibernateOldLinq" border="0" alt="NHibernateOldLinq" width="415" height="117" complete="" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/NHibernate3_11A1/NHibernateOldLinq_thumb.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;NHibernate 3.x&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/NHibernate3_11A1/NHibernateNewLinq_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="NHibernateNewLinq" border="0" alt="NHibernateNewLinq" width="410" height="81" complete="" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/NHibernate3_11A1/NHibernateNewLinq_thumb.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Il nuovo supporto rende inoltre possibile scrivere query come:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/NHibernate3_11A1/NHibernateLinqDateYear_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="NHibernateLinqDateYear" border="0" alt="NHibernateLinqDateYear" width="273" height="65" complete="" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/NHibernate3_11A1/NHibernateLinqDateYear_thumb.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Verrà prodotta in automatico la query &lt;em&gt;SELECT * FROM Events WHERE YEAR(Date)=2009&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NB:&lt;/strong&gt; La query è stata abbreviata sostituendo tutti i nomi dei campi con l’asterisco e inserendo direttamente l’anno che in realtà viene passato come parametro per renderla più corta e leggibile in questo articolo.&lt;/p&gt;
&lt;p&gt;Fino alla versione 2.x scrivere una query equivalente richiedeva l’utilizzo di codice SQL (nativo o tramite ICriteria) o HSQL.&lt;/p&gt;
&lt;p&gt;Potete scaricare questa nuova versione all’indirizzo &lt;a href="http://sourceforge.net/projects/nhibernate"&gt;http://sourceforge.net/projects/nhibernate&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/leonardo/aggbug/99019.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Leonardo</dc:creator>
            <guid>http://blogs.ugidotnet.org/leonardo/archive/2010/07/30/nhibernate-3.aspx</guid>
            <pubDate>Thu, 29 Jul 2010 23:14:59 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/leonardo/comments/99019.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/leonardo/archive/2010/07/30/nhibernate-3.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/leonardo/comments/commentRss/99019.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/leonardo/services/trackbacks/99019.aspx</trackback:ping>
        </item>
    </channel>
</rss>
