<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.6.0.0</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>Water in Wine with C#</title>
            <category>.NET</category>
            <link>http://blogs.ugidotnet.org/leonardo/archive/2023/11/24/water-in-wine-csharp-array-cast.aspx</link>
            <description>&lt;div&gt;A common need when working with images is to convert arrays containing pixels from a type to another.&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;For example an uint[] to byte[] conversion is common, but very slow and memory intensive.&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;Here the fastest method I developed for real-time applications:&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;img src="/images/blogs_ugidotnet_org/leonardo/arrayCast.png" width="499" height="270" alt="" /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;The code is unsafe (additional testing recommended) and may not work with future CLR Runtimes, but it's pretty readable and fast.&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;In few words the code is changing the type of the array by overwriting the CLR Method Table and then resizing the array in a similiar way. A new array (of the desired type) pointing to the original one is then returned. The original data is never copied and this makes this method very fast to execute.&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;Here how to use the function CastArray:&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/arrayCastDemo.png" style="width: 368px; height: 80px;" alt="" /&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;An array containing a 4K 32 bit image can be casted with a great speedup compared to an Array copy with standard solutions such as Buffer.BlockCopy.&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;The drawback is that now we have overwritten the original array size and if we use the original array, we should manually ensure that we are not reading over it's end.&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;The byte[] is actually a reference array and changing it will change the uint[] (&lt;span class="HwtZe" lang="en"&gt;&lt;span class="jCAhz ChMk0b"&gt;&lt;span class="ryNqvb"&gt;and the opposite), but this can avoid further casts.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span class="HwtZe" lang="en"&gt;&lt;span class="jCAhz ChMk0b"&gt;&lt;span class="ryNqvb"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span class="HwtZe" lang="en"&gt;&lt;span class="jCAhz ChMk0b"&gt;&lt;span class="ryNqvb"&gt;Note: As I already done in the &lt;a href="https://electro-logic.blogspot.com"&gt;electro-logic&lt;/a&gt; blog, new posts starting from this one are only in &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="HwtZe" lang="en"&gt;&lt;span class="jCAhz ChMk0b"&gt;&lt;span class="ryNqvb"&gt;English &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="HwtZe" lang="en"&gt;&lt;span class="jCAhz ChMk0b"&gt;&lt;span class="ryNqvb"&gt;to enable more people to read them, but you can still contact me or leave a comment in Italian if you prefer.&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span class="HwtZe" lang="en"&gt;&lt;span class="jCAhz ChMk0b"&gt;&lt;span class="ryNqvb"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span class="HwtZe" lang="en"&gt;&lt;span class="jCAhz ChMk0b"&gt;&lt;span class="ryNqvb"&gt;That's all for today&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/leonardo/aggbug/102638.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Leonardo</dc:creator>
            <guid>http://blogs.ugidotnet.org/leonardo/archive/2023/11/24/water-in-wine-csharp-array-cast.aspx</guid>
            <pubDate>Fri, 24 Nov 2023 21:51:16 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/leonardo/archive/2023/11/24/water-in-wine-csharp-array-cast.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/leonardo/comments/commentRss/102638.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/leonardo/services/trackbacks/102638.aspx</trackback:ping>
        </item>
        <item>
            <title>WPF ed i 0.01 DPI mancanti</title>
            <category>WPF</category>
            <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>Quando il muro rimane bianco..</title>
            <category>Community</category>
            <link>http://blogs.ugidotnet.org/leonardo/archive/2018/03/13/Quando-il-muro-rimane-bianco.aspx</link>
            <description>Segnalo, grazie alla collaborazione di &lt;a href="http://blogs.ugidotnet.org/topics"&gt;Mauro Servienti&lt;/a&gt; un piccolo consiglio per chi posta su UGI &lt;span style="font-weight: bold;"&gt;tramite l'interfaccia Web&lt;/span&gt; dell'amato/odiato SubText.&lt;br /&gt;
