<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>WPF</title>
        <link>http://blogs.ugidotnet.org/leonardo/category/WPF.aspx</link>
        <description>Windows Presentation Foundation</description>
        <language>it</language>
        <copyright>Leonardo</copyright>
        <generator>Subtext Version 2.6.0.0</generator>
        <item>
            <title>WPF ed i 0.01 DPI mancanti</title>
            <link>http://blogs.ugidotnet.org/leonardo/archive/2023/03/24/wpf-ed-i-0-01-dpi-mancanti.aspx</link>
            <description>&lt;div&gt;Una caratteristica di WPF e' l'indipendenza dalla risoluzione, in particolare le immagini bitmap vengono automaticamente ridimensionate a &lt;span style="font-weight: bold;"&gt;96 DPI&lt;/span&gt;, valore di default storico di Windows.&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;Un'immagine 512x512 pixel a 72 DPI verra' quindi ridimensionata a 682.5 x 682.5 pixel circa. Questo succedera' indipendentemente dai DPI impostati nel sistema.&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;Utilizzando software professionali di editing di immagini come Adobe Photoshop, Gimp, etc.. e' possibile salvare i nostri capolavori con una risoluzione DPI specifica. Questa informazione (DpiX e DpiY) non modifica di fatto la dimensione in pixel dell'immagine, ma e' un attributo che viene salvato nei metadati del file e che puo' essere per esempio utile in fase di stampa... e in WPF.&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;Soddisfatti della nostra creazione, impostiamo quindi 96 DPI, certi che la nostra immagine non verra' &lt;span style="font-weight: bold;"&gt;mai e poi mai&lt;/span&gt; ridimensionata, ed aggiungiamo il seguente codice XAML alla nostra pagina:&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;&lt;img src="/images/blogs_ugidotnet_org/leonardo/dpi/xaml.png" style="width: 405px; height: 107px;" alt="" /&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;La nostra immagine e' stata inserita in un controllo Viewbox a scopo dimostrativo per &lt;span style="font-weight: bold;"&gt;evitare &lt;/span&gt;ridimensionamenti dovuti a limiti di spazio della &lt;span style="font-style: italic;"&gt;Window&lt;/span&gt;, selezionando il controllo &lt;span style="font-style: italic;"&gt;Image &lt;/span&gt;notiamo pero' qualcosa di strano nel pannello delle proprieta' di Visual Studio.&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;&lt;img src="/images/blogs_ugidotnet_org/leonardo/dpi/size.png" style="width: 284px; height: 189px;" alt="" /&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;L'immagine e' stata ridimensionata da WPF! Il nostro castello di carte e' cascato dalle fondamenta, manca circa 0.1 pixel per lato!&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;Questo puo' essere un problema trascurabile dal punto di vista grafico e prestazionale, ma cerchiamo ad ogni modo di &lt;span style="font-weight: bold;"&gt;capire&lt;/span&gt; cosa sta succendo.&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;Eseguendo il seguente codice C#&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;&lt;img src="/images/blogs_ugidotnet_org/leonardo/dpi/dpi.png" style="width: 273px; height: 42px;" alt="" /&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;scopriamo una triste realta' che stravolgera' presto tutte le nostre certezze. L'immagine e' di fatto a&lt;span style="font-weight: bold;"&gt; 96.01 DPI&lt;/span&gt;!&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;Adobe e' impazzita? un Easter Eggs di Gimp? Un complotto di Visual Studio?&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;Vediamo quindi di fare chiarezza, il formato &lt;span style="font-weight: bold;"&gt;PNG &lt;/span&gt;salva la risoluzione in un chunk chiamato &lt;span style="font-weight: bold;"&gt;Physical pixel dimensions&lt;/span&gt; (pHYs) composto da tre campi:&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;- Pixels per unit, x axis (4 bytes, unsigned integer)&lt;br /&gt;
