<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://dotnetumbria.org/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="it"><title type="html">Paolo Possanzini</title><subtitle type="html" /><id>http://dotnetumbria.org/blogs/possanzini/atom.aspx</id><link rel="alternate" type="text/html" href="http://dotnetumbria.org/blogs/possanzini/default.aspx" /><link rel="self" type="application/atom+xml" href="http://dotnetumbria.org/blogs/possanzini/atom.aspx" /><generator uri="http://communityserver.org" version="4.0.30417.1769">Community Server</generator><updated>2008-02-20T17:10:59Z</updated><entry><title>Custom Linq Provider (parte 1)</title><link rel="alternate" type="text/html" href="/blogs/possanzini/archive/2008/10/03/custom-linq-provider-parte-1.aspx" /><id>/blogs/possanzini/archive/2008/10/03/custom-linq-provider-parte-1.aspx</id><published>2008-10-03T11:25:19Z</published><updated>2008-10-03T11:25:19Z</updated><content type="html">&lt;p&gt;Diciamo che il rientro dalle ferie è stato più duro del previsto. In questo tempo però ho avuto modo di approfondire alcuni argomenti piuttosto interessanti legati alla programmazione con il framework 3.5 in modo particolare con Linq. &lt;/p&gt; &lt;p&gt;Facendo una veloce ricerca su google possiamo accorgerci che le implementazioni custom di linq stanno crescendo in modo piuttosto veloce. Da quelle per fare le query su Amazon a quelle per cercare documenti in Sharepoint a tutto quello che vi può venire in mente. Questo è possibile perchè la sintassi introdotta con il framework 3.5 e che abbiamo visto utilizzare in LinqtoSql o in LinqtoXml non è legata alla implementazione di alcune librerie di accesso ai dati di Microsoft, ma è un nuovo tipo di sintassi introdotta a livello di linguaggio e supportata da 2 interfaccie che sono presenti nelle librerie base del framework 3.5. Quindi è sufficiente reimplementare le interfaccie di base per rendere i nostri oggetti pienamente compatibili con la sintassi Linq. &lt;/p&gt; &lt;p&gt;L&amp;#39;obiettivo di questo articolo è di comprendere come Linq viene interpretato a livello di compilatore e come viene utilizzato per effettuare ricerche sui dati. Arriveremo anche customizzare il comportamento di Linq per effettuare query su fonti dati non tradizionali. In TeamDev abbiamo seguito questo approccio per estendere le funzionalità del nostro layer di accesso ai dati al fine di sfruttare le interessantissime caratteristiche della sintassi Linq. &lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Le interfaccie di base&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Abbiamo detto che linq si appoggia a due interfaccie : &lt;/p&gt; &lt;ol&gt; &lt;li&gt;IEnumerable (presente da tempo nella libreria mscorlib)&lt;/li&gt; &lt;li&gt;IQueryable (introdotta con il framework 3.5 nella libreria System.Core)&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;queste interfaccie vengono riconosciute dal compilatore e rendono possibile l&amp;#39;utilizzo della sintassi Linq. Comprendere come il compilatore utilizza le interfaccie, aiuta a comprendere come Linq funziona e come possiamo customizzarne il comportamento. &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;public interface &lt;b&gt;&lt;a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Collections.IEnumerable"&gt;IEnumerable&lt;/a&gt;&lt;/b&gt;
{
    &lt;a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Collections.IEnumerator"&gt;IEnumerator&lt;/a&gt; &lt;b&gt;&lt;a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Collections.IEnumerable/GetEnumerator():System.Collections.IEnumerator"&gt;GetEnumerator&lt;/a&gt;&lt;/b&gt;();
}
&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;p&gt;IEnumerable è presente dalla prima implementazione del framework a supporto della sintassi foreach. Possiamo infatti utilizzare il foreach solo sugli oggetti che implementano IEnumerable. &lt;br /&gt;Siccome Linq utilizza IEnumerable per effettuare le query che coinvolgono collection e liste, questo ci lascia intuire che tutti i foreach possono essere trasformati in query Linq. &lt;br /&gt;&lt;/p&gt;&lt;pre&gt;public interface &lt;b&gt;&lt;a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://System.Core:3.5.0.0:b77a5c561934e089/System.Linq.IQueryable"&gt;IQueryable&lt;/a&gt;&lt;/b&gt; : &lt;a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Collections.IEnumerable"&gt;IEnumerable&lt;/a&gt;
{
    &lt;a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://mscorlib:2.0.0.0:b77a5c561934e089/System.Type"&gt;Type&lt;/a&gt; &lt;b&gt;&lt;a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://System.Core:3.5.0.0:b77a5c561934e089/System.Linq.IQueryable/property:ElementType:System.Type"&gt;ElementType&lt;/a&gt;&lt;/b&gt; { get; }
    &lt;a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://System.Core:3.5.0.0:b77a5c561934e089/System.Linq.Expressions.Expression"&gt;Expression&lt;/a&gt; &lt;b&gt;&lt;a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://System.Core:3.5.0.0:b77a5c561934e089/System.Linq.IQueryable/property:Expression:System.Linq.Expressions.Expression"&gt;Expression&lt;/a&gt;&lt;/b&gt; { get; }
    &lt;a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://System.Core:3.5.0.0:b77a5c561934e089/System.Linq.IQueryProvider"&gt;IQueryProvider&lt;/a&gt; &lt;b&gt;&lt;a href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://System.Core:3.5.0.0:b77a5c561934e089/System.Linq.IQueryable/property:Provider:System.Linq.IQueryProvider"&gt;Provider&lt;/a&gt;&lt;/b&gt; { get; }
}&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;p&gt;
IQueryable è stata introdotta con la versione 3.5 del framework e si trova in System.Core. L&amp;#39;implementazione di IQueryable permette di customizzare il comportamento della query linq per adattarla ad una sorgente dati particolare. &lt;br /&gt;Mentre le query&amp;nbsp; su oggetti IEnumerable vengono eseguite in memoria , le query su IQueryable possono essere trasformate in query custom su oggetti di ogni tipo. &lt;/p&gt;
&lt;p&gt;Tutto questo è possibile grazie alla classe Expression e alla interfaccia IQueryProvider esposte attraverso IQueryable&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Come vengono utilizzate le interfaccie&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Quando utilizzata con IQueryable, la query linq viene trasformata dal compilatore in un oggetto di tipo Expression (detto anche ExpressionTree , perchè ha una struttra ad albero). &lt;br /&gt;L&amp;#39;oggetto Expression viene passato ad un provider che provvede ad interpretarlo e restituirà un risultato coerente con la query effettuata. &lt;/p&gt;
&lt;p&gt;Quando utilizzata con IEnumerable, la query linq viene immediatamente eseguita attraverso degli extension methods che estendono le funzionalità della interfaccia IEnumerable. &lt;/p&gt;
&lt;p&gt;E facile intuire quindi che per customizzare il comportamento delle query Linq dobbiamo implementare una delle suddette interfaccie. &lt;br /&gt;Agendo con Reflector ci accorgiamo anche che il modo più corretto per intervenire è utilizzare IQueryable piuttosto che IEnumerable, questo perchè IEnumerable ha lo scopo di effettuare operazioni in memoria, cosa che probabilmente vorremo continuare a fare. &lt;/p&gt;
&lt;p&gt;IQueryable invece è pensata per agire fuori dal contesto dell&amp;#39;applicazione e quindi è l&amp;#39;interfaccia che meglio si presta alla realizzazione di provider custom per l&amp;#39;accesso ai dati. &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Nel prossimo post vedremo come è strutturata la classe Expression e come creare un parser per tradurre le Expression Tree in tutto ciò che vogliamo. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetumbria.org/aggbug.aspx?PostID=544" width="1" height="1"&gt;</content><author><name>Paolo Possanzini</name><uri>http://dotnetumbria.org/members/Paolo-Possanzini/default.aspx</uri></author></entry><entry><title>Book Review: Beginning Web Development, Silverlight, and ASP.NET Ajax</title><link rel="alternate" type="text/html" href="/blogs/possanzini/archive/2008/08/22/book-review-beginning-web-development-silverlight-and-asp-net-ajax.aspx" /><id>/blogs/possanzini/archive/2008/08/22/book-review-beginning-web-development-silverlight-and-asp-net-ajax.aspx</id><published>2008-08-22T09:57:00Z</published><updated>2008-08-22T09:57:00Z</updated><content type="html">&lt;p&gt;Il libro &amp;ldquo;Beginning Web Development, Silverlight, and ASP.NET Ajax&amp;rdquo;, scritto da Laurance Moroney, &amp;egrave; una introduzione alla programmazione Web, adatto in modo particolare per chi inizia ad affacciarsi a questo mondo. E&amp;rsquo; diviso in 3 parti principali di cui la prima, dopo un capitolo di storia sul mondo web, introduce ai principi dello sviluppo ASP.Net 2.0. Guida passo-passo il principiante a creare la prima applicazione Web, spiegando anche il funzionamento di base di Visual Studio e affrontando progressivamente gli argomenti fondamentali come WebForms, DataBing, WebServices. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://dotnetumbria.org/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/possanzini/1590599594_5F00_2.gif"&gt;&lt;img style="border-right:0px;border-top:0px;margin:0px 20px 0px 0px;border-left:0px;border-bottom:0px;" alt="Book Review:  Beginning Web Development, Silverlight, and ASP.NET Ajax" src="http://dotnetumbria.org/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/possanzini/1590599594_5F00_thumb.gif" width="253" align="left" border="0" height="330" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Nella seconda parte viene fatta una carrellata delle nuove tecnologie introdotte con la versione 3.0 di Microsoft .Net Framework: Windows Communication Foundation, Windows Presentation Foundation, Windows Workflow Foundation. &lt;br /&gt;Nell&amp;rsquo;ultima parte viene ripreso l&amp;rsquo;argomento Web, dove viene illustrata l&amp;rsquo;evoluzione che ha portato ad Ajax per affrontare infine Silverlight.  &lt;/p&gt;
&lt;p&gt;Il libro &amp;egrave; decisamente introduttivo e getta le basi per ulteriori approfondimenti. Di facile lettura &amp;egrave; pienamente comprensibile anche da un programmatore inesperto. Non approfondisce troppo nessun argomento lasciando al lettore la giusta dose di curiosit&amp;agrave; per ulteriori letture. Una cosa molto importante da sottolineare &amp;egrave; la visione di insieme che si ottiene dalla lettura di questo libro dove tutte le tecnologie affrontate trovano il loro giusto posto.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetumbria.org/aggbug.aspx?PostID=525" width="1" height="1"&gt;</content><author><name>Paolo Possanzini</name><uri>http://dotnetumbria.org/members/Paolo-Possanzini/default.aspx</uri></author></entry><entry><title>[OT] TS: MS .NET Framework 3.5, ADO .NET Application Development --&gt; Passed</title><link rel="alternate" type="text/html" href="/blogs/possanzini/archive/2008/07/23/ot-ts-ms-net-framework-3-5-ado-net-application-development-gt-passed.aspx" /><id>/blogs/possanzini/archive/2008/07/23/ot-ts-ms-net-framework-3-5-ado-net-application-development-gt-passed.aspx</id><published>2008-07-23T20:31:00Z</published><updated>2008-07-23T20:31:00Z</updated><content type="html">&lt;p&gt;&amp;nbsp;Anche io mi sto dilettando con gli esami in Beta. E proprio questa sera ho saputo di aver passato il 70-561 : TS: MS .NET Framework 3.5, ADO .NET Application Development&lt;/p&gt;
&lt;p&gt;&lt;img src="http://dotnetumbria.org/emoticons/emotion-15.gif" alt="Geeked" /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetumbria.org/aggbug.aspx?PostID=469" width="1" height="1"&gt;</content><author><name>Paolo Possanzini</name><uri>http://dotnetumbria.org/members/Paolo-Possanzini/default.aspx</uri></author></entry><entry><title>Uno snippet per le DependencyProperty su WPF</title><link rel="alternate" type="text/html" href="/blogs/possanzini/archive/2008/05/27/uno-snippet-per-le-dependencyproperty-su-wpf.aspx" /><link rel="enclosure" type="text/xml" length="2166" href="http://dotnetumbria.org/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.00.03.76/propdpf.snippet" /><id>/blogs/possanzini/archive/2008/05/27/uno-snippet-per-le-dependencyproperty-su-wpf.aspx</id><published>2008-05-27T07:59:00Z</published><updated>2008-05-27T07:59:00Z</updated><content type="html">&lt;p&gt;Mi capita molto spesso di creare DependencyProperty per i miei oggetti da utilizzare con WPF.&lt;br /&gt;&lt;font color="#000000"&gt;Nello snippet base devo sostituire continuamente &lt;/font&gt;&lt;font size="2"&gt;&lt;font color="#000000" size="2"&gt;&lt;font color="#0000ff"&gt;UIPropertyMetadata&lt;/font&gt; con &lt;font color="#0000ff"&gt;FrameworkElementMetadata&lt;/font&gt;, quindi ho deciso di farmi uno snippet gia modificato. &lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font size="2"&gt;&lt;br /&gt;&lt;font color="#000000"&gt;Ve lo allego. &lt;br /&gt;Potete richiamarlo con propdpf&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#000000"&gt;Per installarlo è sufficiente copiare il file nella cartella &lt;br /&gt;C:\Program Files\Microsoft Visual Studio 9.0\VC#\Snippets\1033\NetFX30\&lt;/font&gt;&lt;/p&gt;&lt;/font&gt;&lt;/font&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetumbria.org/aggbug.aspx?PostID=376" width="1" height="1"&gt;</content><author><name>Paolo Possanzini</name><uri>http://dotnetumbria.org/members/Paolo-Possanzini/default.aspx</uri></author></entry><entry><title>WPF - VS 2008 {Community} Launch - Il Codice della demo</title><link rel="alternate" type="text/html" href="/blogs/possanzini/archive/2008/05/12/wpf-vs-2008-community-launch-il-codice-della-demo.aspx" /><link rel="enclosure" type="application/octet-stream" length="153910" href="http://dotnetumbria.org/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.00.03.54/WpfPresentation_5F00_Media4.rar" /><id>/blogs/possanzini/archive/2008/05/12/wpf-vs-2008-community-launch-il-codice-della-demo.aspx</id><published>2008-05-12T00:24:00Z</published><updated>2008-05-12T00:24:00Z</updated><content type="html">&lt;p&gt;In allegato a questo Post trovate il codice della demo della sessione su WPF utilizzata durante l&amp;#39;evento dell&amp;#39;8 Aprile. &lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetumbria.org/aggbug.aspx?PostID=354" width="1" height="1"&gt;</content><author><name>Paolo Possanzini</name><uri>http://dotnetumbria.org/members/Paolo-Possanzini/default.aspx</uri></author><category term="WPF" scheme="http://dotnetumbria.org/blogs/possanzini/archive/tags/WPF/default.aspx" /><category term="XAML" scheme="http://dotnetumbria.org/blogs/possanzini/archive/tags/XAML/default.aspx" /></entry><entry><title>WPF: Costruiamo un RSS Reader passo 4 (ListView)</title><link rel="alternate" type="text/html" href="/blogs/possanzini/archive/2008/05/11/wpf-costruiamo-un-rss-reader-passo-4-listview.aspx" /><link rel="enclosure" type="application/octet-stream" length="88998" href="http://dotnetumbria.org/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.00.03.53/WpfRssReader.rar" /><id>/blogs/possanzini/archive/2008/05/11/wpf-costruiamo-un-rss-reader-passo-4-listview.aspx</id><published>2008-05-11T21:24:00Z</published><updated>2008-05-11T21:24:00Z</updated><content type="html">&lt;p&gt;Riprendiamo la nostra serie di articoli per la costruzione dell&amp;#39;RSS Reader in WPF. Questa è la volta della definizione della ListView. &lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Iniziamo a creare 2 wrapper che nascondono gli oggetti COM a WPF. &lt;br /&gt;Incorriamo in questo modo in meno problematiche di Binding. &lt;/p&gt;
&lt;p&gt;Ecco i due Wrapper &lt;/p&gt;
&lt;p&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Linq;&lt;br /&gt;using System.Text;&lt;br /&gt;using Microsoft.Feeds.Interop;&lt;br /&gt;using System.Collections; 
&lt;p&gt;namespace WpfRssReader&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; public class myFeed&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private IFeed _currentFeed; 
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Copyright&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _currentFeed.Copyright; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Description&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _currentFeed.Description; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Image&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _currentFeed.Image; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public myFeedItem[] Items&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;myFeedItem&amp;gt; _items = new List&amp;lt;myFeedItem&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (IFeedItem item in (IEnumerable)_currentFeed.Items)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _items.Add(new myFeedItem() { CurrentFeedItem = item });&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return _items.ToArray();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public DateTime PubDate&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _currentFeed.PubDate; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Title&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _currentFeed.Title; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Url&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _currentFeed.Url; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public IFeed CurrentFeed&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _currentFeed; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _currentFeed = value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;p&gt;&amp;nbsp; }&lt;br /&gt;} 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Linq;&lt;br /&gt;using System.Text;&lt;br /&gt;using Microsoft.Feeds.Interop; 
&lt;p&gt;namespace WpfRssReader&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; public class myFeedItem : IFeedItem&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private IFeedItem _currentFeedItem; 
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public IFeedItem CurrentFeedItem&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _currentFeedItem; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set { _currentFeedItem = value; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Author&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _currentFeedItem.Author; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Comments&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _currentFeedItem.Comments; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Description&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _currentFeedItem.Description; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string DownloadUrl&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _currentFeedItem.DownloadUrl; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public object Enclosure&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _currentFeedItem.Enclosure; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Guid&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _currentFeedItem.Guid; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public bool IsRead&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return _currentFeedItem.IsRead;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _currentFeedItem.IsRead = value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public DateTime LastDownloadTime&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _currentFeedItem.LastDownloadTime; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Link&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _currentFeedItem.Link; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int LocalId&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _currentFeedItem.LocalId; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public DateTime Modified&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _currentFeedItem.Modified; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public object Parent&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _currentFeedItem.Parent; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public DateTime PubDate&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _currentFeedItem.PubDate; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Title&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _currentFeedItem.Title; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void Delete()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _currentFeedItem.Delete();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Xml(FEEDS_XML_INCLUDE_FLAGS includeFlags)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return _currentFeedItem.Xml(includeFlags);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;p&gt;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;} 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Una volta preparate le classi dobbiamo apportare una piccolissima correzione al codice che inserisce il feed all&amp;#39;interno del TAG degli oggetti della TreeView in modo da utilizzare le nuove classi al posto degli oggetti COM che ci restituisce il FeedFolder. &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;[code language=&amp;quot;c#&amp;quot;]&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;foreach (IFeed feed in ((IFeedsEnum)feedfolder.Feeds))&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; TreeViewItem tvi = new TreeViewItem()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Header = feed.Name,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Tag = new myFeed() { CurrentFeed = feed }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // &amp;lt;&amp;lt;&amp;lt;-------- Riga modificata. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }; 
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Esegue il download asincrono degli items presenti nel feed &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ThreadPool.QueueUserWorkItem(delegate 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;[/code]&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;A questo punto facciamo una piccola modifica anche allo xaml ed inseriamo il DataTemplate per la visualizzazione dei feed. &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;[code language=&amp;quot;XML&amp;quot;]&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;lt;ListView Width=&amp;quot;Auto&amp;quot; Height=&amp;quot;Auto&amp;quot; BorderThickness=&amp;quot;0,0,0,0&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ItemsSource=&amp;quot;{Binding Path=SelectedItem.Tag.Items, ElementName=tvFeedsFolders, Mode=OneWay}&amp;quot; IsSynchronizedWithCurrentItem=&amp;quot;True&amp;quot;&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ListView.ItemTemplate&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DataTemplate&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Grid &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Width=&amp;quot;{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListView}}, Path=Width}&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Grid.ColumnDefinitions&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ColumnDefinition Width=&amp;quot;1*&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Grid.ColumnDefinitions&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Grid.RowDefinitions&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;RowDefinition Height=&amp;quot;3*&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;RowDefinition Height=&amp;quot;1*&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Grid.RowDefinitions&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Rectangle Margin=&amp;quot;0&amp;quot; Grid.RowSpan=&amp;quot;2&amp;quot;&amp;nbsp; RadiusX=&amp;quot;3&amp;quot; RadiusY=&amp;quot;3&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;TextBlock Text=&amp;quot;{Binding Path=Title}&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FontFamily=&amp;quot;Calibri&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FontSize=&amp;quot;16&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FontWeight=&amp;quot;Bold&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Grid.Column=&amp;quot;0&amp;quot; Grid.Row=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;WrapPanel Grid.Column=&amp;quot;0&amp;quot; Grid.Row=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;TextBlock Text=&amp;quot;{Binding Path=PubDate}&amp;quot; FontStyle=&amp;quot;Italic&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;TextBlock Text=&amp;quot;&amp;nbsp; &amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;TextBlock Text=&amp;quot;{Binding Path=Author}&amp;quot; FontWeight=&amp;quot;Bold&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/WrapPanel&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Grid&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ListView.ItemTemplate&amp;gt;&lt;br /&gt;&amp;lt;/ListView&amp;gt; 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;[/code]&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Aggiungiamo in fine un elemento Frame che ci permetterà di visualizzazre il contenuto HTML dei posts. &lt;/p&gt;
&lt;p&gt;[code language=&amp;quot;XML&amp;quot;]&lt;/p&gt;
&lt;p&gt;&amp;lt;Border &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DataContext=&amp;quot;{Binding Path=SelectedItem, ElementName=lvDetails}&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Margin=&amp;quot;3,3,0,0&amp;quot; Grid.Column=&amp;quot;1&amp;quot; Grid.Row=&amp;quot;2&amp;quot; BorderBrush=&amp;quot;#FF222222&amp;quot; BorderThickness=&amp;quot;1,1,1,1&amp;quot; CornerRadius=&amp;quot;4,4,4,4&amp;quot; Padding=&amp;quot;4,4,4,4&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Frame Source=&amp;quot;{Binding Path=Link}&amp;quot; NavigationUIVisibility=&amp;quot;Hidden&amp;quot;&amp;gt;&amp;lt;/Frame&amp;gt;&lt;br /&gt;&amp;lt;/Border&amp;gt; 
&lt;p&gt;[/code]&lt;br /&gt;&lt;br /&gt;In allegato a questo post trovate il progetto completo con le parti sviluppate fino a questo punto. &lt;/p&gt;
&lt;p&gt;Nei post futuri vedremo compe personalizzare il layout di quest&amp;#39;applicazione con Blend e come applicare alcuni Effetti che WPF ci permette di realizzare. &lt;br /&gt;Buon divertimento. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetumbria.org/aggbug.aspx?PostID=353" width="1" height="1"&gt;</content><author><name>Paolo Possanzini</name><uri>http://dotnetumbria.org/members/Paolo-Possanzini/default.aspx</uri></author></entry><entry><title>WPF: Costruiamo un RSS Reader passo 3 (TreeView)</title><link rel="alternate" type="text/html" href="/blogs/possanzini/archive/2008/04/23/wpf-costruiamo-un-rss-reader-passo-3-treeview.aspx" /><id>/blogs/possanzini/archive/2008/04/23/wpf-costruiamo-un-rss-reader-passo-3-treeview.aspx</id><published>2008-04-23T12:47:12Z</published><updated>2008-04-23T12:47:12Z</updated><content type="html">&lt;p&gt;Inseriamo la TreeView che conterrà la struttura ad albero dei feed sottoscritti. &lt;/p&gt; &lt;p&gt;[code language=&amp;quot;XML&amp;quot;]&lt;/p&gt; &lt;p&gt;&amp;lt;Window&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:x=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:rssreader =&amp;quot;clr-namespace:WpfRssReader&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:d=&amp;quot;http://schemas.microsoft.com/expression/blend/2006&amp;quot; xmlns:mc=&amp;quot;http://schemas.openxmlformats.org/markup-compatibility/2006&amp;quot; mc:Ignorable=&amp;quot;d&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; x:Class=&amp;quot;WpfRssReader.MainForm&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Title=&amp;quot;Heros RSS Reader&amp;quot; Height=&amp;quot;600&amp;quot; Width=&amp;quot;800&amp;quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Grid Width=&amp;quot;Auto&amp;quot; Height=&amp;quot;Auto&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Grid.RowDefinitions&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;RowDefinition Height=&amp;quot;55&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;RowDefinition Height=&amp;quot;*&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Grid.RowDefinitions&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Grid Grid.Row=&amp;quot;1&amp;quot; Grid.RowSpan=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Grid.ColumnDefinitions&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ColumnDefinition/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ColumnDefinition Width=&amp;quot;3*&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Grid.ColumnDefinitions&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Grid.RowDefinitions&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;RowDefinition Height=&amp;quot;96&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;RowDefinition Height=&amp;quot;0.3*&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;RowDefinition Height=&amp;quot;0.6*&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Grid.RowDefinitions&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- Inseriamo la TreeView che conterrà i Feeds Sottoscritti --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Border Grid.Row=&amp;quot;1&amp;quot; Grid.RowSpan=&amp;quot;2&amp;quot; BorderBrush=&amp;quot;#FF000000&amp;quot; BorderThickness=&amp;quot;1,1,1,1&amp;quot; CornerRadius=&amp;quot;4,4,4,4&amp;quot; Padding=&amp;quot;4,4,4,4&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;TreeView Width=&amp;quot;Auto&amp;quot; Height=&amp;quot;Auto&amp;quot; BorderThickness=&amp;quot;0,0,0,0&amp;quot; Name=&amp;quot;tvFeedsFolders&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Border&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Grid&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Rectangle Fill=&amp;quot;#FF000000&amp;quot; Stroke=&amp;quot;#FF000000&amp;quot; StrokeThickness=&amp;quot;0&amp;quot; RadiusX=&amp;quot;0&amp;quot; RadiusY=&amp;quot;0&amp;quot; HorizontalAlignment=&amp;quot;Stretch&amp;quot; Margin=&amp;quot;0,0,0,0&amp;quot; Width=&amp;quot;Auto&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;TextBlock Margin=&amp;quot;24,8,16,8&amp;quot; FontFamily=&amp;quot;Segoe UI&amp;quot; FontSize=&amp;quot;24&amp;quot; Foreground=&amp;quot;#FFD5D5D5&amp;quot; Text=&amp;quot;Heros {Community} RSS Reader&amp;quot; TextWrapping=&amp;quot;Wrap&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Grid&amp;gt;&lt;br /&gt;&amp;lt;/Window&amp;gt;&lt;/p&gt; &lt;p&gt;[/code]&lt;/p&gt; &lt;p&gt;Inseriamo un oggetto di ObjectDataProvider per preparare il Binding. &lt;br /&gt;Utilizziamo il metodo GetFeedSubTree dell&amp;#39;oggetto di tipo FeedHelper per popolare la TreeView&lt;/p&gt; &lt;p&gt;[code language=&amp;quot;XML&amp;quot;]&lt;/p&gt; &lt;p&gt;&amp;lt;Window.Resources&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ObjectDataProvider x:Key=&amp;quot;FeedTreeDS&amp;quot; ObjectType=&amp;quot;{x:Type rssreader:FeedHelper}&amp;quot; MethodName=&amp;quot;GetFeedSubTree&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/Window.Resources&amp;gt;  &lt;p&gt;[/code]&lt;br /&gt;&lt;br /&gt;A questo punto andiamo ad inserire il binding all&amp;#39;interno dell&amp;#39;oggetto TreeView&lt;/p&gt; &lt;p&gt;[code language=&amp;quot;XML&amp;quot;]&lt;/p&gt; &lt;p&gt;&amp;lt;TreeView &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ItemsSource=&amp;quot;{Binding Source={StaticResource FeedTreeDS}}&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Width=&amp;quot;Auto&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Height=&amp;quot;Auto&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BorderThickness=&amp;quot;0,0,0,0&amp;quot; Name=&amp;quot;tvFeedsFolders&amp;quot; /&amp;gt;&lt;/p&gt; &lt;p&gt;[/code]&lt;/p&gt; &lt;p&gt;Inseriamo subito anche un&amp;#39;altro Grid che con i controlli necessari a sottoscrivere i feeds, per adesso inseriamo solo due textbox, una per il nome che vogliamo dare al feed ed una per l&amp;#39;uri&lt;br /&gt;Posizioniamo questo nuovo Grid nella prima cella in alto a sinistra.&lt;/p&gt; &lt;p&gt;[code language=&amp;quot;XML&amp;quot;]&lt;/p&gt; &lt;p&gt;&amp;lt;Grid Margin=&amp;quot;0,0,0,0&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Rectangle Fill=&amp;quot;#FFFFFFFF&amp;quot; Stroke=&amp;quot;#FF000000&amp;quot; RadiusX=&amp;quot;4&amp;quot; RadiusY=&amp;quot;4&amp;quot; Margin=&amp;quot;0,0,0,0&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;TextBox Text=&amp;quot;&amp;amp;lt;url&amp;amp;gt;&amp;quot; TextWrapping=&amp;quot;Wrap&amp;quot; Margin=&amp;quot;8,36,8,0&amp;quot; VerticalAlignment=&amp;quot;Top&amp;quot; Name=&amp;quot;txtUrl&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;TextBox Height=&amp;quot;24&amp;quot; Text=&amp;quot;&amp;amp;lt;nome&amp;amp;gt;&amp;quot; TextWrapping=&amp;quot;Wrap&amp;quot; Margin=&amp;quot;8,8,8,0&amp;quot; VerticalAlignment=&amp;quot;Top&amp;quot; Name=&amp;quot;txtNome&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Button d:LayoutOverrides=&amp;quot;Height&amp;quot; x:Name=&amp;quot;btnSubscribe&amp;quot; Height=&amp;quot;28&amp;quot; Content=&amp;quot;Sottoscrivi&amp;quot; Click=&amp;quot;btnSubscribe_Click&amp;quot; HorizontalAlignment=&amp;quot;Right&amp;quot; Margin=&amp;quot;0,0,8,8&amp;quot; VerticalAlignment=&amp;quot;Bottom&amp;quot; Width=&amp;quot;76&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Grid&amp;gt;  &lt;p&gt;[/code]&lt;br /&gt;&lt;br /&gt;Scriviamo il codice necessario a gestire l&amp;#39;evento Click del bottone che abbiamo inserito. &lt;br /&gt;Il metodo dovrà controllare qual&amp;#39;è il folder selezionato nella Treeview ed inserire la sottoscrizione all&amp;#39;interno di quel folder. &lt;br /&gt;Poi dovrà invocare il metodo FeedHelper.SubscribeFeed&lt;/p&gt; &lt;p&gt;[code language=&amp;quot;C#&amp;quot;]&lt;/p&gt; &lt;p&gt;private void btnSubscribe_Click(object sender, RoutedEventArgs e)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; TreeViewItem tvi = tvFeedsFolders.SelectedItem as TreeViewItem;&lt;br /&gt;&amp;nbsp; if (tvi != null)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IFeedFolder folder = null;  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; folder = tvi.Tag as IFeedFolder;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (folder == null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IFeed feed = tvi.Tag as IFeed;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (feed != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; folder = feed.Parent as IFeedFolder;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (folder == null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; folder = new FeedsManagerClass().RootFolder as IFeedFolder;  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FeedHelper.SubscribeFeed(folder, txtUrl.Text, txtNome.Text);&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;}  &lt;p&gt;[/code]&lt;/p&gt; &lt;p&gt;Ecco il risultato del lavoro svolto fino a questo momento &lt;/p&gt; &lt;p&gt;&lt;a href="http://dotnetumbria.org/blogs/possanzini/WindowsLiveWriter/WPFCostruiamounRSSReaderpasso3TreeView_1483C/image_2.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="604" alt="image" src="http://dotnetumbria.org/blogs/possanzini/WindowsLiveWriter/WPFCostruiamounRSSReaderpasso3TreeView_1483C/image_thumb.png" width="804" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetumbria.org/aggbug.aspx?PostID=336" width="1" height="1"&gt;</content><author><name>Paolo Possanzini</name><uri>http://dotnetumbria.org/members/Paolo-Possanzini/default.aspx</uri></author></entry><entry><title>WPF: Costruiamo un RSS Reader passo 2 (L'interfaccia utente)</title><link rel="alternate" type="text/html" href="/blogs/possanzini/archive/2008/04/21/wpf-costruiamo-un-rss-reader-passo-2-l-interfaccia-utente.aspx" /><id>/blogs/possanzini/archive/2008/04/21/wpf-costruiamo-un-rss-reader-passo-2-l-interfaccia-utente.aspx</id><published>2008-04-21T07:30:24Z</published><updated>2008-04-21T07:30:24Z</updated><content type="html">&lt;p&gt;Come secondo passo iniziano a creare l&amp;#39;interfaccia utente.&lt;/p&gt; &lt;p&gt;Creiamo un nuovo Windows Forms e lo chiamiamo MainForm.xaml. Ci spostiamo sul file App.xaml e impostiamo StartupUri a MainForm.xaml.&lt;br /&gt;Vediamo come creare la nostra UI. La mia idea iniziale è quella di creare un menù in alto e dividere il resto della UI in due colonne. Quella di sinistra come colonna di controllo, il resto come area di lettura dei feeds. &lt;/p&gt; &lt;p&gt;[code language=&amp;quot;XML&amp;quot;]&lt;/p&gt; &lt;p&gt;&amp;lt;Window&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:x=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:rssreader =&amp;quot;clr-namespace:WpfRssReader&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:d=&amp;quot;http://schemas.microsoft.com/expression/blend/2006&amp;quot; xmlns:mc=&amp;quot;http://schemas.openxmlformats.org/markup-compatibility/2006&amp;quot; mc:Ignorable=&amp;quot;d&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; x:Class=&amp;quot;WpfRssReader.MainForm&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Title=&amp;quot;Heros RSS Reader&amp;quot; Height=&amp;quot;600&amp;quot; Width=&amp;quot;800&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Grid Width=&amp;quot;Auto&amp;quot; Height=&amp;quot;Auto&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Grid.RowDefinitions&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;RowDefinition Height=&amp;quot;55&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;RowDefinition Height=&amp;quot;*&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Grid.RowDefinitions&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Rectangle Fill=&amp;quot;#FF000000&amp;quot; Stroke=&amp;quot;#FF000000&amp;quot; StrokeThickness=&amp;quot;0&amp;quot; RadiusX=&amp;quot;0&amp;quot; RadiusY=&amp;quot;0&amp;quot; HorizontalAlignment=&amp;quot;Stretch&amp;quot; Margin=&amp;quot;0,0,0,0&amp;quot; Width=&amp;quot;Auto&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;TextBlock Margin=&amp;quot;24,8,16,8&amp;quot; FontFamily=&amp;quot;Segoe UI&amp;quot; FontSize=&amp;quot;24&amp;quot; Foreground=&amp;quot;#FFD5D5D5&amp;quot; Text=&amp;quot;Heros {Community} RSS Reader&amp;quot; TextWrapping=&amp;quot;Wrap&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Grid&amp;gt;&lt;br /&gt;&amp;lt;/Window&amp;gt;  &lt;p&gt;[/code]&lt;/p&gt; &lt;p&gt;Ho già inserito nella struttura, lo spazio dei nomi dell&amp;#39;applicazione e l&amp;#39;ho chiamata &amp;quot;rssreader&amp;quot;.&lt;br /&gt;Dividiamo inoltre il form in due righe, una ad altezza fissa e una ad altezza variabile attraverso i due tag &lt;strong&gt;RowDefinition&lt;/strong&gt; . Inserisco due oggetti per dare al form un leggero stile &amp;quot;Heros&amp;quot;. &lt;/p&gt; &lt;p&gt;Inseriamo all&amp;#39;interno del form un nuovo Grid che utilizzeremo come area per il posizionamento dei controlli. &lt;br /&gt;Dividiamo il Grid in righe e colonne. Dimensioniamo le colonne con un rapporto 1 a 3 utilizzando la notazione &amp;quot;*&amp;quot; e creiamo 3 righe. &lt;br /&gt;Una ad altezza fissa e due riproporzionabili. &lt;/p&gt; &lt;p&gt;[code language=&amp;quot;XML&amp;quot; ]&lt;/p&gt;&amp;lt;Window&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:x=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:rssreader =&amp;quot;clr-namespace:WpfRssReader&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:d=&amp;quot;http://schemas.microsoft.com/expression/blend/2006&amp;quot; xmlns:mc=&amp;quot;http://schemas.openxmlformats.org/markup-compatibility/2006&amp;quot; mc:Ignorable=&amp;quot;d&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; x:Class=&amp;quot;WpfRssReader.MainForm&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Title=&amp;quot;Heros RSS Reader&amp;quot; Height=&amp;quot;600&amp;quot; Width=&amp;quot;800&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Grid Width=&amp;quot;Auto&amp;quot; Height=&amp;quot;Auto&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Grid.RowDefinitions&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;RowDefinition Height=&amp;quot;55&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;RowDefinition Height=&amp;quot;*&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Grid.RowDefinitions&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Grid Grid.Row=&amp;quot;1&amp;quot; Grid.RowSpan=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Grid.ColumnDefinitions&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ColumnDefinition/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ColumnDefinition Width=&amp;quot;3*&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Grid.ColumnDefinitions&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Grid.RowDefinitions&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;RowDefinition Height=&amp;quot;100&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;RowDefinition Height=&amp;quot;0.3*&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;RowDefinition Height=&amp;quot;0.6*&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Grid.RowDefinitions&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Grid&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Rectangle Fill=&amp;quot;#FF000000&amp;quot; Stroke=&amp;quot;#FF000000&amp;quot; StrokeThickness=&amp;quot;0&amp;quot; RadiusX=&amp;quot;0&amp;quot; RadiusY=&amp;quot;0&amp;quot; HorizontalAlignment=&amp;quot;Stretch&amp;quot; Margin=&amp;quot;0,0,0,0&amp;quot; Width=&amp;quot;Auto&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;TextBlock Margin=&amp;quot;24,8,16,8&amp;quot; FontFamily=&amp;quot;Segoe UI&amp;quot; FontSize=&amp;quot;24&amp;quot; Foreground=&amp;quot;#FFD5D5D5&amp;quot; Text=&amp;quot;Heros {Community} RSS Reader&amp;quot; TextWrapping=&amp;quot;Wrap&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Grid&amp;gt;&lt;br /&gt;&amp;lt;/Window&amp;gt; &lt;br /&gt;&lt;br /&gt; &lt;p&gt;[/code]&lt;br /&gt;&lt;/p&gt; &lt;p&gt;Questo è il risultato del lavoro fino a questo momento. &lt;/p&gt; &lt;p&gt;&lt;a href="http://dotnetumbria.org/blogs/possanzini/WindowsLiveWriter/WPFCostruiamounRSSReaderparte2din_1406F/image_2.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="478" alt="image" src="http://dotnetumbria.org/blogs/possanzini/WindowsLiveWriter/WPFCostruiamounRSSReaderparte2din_1406F/image_thumb.png" width="640" align="left" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetumbria.org/aggbug.aspx?PostID=335" width="1" height="1"&gt;</content><author><name>Paolo Possanzini</name><uri>http://dotnetumbria.org/members/Paolo-Possanzini/default.aspx</uri></author><category term="C#" scheme="http://dotnetumbria.org/blogs/possanzini/archive/tags/C_2300_/default.aspx" /><category term="WPF" scheme="http://dotnetumbria.org/blogs/possanzini/archive/tags/WPF/default.aspx" /></entry><entry><title>WPF: Costruiamo un RSS Reader passo 1 (utilizzare Microsoft.Feeds.dll)</title><link rel="alternate" type="text/html" href="/blogs/possanzini/archive/2008/04/19/wpf-costruiamo-un-rss-reader-parte-1-di-n.aspx" /><id>/blogs/possanzini/archive/2008/04/19/wpf-costruiamo-un-rss-reader-parte-1-di-n.aspx</id><published>2008-04-19T20:44:00Z</published><updated>2008-04-19T20:44:00Z</updated><content type="html">&lt;p&gt;Questo vuole essere il primo di una serie di articoli dedicati alla scrittura di applicazioni complete, dalla A alla Z sviluppate con il Framework 3.5, ponendo particolare attenzione al layer di presentazione attraverso WPF. Come primo esercizio creiamo un RSS reader. &lt;/p&gt; &lt;p&gt;Microsoft ci mette a disposizione una libreria COM per la lettura dei Feed. La utilizzeremo in questo progetto. &lt;/p&gt; &lt;p&gt;Iniziamo.&lt;/p&gt; &lt;p&gt;Creiamo la nostra applicazione con VS2008 e scegliamo WPF Application come tipo di progetto. &lt;br /&gt;Per prima cosa aggiungiamo la reference alla &lt;strong&gt;Microsoft.Feeds.dll &lt;/strong&gt;che possiamo trovare tra i componenti COM. &lt;/p&gt; &lt;p&gt;Creiamo una classe che ci permetta di gestire in modo agevole i feeds. Chiameremo questa classe FeedHelper&lt;/p&gt; &lt;p&gt;[code language=&amp;quot;C#&amp;quot;]&lt;/p&gt; &lt;p&gt;public static class FeedHelper&lt;br /&gt;&amp;nbsp; {  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Get The subtree for RootFolder folder&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;param name=&amp;quot;feedfolder&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Description(&amp;quot;Get The subtree for each folder&amp;quot;)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static TreeViewItem[] GetFeedSubTree()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return GetFeedSubTree((IFeedFolder)(new FeedsManagerClass().RootFolder));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Get The subtree for each folder&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;param name=&amp;quot;feedfolder&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Description(&amp;quot;Get The subtree for each folder&amp;quot;)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static TreeViewItem[] GetFeedSubTree(IFeedFolder feedfolder)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Creiamo una lista di nodi per questo folder&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;TreeViewItem&amp;gt; result = new List&amp;lt;TreeViewItem&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (IFeedFolder folder in ((IFeedsEnum)feedfolder.Subfolders))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TreeViewItem tvi = new TreeViewItem()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Header = folder.Name,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Tag = folder,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ItemsSource = GetFeedSubTree(folder)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result.Add(tvi);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Creiamo i nodi anche per i feed gia scaricati. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (feedfolder.Feeds != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (IFeed feed in ((IFeedsEnum)feedfolder.Feeds))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TreeViewItem tvi = new TreeViewItem()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Header = feed.Name,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Tag = feed&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Esegue il download asincrono degli items presenti nel feed &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ThreadPool.QueueUserWorkItem(delegate&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; feed.Download();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch (Exception ex)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Debug.WriteLine(ex.Message);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }, null);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result.Add(tvi);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return result.ToArray();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch (Exception ex)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Debug.WriteLine(ex.Message);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Create a Feed in a foder&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;param name=&amp;quot;folder&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;param name=&amp;quot;uri&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;param name=&amp;quot;name&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static void SubscribeFeed(IFeedFolder folder, string uri, string name)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; folder.CreateFeed(name, uri);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; }  &lt;p&gt;[/code]&lt;br /&gt;&lt;/p&gt; &lt;p&gt;Estenderemo questa classe se necessario in seguito. Per adesso ci basta porre attenzione sui due overloads &lt;strong&gt;&lt;em&gt;GetFeedSubTree &lt;/em&gt;&lt;/strong&gt;In questi due metodi viene creato in modo ricorsivo l&amp;#39;albero che descrive i feed sottoscritti eseguendo anche il download dei feed da ogni sottoscrizione. Da notare che non abbiamo bisogno di creare una struttura di storage dei feeds sottoscritti e scaricati. La libreria Microsoft.Feeds si occuperà di tutto per conto nostro. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetumbria.org/aggbug.aspx?PostID=334" width="1" height="1"&gt;</content><author><name>Paolo Possanzini</name><uri>http://dotnetumbria.org/members/Paolo-Possanzini/default.aspx</uri></author><category term="C#" scheme="http://dotnetumbria.org/blogs/possanzini/archive/tags/C_2300_/default.aspx" /><category term="WPF" scheme="http://dotnetumbria.org/blogs/possanzini/archive/tags/WPF/default.aspx" /></entry><entry><title>WPF Performance Tuning</title><link rel="alternate" type="text/html" href="/blogs/possanzini/archive/2008/04/17/wpf-performance-tuning.aspx" /><id>/blogs/possanzini/archive/2008/04/17/wpf-performance-tuning.aspx</id><published>2008-04-17T10:11:21Z</published><updated>2008-04-17T10:11:21Z</updated><content type="html">&lt;p&gt;Ho trovato un link utile a chi si diletta nello sviluppo di applicazioni WPF.    &lt;br /&gt;Sono riportati tutti gli oggetti WPF che inficiano in qualche modo le performance della nostra applicazione. &lt;/p&gt;  &lt;p&gt;Sono riportati anche suggerimenti per migliorare le performances. &lt;/p&gt;  &lt;p&gt;&lt;a title="http://blogs.msdn.com/wpfsdk/archive/2007/01/15/maximizing-wpf-3d-performance-on-tier-2-hardware.aspx" href="http://blogs.msdn.com/wpfsdk/archive/2007/01/15/maximizing-wpf-3d-performance-on-tier-2-hardware.aspx"&gt;http://blogs.msdn.com/wpfsdk/archive/2007/01/15/maximizing-wpf-3d-performance-on-tier-2-hardware.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Vi riporto inoltre il link ai tools di profiling delle performances.&lt;/p&gt;  &lt;p&gt;&lt;a title="http://msdn2.microsoft.com/en-us/library/aa969767.aspx" href="http://msdn2.microsoft.com/en-us/library/aa969767.aspx"&gt;http://msdn2.microsoft.com/en-us/library/aa969767.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Un link per migliorare le nostre animazioni &lt;/p&gt;  &lt;p&gt;&lt;a title="http://msdn2.microsoft.com/en-us/library/bb613592.aspx" href="http://msdn2.microsoft.com/en-us/library/bb613592.aspx"&gt;http://msdn2.microsoft.com/en-us/library/bb613592.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Un link che ci spiega come funziona il Tier della struttura grafica. &lt;/p&gt;  &lt;p&gt;&lt;a title="http://msdn2.microsoft.com/en-us/library/ms742196.aspx" href="http://msdn2.microsoft.com/en-us/library/ms742196.aspx"&gt;http://msdn2.microsoft.com/en-us/library/ms742196.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ed infine un link per risolvere i problemi dovuti all&amp;#39;interazione con la scheda grafica &lt;/p&gt;  &lt;p&gt;&lt;a title="http://msdn2.microsoft.com/en-us/library/aa970912.aspx" href="http://msdn2.microsoft.com/en-us/library/aa970912.aspx"&gt;http://msdn2.microsoft.com/en-us/library/aa970912.aspx&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetumbria.org/aggbug.aspx?PostID=331" width="1" height="1"&gt;</content><author><name>Paolo Possanzini</name><uri>http://dotnetumbria.org/members/Paolo-Possanzini/default.aspx</uri></author></entry><entry><title>C# ReaderWriterLock</title><link rel="alternate" type="text/html" href="/blogs/possanzini/archive/2008/04/14/c-readerwriterlock.aspx" /><id>/blogs/possanzini/archive/2008/04/14/c-readerwriterlock.aspx</id><published>2008-04-14T17:30:53Z</published><updated>2008-04-14T17:30:53Z</updated><content type="html">&lt;p&gt;In .Net quando dobbiamo creare applicazioni multithread siamo soliti utilizzare l&amp;#39;istruzione lock per sincronizzare l&amp;#39;accesso alle risorse condivise. &lt;br /&gt;Questo potrebbe non essere l&amp;#39;approccio più corretto se si eseguono molte letture e poche scritture perchè costringiamo i vari thread ad accedere alla risorsa anche in lettura uno alla volta. &lt;/p&gt; &lt;p&gt;La classe ReaderWriterLock ci aiuta a inserire i lock solo quando necessari e permette accessi multipli in lettura e accessi singoli in scrittura. &lt;br /&gt;Vi rimando ad MSDN per una trattazione dell&amp;#39;argomento più dettagliata. &lt;/p&gt; &lt;p&gt;&lt;a title="http://msdn2.microsoft.com/en-us/library/system.threading.readerwriterlock.aspx" href="http://msdn2.microsoft.com/en-us/library/system.threading.readerwriterlock.aspx"&gt;http://msdn2.microsoft.com/en-us/library/system.threading.readerwriterlock.aspx&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="http://msdn2.microsoft.com/en-us/magazine/cc163846.aspx" href="http://msdn2.microsoft.com/en-us/magazine/cc163846.aspx"&gt;http://msdn2.microsoft.com/en-us/magazine/cc163846.aspx&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetumbria.org/aggbug.aspx?PostID=327" width="1" height="1"&gt;</content><author><name>Paolo Possanzini</name><uri>http://dotnetumbria.org/members/Paolo-Possanzini/default.aspx</uri></author></entry><entry><title>JET4 + .Net + x64 ....</title><link rel="alternate" type="text/html" href="/blogs/possanzini/archive/2008/04/01/jet4-net-x64.aspx" /><id>/blogs/possanzini/archive/2008/04/01/jet4-net-x64.aspx</id><published>2008-04-01T14:18:02Z</published><updated>2008-04-01T14:18:02Z</updated><content type="html">&lt;p&gt;&lt;/p&gt; &lt;p&gt;Mi sono trovato ad utilizzare JET4 con .Net e x64...&lt;/p&gt; &lt;p&gt;Diciamo che c&amp;#39;è qualche piccolo problema. Nelle macchine x64 infatti non esiste una versione a 64bit per i drivers JET4 (Per Itanium c&amp;#39;è una versione specifica)&lt;br /&gt;Quindi le nostre applicazioni compilate e ottimizzate per x64 dal compilatore JIT di .Net, non avranno a disposizione tali drivers. &lt;/p&gt; &lt;p&gt;Se non potete fare altrimenti, dovete necessariamente utilizzare la versione a 32bit che è comunque presente nella macchina, ma dobbiamo forzare il compilatore a generare codice x86 e non x64 perdendo tutti i vantaggi dell&amp;#39;architettura x64 per la nostra applicazione. Per fare questo andiamo nelle configurazioni avanzate del progetto e spostiamo la Target CPU da Any a x86. &lt;/p&gt; &lt;p&gt;Buona fortuna. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetumbria.org/aggbug.aspx?PostID=285" width="1" height="1"&gt;</content><author><name>Paolo Possanzini</name><uri>http://dotnetumbria.org/members/Paolo-Possanzini/default.aspx</uri></author></entry><entry><title>Esplodere le gerarchie con Linq to SQL</title><link rel="alternate" type="text/html" href="/blogs/possanzini/archive/2008/03/06/esplodere-le-gerarchie-con-linq-to-sql.aspx" /><link rel="enclosure" type="application/octet-stream" length="77117" href="http://dotnetumbria.org/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.00.02.77/LinqTreeView.rar" /><id>/blogs/possanzini/archive/2008/03/06/esplodere-le-gerarchie-con-linq-to-sql.aspx</id><published>2008-03-06T09:42:00Z</published><updated>2008-03-06T09:42:00Z</updated><content type="html">&lt;p&gt;Utilizzando Linq to Sql mi sono reso conto di quanto sia facile ed immediato scrivere codice che intergra all&amp;#39;interno della sintassi di Linq delle chiamate a metodi. &lt;br /&gt;Una delle attività che affronto spesso, è scrivere metodi ricorsivi per manipolare le gerarchie. Con Linq è tutto molto più facile eseguire questa attività da codice, possiamo infatti creare una funzione ricorsiva inserendo all&amp;#39;interno di Linq la chiamata alla funzione che stiamo scrivendo. &lt;/p&gt;
&lt;p&gt;Nell&amp;#39;esempio che vi propongo esplodiamo l&amp;#39;organigramma definito nella tabella Employes del database AdventureWorks. &lt;/p&gt;
&lt;p&gt;Vediamo subito il codice. &lt;/p&gt;
&lt;p&gt;[code language=&amp;quot;C#&amp;quot;]&lt;/p&gt;
&lt;p&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.ComponentModel;&lt;br /&gt;using System.Data;&lt;br /&gt;using System.Drawing;&lt;br /&gt;using System.Linq;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.Windows.Forms; 
&lt;p&gt;namespace WindowsFormsApplication1&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; public partial class Form1 : Form&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Costruttore del form&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Form1()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; InitializeComponent(); 
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Chiamata al metodo per generare la struttura ad albero. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.treeView1.Nodes.AddRange(this.GetNodes(0));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Metodo per generare la struttura ad albero con Linq&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;param name=&amp;quot;managerid&amp;quot;&amp;gt; Id del manager. 0 se si vuole ottenere ottenere l&amp;#39;albero a partire dal General Manager&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private TreeNode[] GetNodes(int managerid)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { 
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // DataContext definito con Linq&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DbDataContext db = new DbDataContext(); 
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var result = from empl in db.Employees&amp;nbsp;&amp;nbsp;&amp;nbsp; // Tabella Employees&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; join cont in db.Contacts on&amp;nbsp; // Join con la tabella Contacts per ricavare il nome degli impiegati&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; empl.ContactID equals cont.ContactID&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; where (managerid == 0 &amp;amp;&amp;amp; empl.ManagerID == null) ||&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Verifico se devo cercare il General Manager&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; empl.ManagerID == managerid&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Where per ottenere i rami figli del manager passato&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; let node = new TreeNode(empl.EmployeeID.ToString() + &amp;quot; &amp;quot; + cont.LastName,&amp;nbsp; // Utilizzo Let per generare una &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // variabile all&amp;#39;interno della query che contiene &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // direttamente il TreeNode da inseride nella TreeView&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetNodes(empl.EmployeeID))&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Il TreeNode accetta un array di childs. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Inseriamo una chiamata al metodo che stiamo scrivendo per rendere la &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // funzione ricorsiva. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select node;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Limitiamo la select all&amp;#39;elenco di nodi del ramo corrente. 
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return result.ToArray();&amp;nbsp;&amp;nbsp;&amp;nbsp; // Trasformiamo il tutto in un array di TreeNodes&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;p&gt;&amp;nbsp; }&lt;br /&gt;} 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;[/code]&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Ecco il risultato&lt;br /&gt;&lt;a href="http://dotnetumbria.org/blogs/possanzini/WindowsLiveWriter/EsploderelegerarchieconLinqtoSQL_F913/TreeForm_2.jpg"&gt;&lt;img style="BORDER-TOP-WIDTH:0px;BORDER-LEFT-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-RIGHT-WIDTH:0px;" height="484" alt="TreeForm" src="http://dotnetumbria.org/blogs/possanzini/WindowsLiveWriter/EsploderelegerarchieconLinqtoSQL_F913/TreeForm_thumb.jpg" width="444" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Allego il progetto VS2008. Per farlo funzionare vi serve il DB AdventureWorks che potete scaricare dal sito Microsoft. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetumbria.org/aggbug.aspx?PostID=277" width="1" height="1"&gt;</content><author><name>Paolo Possanzini</name><uri>http://dotnetumbria.org/members/Paolo-Possanzini/default.aspx</uri></author></entry><entry><title>Una query expression in Linq veramente lunga ed interessante</title><link rel="alternate" type="text/html" href="/blogs/possanzini/archive/2008/02/26/una-query-expression-in-linq-veramente-lunga-ed-interessante.aspx" /><id>/blogs/possanzini/archive/2008/02/26/una-query-expression-in-linq-veramente-lunga-ed-interessante.aspx</id><published>2008-02-26T14:06:01Z</published><updated>2008-02-26T14:06:01Z</updated><content type="html">&lt;p&gt;Vi riporto un link ad un post che potete trovare anche nei link della StartPage di VisualStudio. Sono rimasto senza parole. &lt;/p&gt; &lt;p&gt;&lt;a title="http://blogs.msdn.com/lukeh/archive/2007/10/01/taking-linq-to-objects-to-extremes-a-fully-linqified-raytracer.aspx" href="http://blogs.msdn.com/lukeh/archive/2007/10/01/taking-linq-to-objects-to-extremes-a-fully-linqified-raytracer.aspx"&gt;http://blogs.msdn.com/lukeh/archive/2007/10/01/taking-linq-to-objects-to-extremes-a-fully-linqified-raytracer.aspx&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetumbria.org/aggbug.aspx?PostID=256" width="1" height="1"&gt;</content><author><name>Paolo Possanzini</name><uri>http://dotnetumbria.org/members/Paolo-Possanzini/default.aspx</uri></author></entry><entry><title>Nuova area dedicata a Sql Server</title><link rel="alternate" type="text/html" href="/blogs/possanzini/archive/2008/02/20/nuova-area-dedicata-a-sql-server.aspx" /><id>/blogs/possanzini/archive/2008/02/20/nuova-area-dedicata-a-sql-server.aspx</id><published>2008-02-20T16:10:59Z</published><updated>2008-02-20T16:10:59Z</updated><content type="html">&lt;p&gt;Vi segnalo una nuova area dedicata a Tips e Best Practices per SQL Server 2005. &lt;/p&gt; &lt;p&gt;&lt;a title="http://dotnetumbria.org/blogs/sql_tips_practices/" href="http://dotnetumbria.org/blogs/sql_tips_practices/"&gt;http://dotnetumbria.org/blogs/sql_tips_practices/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Buona lettura. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetumbria.org/aggbug.aspx?PostID=240" width="1" height="1"&gt;</content><author><name>Paolo Possanzini</name><uri>http://dotnetumbria.org/members/Paolo-Possanzini/default.aspx</uri></author></entry></feed>