&lt;br /&gt;
Nelle opzioni avanzate ricordatevi sempre di spuntare sia "&lt;span style="font-weight: bold;"&gt;Syndicate on Main Feed&lt;/span&gt;" che "&lt;span style="font-weight: bold;"&gt;Include in Aggregated Site&lt;/span&gt;" per apparire sul muro di UGI e nei feed RSS. &lt;br /&gt;
&lt;br /&gt;
&lt;img src="/images/blogs_ugidotnet_org/leonardo/blog_adv_options.png" alt="" width="650" height="71" /&gt;&lt;br /&gt;
&lt;br /&gt;
Di &lt;span style="font-weight: bold;"&gt;default &lt;/span&gt;l'opzione "Include in Aggregated Site" non risulta infatti marcata ed i post non compaiono nell'aggregatore principale &lt;a href="http://blogs.ugidotnet.org"&gt;http://blogs.ugidotnet.org&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Devo dire che avendo sempre utilizzando Windows Live Writer, ora sostituito da &lt;span style="font-weight: bold;"&gt;Open Live Writer&lt;/span&gt; (&lt;a href="http://openlivewriter.org"&gt;http://openlivewriter.org&lt;/a&gt;), non avevo mai avuto bisogno di fare questa operazione.&lt;br /&gt;
&lt;br /&gt;
E adesso mi raccomando.. ricominciate ad imbrattare il muro!&lt;img src="http://blogs.ugidotnet.org/leonardo/aggbug/102601.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Leonardo</dc:creator>
            <guid>http://blogs.ugidotnet.org/leonardo/archive/2018/03/13/Quando-il-muro-rimane-bianco.aspx</guid>
            <pubDate>Tue, 13 Mar 2018 20:05:57 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/leonardo/archive/2018/03/13/Quando-il-muro-rimane-bianco.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/leonardo/comments/commentRss/102601.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/leonardo/services/trackbacks/102601.aspx</trackback:ping>
        </item>
        <item>
            <title>Stack Traces nuovamente comprensibili</title>
            <link>http://blogs.ugidotnet.org/leonardo/archive/2018/03/11/Stack-Traces-nuovamente-comprensibili.aspx</link>
            <description>&lt;span style="text-decoration: underline;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;Ops..&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; è passato un bel pò di tempo dal mio ultimo post su UGI.. &lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;lo sapevo!&lt;/span&gt; E' successo ancora!&lt;/span&gt; :)&lt;br /&gt;