- Pixels per unit, y axis (4 bytes, unsigned integer)&lt;br /&gt;
- Unit specifier (1 byte)&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;dove lo &lt;a href="https://www.w3.org/TR/png/#11pHYs"&gt;standard &lt;/a&gt;definisce come unita' valide solamente il metro o l'unita' indefinita. Il metro e' definito anche dal SI (Sistema Internazionale di unita' di misura), quindi a prima vista ha senso impiegarlo in uno standard al posto dei piedi o di altre unita' meno blasonate.&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;Utilizzando il metro stiamo quindi parlando di DPM (Dot per Meter). Un DPM equivale a 0.0254 DPI e sfortuna vuola che i campi prevedano solamente valori interi. &lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;3779 DPM equivalgono a circa 95.99 DPI mentre &lt;span style="font-weight: bold;"&gt;3780 &lt;/span&gt;a circa 96.01 DPI. &lt;span style="font-weight: bold;"&gt;Non &lt;/span&gt;esiste modo di specificare 96 DPI precisi, 0.01 DPI saranno sempre mancanti.&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span style="font-weight: bold; font-style: italic; text-decoration: underline;"&gt;NB&lt;/span&gt;: Molti software arrotondano i valori di DPI visualizzati, prestare quindi sempre la massima attenzione. &lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;Questo e' un bel &lt;span style="font-weight: bold;"&gt;dilemma &lt;/span&gt;per WPF, che di default usa proprio 96 DPI per le immagini, anche se a dire il vero non ho visto insurrezioni popolari in questi anni. &lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;Un software utile per analizzare (e modificare) i metadati dei file PNG e' &lt;a href="https://entropymine.com/jason/tweakpng/"&gt;TweakPNG&lt;/a&gt;, dove a prima vista i nostri sogni di perfezione DPI-eggianti tornano, per poi svanire all'amara realta' con un doppio click.&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;&lt;img src="/images/blogs_ugidotnet_org/leonardo/dpi/tweakpng.png" alt="" width="500" height="262" /&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span style="font-weight: bold; font-style: italic; text-decoration: underline;"&gt;NB:&lt;/span&gt; Questo problema non affligge il formato TIFF dove l'unita' di risoluzione puo' essere impostata in pollici (inch).&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;Per motivi di orgoglio piu' che tecnici non vogliamo pero' convertire tutte le nostre icone al formato TIFF, cosa possiamo dunque fare?&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;La matematica non lascio molto scampo, ma la fantasia ha ancora qualche carta da giocare.&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;Per risolvere il problema possiamo procedere in due modi:&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;- cancellare il &lt;span style="font-weight: bold;"&gt;chunk pHYs&lt;/span&gt; (che e' opzionale) se creato dall'app di editing grafico.&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;- impostare ad "unspecified units" l'unita' di misura. I valori X ed Y verranno ignorati.&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;Entrambe queste soluzioni forzeranno a 96 DPI esatti la risoluzione dell'immagine in WPF ed eviteranno qualsiasi ridimensionamente.&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;Personalmente preferisco utilizzare utility come &lt;a href="https://pnggauntlet.com/"&gt;PNGGauntlet &lt;/a&gt;che eliminano i chunk opzionali ed ottimizzano la dimensione del file (senza perdita di dati). Molto utile anche per evitare errori "App manifest references .. which is larger than the maximum image file size." durante il packaging di applicazioni UWP.&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;Avete mai notato che i 96 DPI esatti non esistono nei formati PNG e BMP? Dite la vostra nei commenti ed un saluto a tutti!&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span style="font-weight: bold; font-style: italic; text-decoration: underline;"&gt;NB:&lt;/span&gt; Gli stessi concetti posso applicarsi ad altre tecnologie basate su XAML come ad esempio UWP&lt;br /&gt;
&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/leonardo/aggbug/102627.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Leonardo</dc:creator>
            <guid>http://blogs.ugidotnet.org/leonardo/archive/2023/03/24/wpf-ed-i-0-01-dpi-mancanti.aspx</guid>
            <pubDate>Fri, 24 Mar 2023 01:18:53 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/leonardo/archive/2023/03/24/wpf-ed-i-0-01-dpi-mancanti.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/leonardo/comments/commentRss/102627.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/leonardo/services/trackbacks/102627.aspx</trackback:ping>
        </item>
        <item>
            <title>DependencyProperty e valore di default</title>
            <link>http://blogs.ugidotnet.org/leonardo/archive/2011/10/11/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/11/dependencyproperty-e-valore-di-default.aspx</guid>
            <pubDate>Tue, 11 Oct 2011 00:02:04 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/leonardo/archive/2011/10/11/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>DataBinding di specifici oggetti in collezioni</title>
            <link>http://blogs.ugidotnet.org/leonardo/archive/2011/01/22/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/22/databinding-di-specifici-oggetti-in-collezioni.aspx</guid>
            <pubDate>Sat, 22 Jan 2011 00:47:01 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/leonardo/archive/2011/01/22/databinding-di-specifici-oggetti-in-collezioni.aspx#feedback</comments>
            <slash:comments>1</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>
            <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>Scatenare gli eventi del Mouse o della Stilo in un Panel</title>
            <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 15:39:00 GMT</pubDate>
            <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>
            <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 (ottava parte) &amp;ndash; Cubo multi-texture da codice</title>
            <link>http://blogs.ugidotnet.org/leonardo/archive/2010/04/02/wpf-e-il-3d-ottava-parte-cubo-multi-texture-codice.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;Nel &lt;a href="http://blogs.ugidotnet.org/leonardo/archive/2010/02/19/wpf-e-il-3d-settima-parte-cubo-multi-texture.aspx"&gt;precedente articolo&lt;/a&gt; abbiamo visto come creare un cubo multi-texture (ovvero con materiali diversi su ogni faccia) utilizzando esclusivamente XAML, il risultato era un codice abbastanza prolisso e poco riutilizzabile. Realizziamo ora un componente che sia &lt;strong&gt;semplice&lt;/strong&gt; da utilizzare, alla fine dovremmo poter scrivere solamente il seguente 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="xamlCode" border="0" alt="xamlCode" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3DottavaparteCubomultitexturedacod_148F8/xamlCode_c6058ba6-ee17-4a7e-a5e0-44e2236f4908.png" width="545" height="134" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;NB: Per poter aggiungere alle proprietà il supporto al Binding dobbiamo utilizzare nel componente le Dependency Property&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Il MultiTexturedCube essendo un oggetto 3D per poter essere visualizzato dovrà essere inserito tra i &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.controls.viewport3d.children.aspx"&gt;Children&lt;/a&gt; (di tipo &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.media.media3d.visual3d.aspx"&gt;Visual3D&lt;/a&gt;) di un &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.controls.viewport3d.aspx"&gt;ViewPort3D&lt;/a&gt;, deriviamo quindi da &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.media.media3d.modelvisual3d.aspx"&gt;ModelVisual3D&lt;/a&gt; il nostro componente.&lt;/p&gt;  &lt;p&gt;Il nostro componente avrà necessità di sapere come costruire il cubo quindi dovrà contenere i modelli 3D (&lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.media.media3d.geometrymodel3d.aspx"&gt;GeometryModel3D&lt;/a&gt;) delle facce del cubo da visualizzare. I  modelli come visto nei precedenti articoli avranno una geometria che sarà inizializzata nel costruttore del componente in modo analogo a come avevamo fatto tramite XAML, ecco un esempio di codice:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3DottavaparteCubomultitexturedacod_148F8/meshCode_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="meshCode" border="0" alt="meshCode" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3DottavaparteCubomultitexturedacod_148F8/meshCode_thumb.png" width="550" height="133" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Infine per poter essere visualizzati assieme i modelli dovranno essere raggruppati tramite un &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.media.media3d.model3dgroup.aspx"&gt;Model3DGroup&lt;/a&gt; che verrà impostato nella proprietà Content del componente, ereditata da ModelVisual3D.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3DottavaparteCubomultitexturedacod_148F8/Model3DGroup_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="Model3DGroup" border="0" alt="Model3DGroup" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3DottavaparteCubomultitexturedacod_148F8/Model3DGroup_thumb.png" width="298" height="135" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Per poter impostare il materiale da XAML creiamo le varie Dependency Property inserendo come &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.propertychangedcallback.aspx"&gt;PropertyChangedCallback&lt;/a&gt; un evento che modifichi il materiale della corrispondente faccia. Questo “giro” è necessario in quanto tramite Dependency Property non è possibile esporre la proprietà di un altro oggetto (il modello 3D) direttamente.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3DottavaparteCubomultitexturedacod_148F8/DependencyProperty_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="DependencyProperty" border="0" alt="DependencyProperty" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3DottavaparteCubomultitexturedacod_148F8/DependencyProperty_thumb.png" width="550" height="253" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Il diagramma finale del nostro componente è il seguente:&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="MultiTexturedCubeDiagram" border="0" alt="MultiTexturedCubeDiagram" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3DottavaparteCubomultitexturedacod_148F8/MultiTexturedCubeDiagram_b421db6a-21ee-4713-a878-fd7f72a22e9a.png" width="464" height="419" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Riutilizzare il componente è molto semplice, è possibile creare ad esempio un dado derivando da MultiTexturedCube e assegnando nel costruttore i materiali contenenti i numeri del dado, in questo modo non sarà neppure necessario specificare tutti i materiali di volta in volta. Non è difficile neppure estendere il componente, continuando l’esempio del dado è possibile aggiungere la proprietà Numero che una volta impostata applica un’animazione alla proprietà Trasform che ruota il dado con il numero scelto verso l’alto.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://cid-7996fa031700f3fe.skydrive.live.com/self.aspx/Pubblica/WPFMultiTexturedCube3D-2.zip"&gt;Scarica il codice sorgente dell’articolo&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;NB: Nel codice dell’articolo è presente solamente il codice per una singola faccia ove è analogo per le rimanenti facce.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/leonardo/aggbug/98302.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Leonardo</dc:creator>
            <guid>http://blogs.ugidotnet.org/leonardo/archive/2010/04/02/wpf-e-il-3d-ottava-parte-cubo-multi-texture-codice.aspx</guid>
            <pubDate>Fri, 02 Apr 2010 01:54:34 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/leonardo/archive/2010/04/02/wpf-e-il-3d-ottava-parte-cubo-multi-texture-codice.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/leonardo/comments/commentRss/98302.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/leonardo/services/trackbacks/98302.aspx</trackback:ping>
        </item>
        <item>
            <title>Visualizzare al volo un array in una griglia</title>
            <link>http://blogs.ugidotnet.org/leonardo/archive/2010/02/22/visualizzare-al-volo-un-array-in-una-griglia.aspx</link>
            <description>&lt;p&gt;I controlli griglia di Windows Forms (&lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.forms.datagridview(VS.80).aspx"&gt;DataGridView&lt;/a&gt;) e WPF (DataGrid) non permettono di visualizzare “al volo” correttamente insiemi di elementi di tipi come int, float, string, etc.. perché non espongono il loro valore come una proprietà.&lt;/p&gt;
&lt;p&gt;Il seguente codice per esempio&lt;/p&gt;
&lt;div style="FONT-FAMILY: courier new; BACKGROUND: white; COLOR: black; FONT-SIZE: 10pt"&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;int&lt;/span&gt;[] &lt;span style="COLOR: #010001"&gt;myArray&lt;/span&gt; = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; &lt;span style="COLOR: blue"&gt;int&lt;/span&gt;[] { 1, 2, 3 };&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #010001"&gt;dataGrid1&lt;/span&gt;.&lt;span style="COLOR: #010001"&gt;ItemsSource&lt;/span&gt; = &lt;span style="COLOR: #010001"&gt;myArray&lt;/span&gt;;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;mostrerà solamente una griglia con tre righe vuote.&lt;/p&gt;
&lt;p&gt;Una lista di elementi di tipo string invece visualizzerà nella griglia solamente le lunghezze delle stringhe ma non il loro contenuto proprio perché la prima proprietà della classe string è Lenght. Molto spesso però la necessità è di visualizzare l’effettivo testo della stringa.&lt;/p&gt;
&lt;p&gt;Per ovviare rapidamente al problema possiamo creare un &lt;a href="http://msdn.microsoft.com/it-it/library/bb383977.aspx"&gt;Extension Method&lt;/a&gt; che aggiungerà a tutti gli insiemi enumerabili (di tipo &lt;a href="http://msdn.microsoft.com/it-it/library/78dfe2yb.aspx"&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/a&gt;) un metodo chiamato ToPropertyData che ritornerà i valori degli elementi dell’insieme esposti come proprietà di un oggetto contenitore chiamato DataContainer.&lt;/p&gt;
&lt;p&gt;Per visualizzare correttamente un array di int sarà necessario solamente scrivere il codice&lt;/p&gt;
&lt;div style="FONT-FAMILY: courier new; BACKGROUND: white; COLOR: black; FONT-SIZE: 10pt"&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;int&lt;/span&gt;[] &lt;span style="COLOR: #010001"&gt;myArray&lt;/span&gt; = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; &lt;span style="COLOR: blue"&gt;int&lt;/span&gt;[] { 1, 2, 3 };&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;&lt;span style="COLOR: #010001"&gt;dataGrid1&lt;/span&gt;.&lt;span style="COLOR: #010001"&gt;ItemsSource&lt;/span&gt; = &lt;span style="COLOR: #010001"&gt;myArray&lt;/span&gt;.&lt;span style="COLOR: #010001"&gt;ToPropertyData&lt;/span&gt;();&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;ed il gioco è fatto.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/Visualizzarealvolounarrayinunagriglia_70/DataGridArray_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="DataGridArray" border="0" alt="DataGridArray" width="250" height="120" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/Visualizzarealvolounarrayinunagriglia_70/DataGridArray_thumb.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;il codice dell’Extension Method:&lt;/p&gt;
&lt;div style="FONT-FAMILY: courier new; BACKGROUND: white; COLOR: black; FONT-SIZE: 10pt"&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;static&lt;/span&gt; &lt;span style="COLOR: blue"&gt;class&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;ExtensionMethodHelper&lt;/span&gt;
&lt;p style="MARGIN: 0px"&gt;{&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;    &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;class&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;DataContainer&lt;/span&gt;&amp;lt;&lt;span style="COLOR: #010001"&gt;T&lt;/span&gt;&amp;gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;    {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: #010001"&gt;T&lt;/span&gt; &lt;span style="COLOR: #010001"&gt;data&lt;/span&gt;;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: #010001"&gt;T&lt;/span&gt; &lt;span style="COLOR: #010001"&gt;Data&lt;/span&gt; { &lt;span style="COLOR: blue"&gt;get&lt;/span&gt; { &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; &lt;span style="COLOR: #010001"&gt;data&lt;/span&gt;; } }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: #010001"&gt;DataContainer&lt;/span&gt;(&lt;span style="COLOR: #010001"&gt;T&lt;/span&gt; &lt;span style="COLOR: #010001"&gt;value&lt;/span&gt;)&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            &lt;span style="COLOR: blue"&gt;this&lt;/span&gt;.&lt;span style="COLOR: #010001"&gt;data&lt;/span&gt; = &lt;span style="COLOR: #010001"&gt;value&lt;/span&gt;;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;    }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;    &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;    &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; Convert array of data into array of DataContainer class that expose data as property&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;    &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;    &lt;span style="COLOR: gray"&gt;///&lt;/span&gt;&lt;span style="COLOR: green"&gt; &lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;remarks&amp;gt;&lt;/span&gt;&lt;span style="COLOR: green"&gt;Useful with DataGrid(View)&lt;/span&gt;&lt;span style="COLOR: gray"&gt;&amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;    &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;static&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="COLOR: #2b91af"&gt;DataContainer&lt;/span&gt;&amp;lt;&lt;span style="COLOR: #010001"&gt;TSource&lt;/span&gt;&amp;gt;&amp;gt; &lt;span style="COLOR: #010001"&gt;ToPropertyData&lt;/span&gt;&amp;lt;&lt;span style="COLOR: #010001"&gt;TSource&lt;/span&gt;&amp;gt;(&lt;span style="COLOR: blue"&gt;this&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="COLOR: #010001"&gt;TSource&lt;/span&gt;&amp;gt; &lt;span style="COLOR: #010001"&gt;source&lt;/span&gt;)&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;    {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="COLOR: #2b91af"&gt;DataContainer&lt;/span&gt;&amp;lt;&lt;span style="COLOR: #010001"&gt;TSource&lt;/span&gt;&amp;gt;&amp;gt; &lt;span style="COLOR: #010001"&gt;result&lt;/span&gt; = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="COLOR: #2b91af"&gt;DataContainer&lt;/span&gt;&amp;lt;&lt;span style="COLOR: #010001"&gt;TSource&lt;/span&gt;&amp;gt;&amp;gt;();&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;foreach&lt;/span&gt; (&lt;span style="COLOR: blue"&gt;var&lt;/span&gt; &lt;span style="COLOR: #010001"&gt;item&lt;/span&gt; &lt;span style="COLOR: blue"&gt;in&lt;/span&gt; &lt;span style="COLOR: #010001"&gt;source&lt;/span&gt;)&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        {&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;            &lt;span style="COLOR: #010001"&gt;result&lt;/span&gt;.&lt;span style="COLOR: #010001"&gt;Add&lt;/span&gt;(&lt;span style="COLOR: blue"&gt;new&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;DataContainer&lt;/span&gt;&amp;lt;&lt;span style="COLOR: #010001"&gt;TSource&lt;/span&gt;&amp;gt;(&lt;span style="COLOR: #010001"&gt;item&lt;/span&gt;));&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;        &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; &lt;span style="COLOR: #010001"&gt;result&lt;/span&gt;;&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;    }&lt;/p&gt;
&lt;p style="MARGIN: 0px"&gt;}&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;questo Extension Method è valido solamente per visualizzare i valori in una griglia in modo rapido (ad esempio per controllare determinati valori in fase di debug) ma non supporta la sincronizzazione con l’insieme di origine (nell’esempio l’insieme myArray).&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/leonardo/aggbug/98069.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Leonardo</dc:creator>
            <guid>http://blogs.ugidotnet.org/leonardo/archive/2010/02/22/visualizzare-al-volo-un-array-in-una-griglia.aspx</guid>
            <pubDate>Mon, 22 Feb 2010 01:11:06 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/leonardo/archive/2010/02/22/visualizzare-al-volo-un-array-in-una-griglia.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/leonardo/comments/commentRss/98069.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/leonardo/services/trackbacks/98069.aspx</trackback:ping>
        </item>
        <item>
            <title>WPF e il 3D (settima parte) &amp;ndash; Cubo multi-texture</title>
            <link>http://blogs.ugidotnet.org/leonardo/archive/2010/02/19/wpf-e-il-3d-settima-parte-cubo-multi-texture.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;Nel &lt;a href="http://blogs.ugidotnet.org/leonardo/archive/2009/06/22/wpf-e-il-3d-sesta-parte.aspx"&gt;precedente articolo&lt;/a&gt; abbiamo visto come colorare un oggetto 3D ed abbiamo trattato le problematiche di mappatura con oggetti 2D chiamati texture.&lt;/p&gt;  &lt;p&gt;In questo articolo prendiamo invece in considerazione l’applicazione di più materiali, uno per faccia, ad un unico modello 3D: in questo caso un cubo che &lt;a href="http://blogs.ugidotnet.org/leonardo/archive/2009/04/07/wpf-e-il-3d-quinta-parte.aspx"&gt;abbiamo già visto&lt;/a&gt; come creare.&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="Multi-textured cube" border="0" alt="Multi-textured cube" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3DsettimaparteCubomultitexture_BBD2/Multi-textured%20cube_e05295a5-b25d-4f74-a94d-293b9ea0d8e7.png" width="300" height="200" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;WPF permette di associare ad ogni &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.media.media3d.geometrymodel3d.aspx"&gt;GeometryModel3D&lt;/a&gt; un solo materiale per la vista frontale ed un solo materiale per la vista di retro, per superare questa limitazione possiamo seguire diverse strade:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;- Creare una texture unica formata dall’unione delle varie texture e mappare ogni punto di conseguenza&lt;/strong&gt;  &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3DsettimaparteCubomultitexture_BBD2/Texture_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="Texture" border="0" alt="Texture" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3DsettimaparteCubomultitexture_BBD2/Texture_thumb.png" width="452" height="74" /&gt;&lt;/a&gt;     &lt;br /&gt;&lt;em&gt;Esempio di texture unica per creare un effetto multi-texture&lt;/em&gt; &lt;/p&gt;  &lt;p&gt;Questo stratagemma seppur altamente performante comporta difficoltà nel simulare materiali “dinamici” come ad esempio video o materiali con applicati dei &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.media.visualbrush.aspx"&gt;VisualBrush&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;- Suddividere il modello 3D in tante parti&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Questa è la soluzione che offre più flessibilità in quanto rende possibile cambiare singolarmente i vari materiali.&lt;/p&gt;  &lt;p&gt;Un esempio di cubo 3D suddiviso in più parti (suddiviso nelle 6 facce) è il seguente:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3DsettimaparteCubomultitexture_BBD2/sampleXamlMultiTexturedCube_6.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="sampleXamlMultiTexturedCube" border="0" alt="sampleXamlMultiTexturedCube" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3DsettimaparteCubomultitexture_BBD2/sampleXamlMultiTexturedCube_thumb_2.png" width="550" height="322" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Come si può notare all’interno di un singolo &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.media.media3d.modelvisual3d.aspx"&gt;ModelVisual3D&lt;/a&gt; (che dovrà poi essere inserito all’interno di un &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.controls.viewport3d.aspx"&gt;Viewport3D&lt;/a&gt;) è definito un &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.media.media3d.model3dgroup.aspx"&gt;Model3DGroup&lt;/a&gt; che contiene i vari pezzi (&lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.media.media3d.geometrymodel3d.aspx"&gt;GeometryModel3D&lt;/a&gt;) con applicati diversi materiali. I dati veri e propri sono inseriti all’interno della sezione Resource del ViewPort3D per questioni di compattezza e riutilizzo.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3DsettimaparteCubomultitexture_BBD2/Resource_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="Resource" border="0" alt="Resource" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/WPFeil3DsettimaparteCubomultitexture_BBD2/Resource_thumb.png" width="550" height="375" /&gt;&lt;/a&gt;     &lt;br /&gt;&lt;em&gt;Una parte dei dati del cubo 3D all’interno della sezione Resource del Viewport3D&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Questa soluzione comporta però un codice Xaml molto prolisso e poco riutilizzabile, vedremo nel prossimo articolo come creare un componente altamente riutilizzabile ed estendibile ereditando dalla classe ModelVisual3D.   &lt;/p&gt;  &lt;p&gt;&lt;a href="http://cid-7996fa031700f3fe.skydrive.live.com/self.aspx/Pubblica/WPFMultiTexturedCube3D.zip"&gt;Scarica il codice sorgente dell’articolo&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/leonardo/aggbug/98062.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Leonardo</dc:creator>
            <guid>http://blogs.ugidotnet.org/leonardo/archive/2010/02/19/wpf-e-il-3d-settima-parte-cubo-multi-texture.aspx</guid>
            <pubDate>Fri, 19 Feb 2010 17:32:20 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/leonardo/archive/2010/02/19/wpf-e-il-3d-settima-parte-cubo-multi-texture.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/leonardo/comments/commentRss/98062.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/leonardo/services/trackbacks/98062.aspx</trackback:ping>
        </item>
        <item>
            <title>Massimizzare le finestre sopra la Barra delle applicazioni in Windows 7</title>
            <link>http://blogs.ugidotnet.org/leonardo/archive/2009/10/16/massimizzare-le-finestre-sopra-la-barra-delle-applicazioni-in-windows.aspx</link>
            <description>&lt;p&gt;In Windows XP esisteva nelle &lt;strong&gt;Proprietà della barra delle applicazioni e del menù Start&lt;/strong&gt; un’opzione chiamata &lt;strong&gt;Sempre in primo piano&lt;/strong&gt; che poteva essere deselezionata e permetteva alle applicazioni massimizzate di poter essere davanti anche alla barra delle applicazioni.&lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="2" width="526"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="275"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="ProprietaBarraApplicazioniWXp" border="0" alt="ProprietaBarraApplicazioniWXp" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/MassimizzarelefinestresopralaBarradellea_D25B/ProprietaBarraApplicazioniWXp_f96c4afd-3262-47fa-b59f-0029aef3a535.png" width="275" height="310" /&gt;&lt;/td&gt;        &lt;td valign="top" width="249"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="ProprietaBarraApplicazioniW7" border="0" alt="ProprietaBarraApplicazioniW7" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/MassimizzarelefinestresopralaBarradellea_D25B/ProprietaBarraApplicazioniW7_fcc60704-d556-46dd-8aa3-9611a51678f8.png" width="275" height="300" /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="275"&gt;&lt;em&gt;Windows Xp&lt;/em&gt;&lt;/td&gt;        &lt;td valign="top" width="249"&gt;&lt;em&gt;Windows 7&lt;/em&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;In Windows 7 questa opzione è purtroppo scomparsa ed ora le finestre appaiono tutte inevitabilmente sotto alla trasparenza della barra delle applicazioni:&lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="2" width="429"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="211"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="wxp" border="0" alt="wxp" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/MassimizzarelefinestresopralaBarradellea_D25B/wxp_aff7fd5c-d3a2-413b-8860-14c66933c6a1.png" width="155" height="62" /&gt;&lt;/td&gt;        &lt;td valign="top" width="216"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="w7" border="0" alt="w7" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/MassimizzarelefinestresopralaBarradellea_D25B/w7_879ca953-8e57-4934-b586-506ab0a37416.png" width="155" height="62" /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="211"&gt;&lt;em&gt;Windows Xp con l’opzione Sempre in primo piano disabilitata&lt;/em&gt;&lt;/td&gt;        &lt;td valign="top" width="216"&gt;         &lt;p align="center"&gt;&lt;em&gt;Windows 7&lt;/em&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p&gt;A volte però si può avere la necessità di ricreare il comportamento disponibile in Windows Xp nella propria applicazione.&lt;/p&gt;  &lt;p&gt;Visto che l’opzione non esiste più si può ricorrere ad un piccolo “trucco” chiamando la seguente funzione all’avvio del proprio programma:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/MassimizzarelefinestresopralaBarradellea_D25B/codes_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="codes" border="0" alt="codes" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/MassimizzarelefinestresopralaBarradellea_D25B/codes_thumb.png" width="575" height="301" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p /&gt;  &lt;p&gt;Il codice sostanzialmente consiste nell’impostare tramite alcune chiamate di Windows uno stile non in primo piano per la Shell_TrayWnd ovvero la TaskBar o barra delle applicazioni.&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="W7Over" border="0" alt="W7Over" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/MassimizzarelefinestresopralaBarradellea_D25B/W7Over_c2e0f4d7-e3d2-427a-a4f2-02e08da36198.png" width="209" height="110" /&gt;&lt;/p&gt;  &lt;p&gt;La soluzione però non è valida quando la finestra viene massimizzata dall’utente, a differenza di Windows XP infatti le finestre rimangono sopra alla barra delle applicazioni.&lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="2" width="550"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="550"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="MaximizedW7" border="0" alt="MaximizedW7" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/MassimizzarelefinestresopralaBarradellea_D25B/MaximizedW7_cc7a82fe-61b4-4863-beaa-4d301d56026e.png" width="550" height="368" /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="550"&gt;&lt;em&gt;Finestre massimizzate in Windows 7, nonostante il codice precedente le finestre massimizzate non copriranno la barra delle applicazioni&lt;/em&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;Una &lt;strong&gt;soluzione migliore&lt;/strong&gt; e più semplice per estendere a tutto schermo le finestre massimizzate è &lt;strong&gt;disabilitare il MaximizeBox&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;Impostando a &lt;strong&gt;false&lt;/strong&gt; il &lt;strong&gt;MaximizeBox&lt;/strong&gt; (in applicazioni Windows Forms) e massimizzando da codice con l’istruzione &lt;strong&gt;WindowState = FormWindowState.Maximized&lt;/strong&gt; le finestre appariranno infatti a pieno schermo massimizzate.&lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="2" width="550"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="550"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="maximized" border="0" alt="maximized" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/MassimizzarelefinestresopralaBarradellea_D25B/maximized_a63d7056-644e-45c8-8f76-d9f72db63d85.png" width="550" height="344" /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="550"&gt;&lt;em&gt;Finestra massimizzata via codice in Windows 7 e con la proprietà MaximizeBox = False, la barra delle applicazioni risulta coperta.&lt;/em&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;Purtroppo con applicazioni WPF non si dispone di una proprietà MaximizeBox ma si può ovviare impostando &lt;strong&gt;WindowStyle&lt;/strong&gt; a &lt;strong&gt;None&lt;/strong&gt; “perdendo” però la barra del titolo dell’applicazione.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/leonardo/aggbug/97269.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Leonardo</dc:creator>
            <guid>http://blogs.ugidotnet.org/leonardo/archive/2009/10/16/massimizzare-le-finestre-sopra-la-barra-delle-applicazioni-in-windows.aspx</guid>
            <pubDate>Fri, 16 Oct 2009 17:00:09 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/leonardo/archive/2009/10/16/massimizzare-le-finestre-sopra-la-barra-delle-applicazioni-in-windows.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/leonardo/comments/commentRss/97269.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/leonardo/services/trackbacks/97269.aspx</trackback:ping>
        </item>
    </channel>
</rss>