&lt;br /&gt;
FPGA, IoT, Elettronica varia e diversi progetti mi hanno tenuto occupato quanto basta ed aggiornare due blog (per chi non lo sapesse, potete seguirmi anche su &lt;a href="http://electro-logic.blogspot.it"&gt;http://electro-logic.blogspot.it&lt;/a&gt;) è abbastanza impegnativo. In realtà anche lato .NET non mi sono mai fermato (Xamarin, UWP, .NET Core, ...avrei tante tante cose da raccontare!)&lt;br /&gt;
&lt;br /&gt;
Vediamo oggi come si è evoluta nel tempo la &lt;span style="font-weight: bold;"&gt;Stack Traces&lt;/span&gt; in C#, ovvero, semplificando molto, l'elenco cronologico delle chiamate di funzione che ci hanno portato ad una determinata situazione.&lt;br /&gt;
&lt;br /&gt;
Sono ormai passati i tempi (.NET 1.0) dove si aveva uno Stack Trace immediatamente comprensibile come&lt;br /&gt;
&lt;img src="/images/blogs_ugidotnet_org/leonardo/simple_stacktrace.png" alt="" width="550" height="24" /&gt;&lt;br /&gt;
&lt;br /&gt;
Con l'aggiunta di nuove funzionalità come i Generics, LINQ, i metodi Lambda, Async, etc.. oggi ci troviamo sempre più spesso ad una situazione di questo tipo (&lt;span style="font-style: italic;"&gt;se ci va bene&lt;/span&gt;): &lt;br /&gt;
&lt;br /&gt;
&lt;img src="/images/blogs_ugidotnet_org/leonardo/complex_stacktrace.png" alt="" width="550" height="114" /&gt;&lt;br /&gt;
&lt;br /&gt;
Dove si riesce ancora a capire qualcosa, ma il tempo per avere una chiara visione di quello che sta succedendo aumenta inesorabilmente, se non altro per leggere delle informazioni spesso poco rilevanti e rifacenti a meccanismi interni che quasi mai hanno a che vedere coi problemi che come sviluppatori di &lt;span style="font-weight: bold;"&gt;applicativi &lt;/span&gt;(e non di framework) cerchiamo di risolvere.&lt;br /&gt;
&lt;br /&gt;
Il progetto &lt;span style="font-weight: bold;"&gt;Ben.Demystifier&lt;/span&gt; (&lt;a href="https://github.com/benaadams/Ben.Demystifier"&gt;https://github.com/benaadams/Ben.Demystifier&lt;/a&gt;) nasce per riportare la semplicità anche nello Stack Trace, interpretando pattern complessi ma estremamente ripetitivi, conseguenza delle nuove funzioni di .NET, e rendendoli immediatamente comprensibili, rimuovendo così la noiosa ridondanza dai nostri log.&lt;br /&gt;
&lt;br /&gt;
Ecco come diventa lo Stack Trace precedente:&lt;br /&gt;
&lt;br /&gt;
&lt;img src="/images/blogs_ugidotnet_org/leonardo/simplified_stacktrace.png" alt="" width="550" height="32" /&gt;&lt;br /&gt;
&lt;br /&gt;
E questo il codice (esempio in .NET Core 2.0, C# 7.2) per generarlo&lt;br /&gt;
&lt;img src="/images/blogs_ugidotnet_org/leonardo/code_stacktrace.png" alt="" width="550" height="674" /&gt;&lt;br /&gt;
&lt;br /&gt;
Come è possibile notare l'utilizzo è immediato, basta chiamare l'Extension Method &lt;span style="font-style: italic;"&gt;Demystify()&lt;/span&gt; sulle nostre eccezioni per avere una stringa.. demistificata. Veramente impressionante!&lt;br /&gt;
&lt;br /&gt;
Ecco l'esempio dell'autore del progetto, ancora più incisivo, che potete trovare nella pagina principale del progetto:&lt;br /&gt;
&lt;br /&gt;
&lt;img src="https://aoa.blob.core.windows.net/aspnet/stacktrace-demystified.png" alt="" width="550" height="246" /&gt;&lt;br /&gt;
&lt;br /&gt;
Personalmente spero che venga in qualche modo direttamente integrato nel futuro .NET Core.&lt;br /&gt;
Per il momento utilizziamo la libreria tramite NuGet e diciamo addio a lunghe sessioni di &lt;span style="font-weight: bold;"&gt;Stack Trace Understanding&lt;/span&gt;.&lt;br /&gt;
&lt;br /&gt;
Ciao a tutti!&lt;img src="http://blogs.ugidotnet.org/leonardo/aggbug/102599.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Leonardo</dc:creator>
            <guid>http://blogs.ugidotnet.org/leonardo/archive/2018/03/11/Stack-Traces-nuovamente-comprensibili.aspx</guid>
            <pubDate>Sun, 11 Mar 2018 12:22:16 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/leonardo/archive/2018/03/11/Stack-Traces-nuovamente-comprensibili.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/leonardo/comments/commentRss/102599.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/leonardo/services/trackbacks/102599.aspx</trackback:ping>
        </item>
        <item>
            <title>Upload Utility</title>
            <category>ASP.NET</category>
            <link>http://blogs.ugidotnet.org/leonardo/archive/2014/01/16/upload-utility.aspx</link>
            <description>&lt;p&gt;Dopo tanti anni torno finalmente a scrivere sul mio vecchio blog (ultimamente mi sono dedicato maggiormente al mio &lt;a href="http://electro-logic.blogspot.it"&gt;blog di elettronica&lt;/a&gt;).
&lt;/p&gt;&lt;p&gt;Volevo proporre un articolo che ho preparato nel 2011 ma mai pubblicato e che ho ritrovato in un vecchio hard-disk, come dice il detto… &lt;strong&gt;meglio tardi che mai&lt;/strong&gt;. Buona lettura a tutti.
&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;Se abbiamo un sito in hosting può tornare comodo in caso di upload di molti file di piccole dimensioni (ad esempio immagini multi-risoluzione &lt;a href="http://www.microsoft.com/silverlight/deep-zoom/"&gt;Deep Zoom&lt;/a&gt; o &lt;a href="http://research.microsoft.com/en-us/um/redmond/groups/ivm/HDView/"&gt;HD View&lt;/a&gt;) comprimere il tutto, fare un unico upload e decomprimere lato server i nostri file.
&lt;/p&gt;&lt;p&gt;Ho realizzato una piccola utility ASP.NET che ho utilizzato in occasione di un upload consistente e che voglio condividere con voi, l'ho utilizzata solamente una volta ma mi ha fatto veramente risparmiare molto tempo e banda di rete. 
&lt;/p&gt;&lt;p&gt;La pagina è veramente semplice, realizzarla e testarla richiede veramente poche tempo che… però può essere risparmiato &lt;a href="http://sdrv.ms/1j8aJmZ"&gt;scaricandola&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;L'unica pagina dell'utility si presenta con le istruzioni molto semplici che non riporto nuovamente:
&lt;/p&gt;&lt;p&gt;&lt;img src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/011614_0122_UploadUtili1.png" alt="" /&gt;
	&lt;/p&gt;&lt;p&gt;Come unica nota "/Upload" si riferisce alla cartella sul server web, posizionata nella cartella radice (ed in genere coincidente con il nome del dominio su hosting come Aruba) dove girerà la pagina che dovrà avere i corretti permessi impostati, in genere tramite le pagine di amministrazione dell'hosting.
&lt;/p&gt;&lt;p&gt;Il codice dell'unico pulsante è veramente semplice, utilizza la libreria &lt;strong&gt;SharpZipLib&lt;/strong&gt; per decomprimere il file ZIP caricato e non richiede molte spiegazioni, il file sarà decompresso in una cartella Upload/Data.
&lt;/p&gt;&lt;p&gt;&lt;img src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/011614_0122_UploadUtili2.png" alt="" /&gt;
	&lt;/p&gt;&lt;p&gt;Buon upload!
&lt;/p&gt;&lt;p&gt;&lt;a href="http://sdrv.ms/1j8aJmZ"&gt;Scarica il progetto&lt;/a&gt;
	&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/leonardo/aggbug/101757.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Leonardo</dc:creator>
            <guid>http://blogs.ugidotnet.org/leonardo/archive/2014/01/16/upload-utility.aspx</guid>
            <pubDate>Thu, 16 Jan 2014 03:22:49 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/leonardo/archive/2014/01/16/upload-utility.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/leonardo/comments/commentRss/101757.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/leonardo/services/trackbacks/101757.aspx</trackback:ping>
        </item>
        <item>
            <title>DependencyProperty e valore di default</title>
            <category>WPF</category>
            <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>Aruba e SMTP</title>
            <category>Aruba</category>
            <link>http://blogs.ugidotnet.org/leonardo/archive/2011/05/10/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/10/aruba-e-smtp.aspx</guid>
            <pubDate>Tue, 10 May 2011 00:04:49 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/leonardo/archive/2011/05/10/aruba-e-smtp.aspx#feedback</comments>
            <slash:comments>14</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 19:56:44 GMT</pubDate>
            <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 16:41:06 GMT</pubDate>
            <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/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>
    </channel>
</rss>