<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://dotnetumbria.org/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Paolo Possanzini</title><link>http://dotnetumbria.org/blogs/possanzini/default.aspx</link><description /><dc:language>it</dc:language><generator>CommunityServer 2008 (Build: 30417.1769)</generator><item><title>7° Workshop "Microsoft Office SharePoint Server - Tecnologia e strumenti per lo sviluppo e amministrazione"</title><link>http://dotnetumbria.org/blogs/possanzini/archive/2008/10/29/7-176-workshop-quot-microsoft-office-sharepoint-server-tecnologia-e-strumenti-per-lo-sviluppo-e-amministrazione-quot.aspx</link><pubDate>Wed, 29 Oct 2008 17:29:00 GMT</pubDate><guid isPermaLink="false">7c6ab959-8411-4d1b-a449-1796eac035b7:585</guid><dc:creator>Paolo Possanzini</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetumbria.org/blogs/possanzini/rsscomments.aspx?PostID=585</wfw:commentRss><comments>http://dotnetumbria.org/blogs/possanzini/archive/2008/10/29/7-176-workshop-quot-microsoft-office-sharepoint-server-tecnologia-e-strumenti-per-lo-sviluppo-e-amministrazione-quot.aspx#comments</comments><description>&lt;p&gt;Facciamo un grande in bocca al lupo per i nostri amici di &lt;a href="http://www.dotnetmarche.org" target="_blank" class="null"&gt;dotnetmarche&lt;/a&gt;, che domani in collaborazione con Microsoft e l&amp;#39;universit&amp;agrave; di Camerino, organizzano il 7 workshop su sharepoint. Ancora un grandissimo in bocca al lupo. &lt;br /&gt;Ecco il link alla pagina dell&amp;#39;evento : &lt;a href="http://dotnetmarche.org/eventi/Default.aspx?IDevento=23"&gt;http://dotnetmarche.org/eventi/Default.aspx?IDevento=23&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetumbria.org/aggbug.aspx?PostID=585" width="1" height="1"&gt;</description></item><item><title>Windows Azure ... un passo verso il Cloud computing.</title><link>http://dotnetumbria.org/blogs/possanzini/archive/2008/10/28/windows-azure-un-passo-verso-il-cloud-computing.aspx</link><pubDate>Tue, 28 Oct 2008 10:25:42 GMT</pubDate><guid isPermaLink="false">7c6ab959-8411-4d1b-a449-1796eac035b7:582</guid><dc:creator>Paolo Possanzini</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetumbria.org/blogs/possanzini/rsscomments.aspx?PostID=582</wfw:commentRss><comments>http://dotnetumbria.org/blogs/possanzini/archive/2008/10/28/windows-azure-un-passo-verso-il-cloud-computing.aspx#comments</comments><description>&lt;p&gt;Riporto una notizia che trovo molto importante per lo sviluppo futuro di applicazioni basate sui servizi. &lt;br /&gt;Microsoft in occasione del PDC ha presentato una nuovissima versione di windows : &lt;strong&gt;Windows Azure. &lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Il nuovissimo sistema operativo è studiato per supportare a livello di kernel il Cloud Computing. &lt;br /&gt;Sono già disponibili&amp;nbsp; SDK ed esempi su come l&amp;#39;infrastruttura funzionerà. &lt;/p&gt; &lt;p&gt;La cosa mi intriga parecchio perchè il cloud computing è una cosa che mi affascina da parecchio tempo. Avere a disposizione una infrastruttura in grado di supportarlo permette la creazione di applicazioni sicuramente più interessanti. &lt;br /&gt;Vediamo come evolverà il progetto. Vi riporto il link al sito ufficiale dove è già possibile scaricare dei preview SDK ed esempi. &lt;/p&gt; &lt;p&gt;&lt;a title="http://www.microsoft.com/azure/default.mspx" href="http://www.microsoft.com/azure/default.mspx"&gt;http://www.microsoft.com/azure/default.mspx&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetumbria.org/aggbug.aspx?PostID=582" width="1" height="1"&gt;</description></item><item><title>Custom Linq Provider (parte 2)</title><link>http://dotnetumbria.org/blogs/possanzini/archive/2008/10/20/custom-linq-provider-parte-2.aspx</link><pubDate>Mon, 20 Oct 2008 20:47:40 GMT</pubDate><guid isPermaLink="false">7c6ab959-8411-4d1b-a449-1796eac035b7:571</guid><dc:creator>Paolo Possanzini</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetumbria.org/blogs/possanzini/rsscomments.aspx?PostID=571</wfw:commentRss><comments>http://dotnetumbria.org/blogs/possanzini/archive/2008/10/20/custom-linq-provider-parte-2.aspx#comments</comments><description>&lt;p&gt;Continuiamo a vedere come implementare un provider custom che supporta la sintassi Linq. &lt;/p&gt; &lt;p&gt;Per prima cosa creiamo un oggetto che implementa le interfacce IQueryable e IQueryProvider. Ecco una prima implementazione : &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;p&gt;namespace CustomLinqProvider&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; public class myQueryableObject&amp;lt;T&amp;gt; : IQueryable, IQueryable&amp;lt;T&amp;gt;, IQueryProvider&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private System.Linq.Expressions.Expression _expression = null;  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region IQueryable Members  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Type ElementType&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return typeof(T); }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public System.Linq.Expressions.Expression Expression&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _expression; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; internal set { _expression = value; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public IQueryProvider Provider&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return this; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region IEnumerable Members  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public System.Collections.IEnumerator GetEnumerator()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new NotImplementedException();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region IEnumerable&amp;lt;T&amp;gt; Members  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IEnumerator&amp;lt;T&amp;gt; IEnumerable&amp;lt;T&amp;gt;.GetEnumerator()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new NotImplementedException();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region IQueryProvider Members  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public IQueryable&amp;lt;TElement&amp;gt; CreateQuery&amp;lt;TElement&amp;gt;(System.Linq.Expressions.Expression expression)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; myQueryableObject&amp;lt;TElement&amp;gt; mq = new myQueryableObject&amp;lt;TElement&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mq.Expression = expression;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return mq;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public IQueryable CreateQuery(System.Linq.Expressions.Expression expression)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return CreateQuery&amp;lt;T&amp;gt;(expression);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public TResult Execute&amp;lt;TResult&amp;gt;(System.Linq.Expressions.Expression expression)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new NotImplementedException();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public object Execute(System.Linq.Expressions.Expression expression)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new NotImplementedException();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;}  &lt;p&gt;&amp;nbsp; &lt;p&gt;I metodi che per adesso ci interessano sono i due metodi CreateQuery. questi metodi vengono chiamati al termine della creazione della Expression Tree da parte del compilatore. La Expression Tree viene preparata e viene passata come oggetto Expression che può essere interpretato ed utilizzato per eseguire le nostre query.  &lt;p&gt;Come è possibile vedere non viene fatta alcun tipo di elaborazione, semplicemente la expression viene memorizzata all&amp;#39;interno del membro _expression e vine e restituito un oggetto dello stesso tipo che stiamo creando. Questo perchè è molto spesso conveniente implementare IQueryProvider e IQueryable all&amp;#39;interno della stessa classe. Capiremo tra poco il perchè.  &lt;p&gt;Abbiamo detto che i metodi CreateQuery vengono invocati appena la creazione della expression tree è completata, tuttavia non viene eseguita nessuna elaborazione. Il motivo di questa tardata esecuzione è che ancora non sappiamo come applicare l&amp;#39;Expression Tree; in modo particolare non sappiamo se dobbiamo attenderci un risultato singolo oppure una lista di elementi e il metodo che viene invocato per l&amp;#39;esecuzione della query potrebbe essere differente.  &lt;p&gt;Facciamo un esempio. Nella query  &lt;p&gt;&lt;strong&gt;var result = from rr in myQueryObject&amp;lt;tabella1&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; select rr;&lt;/strong&gt;&lt;br /&gt; &lt;p&gt;abbiamo definito che intendiamo ottenere tutti i campi della tabella 1 senza nessun filtro. Tuttavia l&amp;#39;esecuzione potrebbe essere eseguita in uno dei seguenti metodi:  &lt;p&gt;&lt;strong&gt;rr.ToArray();&lt;br /&gt;rr.Count();&lt;br /&gt;rr.FirstOrDefault();&lt;/strong&gt;  &lt;p&gt;Ognuno di questi metodi applica la query eseguendo operazioni differenti: &lt;br /&gt;La prima restituisce un risultato multiplo, la seconda esegue un raggruppamento su tutti i record per restituirci il numero di elementi all&amp;#39;interno della tabella, il terzo restituisce il primo elemento completo.  &lt;p&gt;&amp;nbsp; &lt;p&gt;Vediamo quindi come viene invocata l&amp;#39;esecuzione della query. &lt;br /&gt;La prima grande differenza tra i metodi che invocano la query è il tipo di risultato che andiamo ad ottenere.  &lt;p&gt;Se il risultato è un elenco di elementi, allora verranno invocati i metodi GetEnumerator() della nostra classe. &lt;br /&gt;Se invece il risultato è un elemento singolo, allora la query verrà arricchita con l&amp;#39;informazione della chiamata all&amp;#39;ultimo metodo e verrà invocato il metodo Execute().  &lt;p&gt;Tornando al nostro esempio, nel caso di ToArray() verà invocato il GetEnumerator, nel caso di Count() o di FirstOrDefault(), verrà aggiunto all&amp;#39;Expression Tree l&amp;#39;informazione della chiamata all&amp;#39;ultimo metodo e verrà effettivamente invocato il metodo Execute.  &lt;p&gt;Quindi per implementare il nostro parser, dovremo implementare sia i metodi Execute che i metodi GetEnumerator di cui abbiamo già gli stub pronti perchè abbiamo implementato le interfaccie.  &lt;p&gt;E comodo avere implementate entrambe le interfaccie all&amp;#39;interno della stessa classe, poichè il metodo GetEnumerator viene fornito dalla interfaccia IQueryable, mentre il metodo Execute viene fornito dalla interfaccia IQueryProvider.  &lt;p&gt;E&amp;#39; venuto il momento di capire l&amp;#39;Expression Tree e piegarla alla nostra volontà. L&amp;#39;Expression Tree è la rappresentazione a livello linguaggio delle operazioni che devono essere eseguite per ottenere un certo set di dati. &lt;br /&gt;Quello che vogliamo fare per prima cosa è capire come &amp;quot;leggere&amp;quot; l&amp;#39;expression tree, per poi interpretarla ed eseguire operazioni Custom.  &lt;p&gt;Scriviamo questa Query:  &lt;p&gt;&lt;strong&gt;myQueryableObject&amp;lt;int&amp;gt; test = new myQueryableObject&amp;lt;int&amp;gt;();&lt;br /&gt;var result = from i in test&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; select i;&lt;/strong&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;e vediamo come viene interpretata eseguendo &lt;strong&gt;result.Expression.ToString();&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;font color="#000080"&gt;value( &lt;font color="#008000"&gt;CustomLinqProvider.myQueryableObject`1[System.Int32]&lt;/font&gt; ).Select( &lt;font color="#008000"&gt;i =&amp;gt; i&lt;/font&gt; )&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt;  &lt;p&gt;&amp;nbsp; &lt;p&gt;quello che vediamo è la visualizzazione testuale dell&amp;#39;expression tree. come possiamo vedere ogni operazione viene esplicitata in modo del tutto simile alla chiamata a metodi. &lt;br /&gt;Quello che accade in realtà, è che ogni sezione della nostra espressione viene rappresentata attraverso un nodo della expression tree.  &lt;p&gt;Ogni nodo è composto da un oggetto che eredita dalla classe expression. L&amp;#39;oggetto specializza la classe base in modo da rappresentare in modo più fedele possibile il significato del nodo stesso. &lt;br /&gt;Vediamo quali sono gli oggetti che ereditano da Expression.  &lt;ul&gt; &lt;li&gt;BinaryExpression  &lt;li&gt;ConditionalExpression  &lt;li&gt;ConstantExpression  &lt;li&gt;InvocationExpression  &lt;li&gt;LambdaExpression  &lt;li&gt;ListInitExpression  &lt;li&gt;MemberExpression  &lt;li&gt;MemberInitExpression  &lt;li&gt;MethodCallExpression  &lt;li&gt;NewArrayExpression  &lt;li&gt;NewExpression  &lt;li&gt;ParameterExpression  &lt;li&gt;TypeBinaryExpression  &lt;li&gt;UnaryExpression&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&amp;nbsp; &lt;p&gt;Ognuno di questi oggetti rappresenta un particolare tipo di nodo all&amp;#39;interno della nostra espressione. Ogni classe può tuttavia rappresentare più di un tipo di nodo. &lt;br /&gt;I tipi possibili di nodo sono rappresentati da un Enum. &lt;pre&gt;public enum &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.Expressions.ExpressionType"&gt;ExpressionType&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/Add"&gt;Add&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/AddChecked"&gt;AddChecked&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/And"&gt;And&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/AndAlso"&gt;AndAlso&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/ArrayLength"&gt;ArrayLength&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/ArrayIndex"&gt;ArrayIndex&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/Call"&gt;Call&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/Coalesce"&gt;Coalesce&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/Conditional"&gt;Conditional&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/Constant"&gt;Constant&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/Convert"&gt;Convert&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/ConvertChecked"&gt;ConvertChecked&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/Divide"&gt;Divide&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/Equal"&gt;Equal&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/ExclusiveOr"&gt;ExclusiveOr&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/GreaterThan"&gt;GreaterThan&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/GreaterThanOrEqual"&gt;GreaterThanOrEqual&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/Invoke"&gt;Invoke&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/Lambda"&gt;Lambda&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/LeftShift"&gt;LeftShift&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/LessThan"&gt;LessThan&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/LessThanOrEqual"&gt;LessThanOrEqual&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/ListInit"&gt;ListInit&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/MemberAccess"&gt;MemberAccess&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/MemberInit"&gt;MemberInit&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/Modulo"&gt;Modulo&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/Multiply"&gt;Multiply&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/MultiplyChecked"&gt;MultiplyChecked&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/Negate"&gt;Negate&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/UnaryPlus"&gt;UnaryPlus&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/NegateChecked"&gt;NegateChecked&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/New"&gt;New&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/NewArrayInit"&gt;NewArrayInit&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/NewArrayBounds"&gt;NewArrayBounds&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/Not"&gt;Not&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/NotEqual"&gt;NotEqual&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/Or"&gt;Or&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/OrElse"&gt;OrElse&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/Parameter"&gt;Parameter&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/Power"&gt;Power&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/Quote"&gt;Quote&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/RightShift"&gt;RightShift&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/Subtract"&gt;Subtract&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/SubtractChecked"&gt;SubtractChecked&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/TypeAs"&gt;TypeAs&lt;/a&gt;&lt;/b&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.Expressions.ExpressionType/TypeIs"&gt;TypeIs&lt;/a&gt;&lt;/b&gt;
}
&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp; &lt;p&gt;Per interpretare in modo corretto quindi un Expression Tree è sufficiente navigare l&amp;#39;albero e interpretare ogni tipo di nodo. Nel prossimo post vedremo con scrivere in modo corretto un parser per interpretare l&amp;#39;expression tree. &lt;br /&gt;Vi consiglio di dare un&amp;#39;occhiata ai link che vi riporto. 
&lt;p&gt;Link utili : 
&lt;p&gt;&lt;a title="http://msdn.microsoft.com/en-us/library/bb882521.aspx" href="http://msdn.microsoft.com/en-us/library/bb882521.aspx"&gt;http://msdn.microsoft.com/en-us/library/bb882521.aspx&lt;/a&gt;&lt;br /&gt;&lt;a title="http://msdn.microsoft.com/en-us/library/bb882536.aspx" href="http://msdn.microsoft.com/en-us/library/bb882536.aspx"&gt;http://msdn.microsoft.com/en-us/library/bb882536.aspx&lt;/a&gt;&lt;br /&gt;&lt;a title="http://msdn.microsoft.com/en-us/library/bb397951.aspx" href="http://msdn.microsoft.com/en-us/library/bb397951.aspx"&gt;http://msdn.microsoft.com/en-us/library/bb397951.aspx&lt;/a&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetumbria.org/aggbug.aspx?PostID=571" width="1" height="1"&gt;</description></item><item><title>070-432 : MS SQL Server 2008, Implementation and Maintenance -&gt; Passed.</title><link>http://dotnetumbria.org/blogs/possanzini/archive/2008/10/09/070-432-ms-sql-server-2008-implementation-and-maintenance-gt-passed.aspx</link><pubDate>Thu, 09 Oct 2008 05:13:16 GMT</pubDate><guid isPermaLink="false">7c6ab959-8411-4d1b-a449-1796eac035b7:552</guid><dc:creator>Paolo Possanzini</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetumbria.org/blogs/possanzini/rsscomments.aspx?PostID=552</wfw:commentRss><comments>http://dotnetumbria.org/blogs/possanzini/archive/2008/10/09/070-432-ms-sql-server-2008-implementation-and-maintenance-gt-passed.aspx#comments</comments><description>&lt;p&gt;Passato l&amp;#39;esame per l&amp;#39;implementazione e la manutenzione dei DB in SQL Server 2008 .. :D &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetumbria.org/aggbug.aspx?PostID=552" width="1" height="1"&gt;</description></item><item><title>Custom Linq Provider (parte 1)</title><link>http://dotnetumbria.org/blogs/possanzini/archive/2008/10/03/custom-linq-provider-parte-1.aspx</link><pubDate>Fri, 03 Oct 2008 11:25:00 GMT</pubDate><guid isPermaLink="false">7c6ab959-8411-4d1b-a449-1796eac035b7:544</guid><dc:creator>Paolo Possanzini</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetumbria.org/blogs/possanzini/rsscomments.aspx?PostID=544</wfw:commentRss><comments>http://dotnetumbria.org/blogs/possanzini/archive/2008/10/03/custom-linq-provider-parte-1.aspx#comments</comments><description>&lt;p&gt;Diciamo che il rientro dalle ferie &amp;egrave; stato pi&amp;ugrave; duro del previsto. In questo tempo per&amp;ograve; ho avuto modo di approfondire alcuni argomenti piuttosto interessanti legati alla programmazione con il framework 3.5 in modo particolare con &lt;b&gt;Linq&lt;/b&gt;. &lt;/p&gt;
&lt;p&gt;Facendo una veloce ricerca su google possiamo accorgerci che le implementazioni &lt;b&gt;custom&lt;/b&gt; di &lt;b&gt;linq&lt;/b&gt; 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&amp;ograve; venire in mente. Questo &amp;egrave; possibile perch&amp;egrave; la sintassi introdotta con il framework 3.5 e che abbiamo visto utilizzare in LinqtoSql o in LinqtoXml non &amp;egrave; legata alla implementazione di alcune librerie di accesso ai dati di Microsoft, ma &amp;egrave; 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 &amp;egrave; sufficiente reimplementare le interfaccie di base per rendere i nostri oggetti pienamente compatibili con la sintassi &lt;b&gt;Linq&lt;/b&gt;. &lt;/p&gt;
&lt;p&gt;L&amp;#39;obiettivo di questo articolo &amp;egrave; di comprendere come &lt;b&gt;Linq&lt;/b&gt; viene interpretato a livello di compilatore e come viene utilizzato per effettuare ricerche sui dati. Arriveremo anche customizzare il comportamento di &lt;b&gt;Linq&lt;/b&gt; per effettuare query su fonti dati non tradizionali. In TeamDev abbiamo seguito questo approccio per estendere le funzionalit&amp;agrave; del nostro layer di accesso ai dati al fine di sfruttare le interessantissime caratteristiche della sintassi &lt;b&gt;Linq&lt;/b&gt;. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&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 &lt;b&gt;linq&lt;/b&gt; 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 &lt;b&gt;Linq&lt;/b&gt;. Comprendere come il compilatore utilizza le interfaccie, aiuta a comprendere come &lt;b&gt;Linq&lt;/b&gt; funziona e come possiamo customizzarne il comportamento. &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; &lt;/pre&gt;
&lt;p&gt;IEnumerable &amp;egrave; 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 &lt;b&gt;Linq&lt;/b&gt; utilizza IEnumerable per effettuare le query che coinvolgono collection e liste, questo ci lascia intuire che tutti i foreach possono essere trasformati in query &lt;b&gt;Linq&lt;/b&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;&lt;b&gt;Provider&lt;/b&gt;&lt;/a&gt;&lt;/b&gt; { get; }
}&lt;/pre&gt;
&lt;pre&gt; &lt;/pre&gt;
&lt;p&gt;IQueryable &amp;egrave; 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 &lt;b&gt;linq&lt;/b&gt; 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 &lt;b&gt;custom&lt;/b&gt; su oggetti di ogni tipo. &lt;/p&gt;
&lt;p&gt;Tutto questo &amp;egrave; possibile grazie alla classe Expression e alla interfaccia IQueryProvider esposte attraverso IQueryable &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&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 &lt;b&gt;linq&lt;/b&gt; viene trasformata dal compilatore in un oggetto di tipo Expression (detto anche ExpressionTree , perch&amp;egrave; ha una struttra ad albero). &lt;br /&gt;L&amp;#39;oggetto Expression viene passato ad un &lt;b&gt;provider&lt;/b&gt; che provvede ad interpretarlo e restituir&amp;agrave; un risultato coerente con la query effettuata. &lt;/p&gt;
&lt;p&gt;Quando utilizzata con IEnumerable, la query &lt;b&gt;linq&lt;/b&gt; viene immediatamente eseguita attraverso degli extension methods che estendono le funzionalit&amp;agrave; della interfaccia IEnumerable. &lt;/p&gt;
&lt;p&gt;E facile intuire quindi che per customizzare il comportamento delle query &lt;b&gt;Linq&lt;/b&gt; dobbiamo implementare una delle suddette interfaccie. &lt;br /&gt;Agendo con Reflector ci accorgiamo anche che il modo pi&amp;ugrave; corretto per intervenire &amp;egrave; utilizzare IQueryable piuttosto che IEnumerable, questo perch&amp;egrave; IEnumerable ha lo scopo di effettuare operazioni in memoria, cosa che probabilmente vorremo continuare a fare. &lt;/p&gt;
&lt;p&gt;IQueryable invece &amp;egrave; pensata per agire fuori dal contesto dell&amp;#39;applicazione e quindi &amp;egrave; l&amp;#39;interfaccia che meglio si presta alla realizzazione di &lt;b&gt;provider&lt;/b&gt; &lt;b&gt;custom&lt;/b&gt; per l&amp;#39;accesso ai dati. &lt;/p&gt;
&lt;p&gt;Nel prossimo post vedremo come &amp;egrave; strutturata la classe Expression e come creare un parser per tradurre le Expression Tree in tutto ci&amp;ograve; 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;</description></item><item><title>Book Review: Beginning Web Development, Silverlight, and ASP.NET Ajax</title><link>http://dotnetumbria.org/blogs/possanzini/archive/2008/08/22/book-review-beginning-web-development-silverlight-and-asp-net-ajax.aspx</link><pubDate>Fri, 22 Aug 2008 09:57:00 GMT</pubDate><guid isPermaLink="false">7c6ab959-8411-4d1b-a449-1796eac035b7:525</guid><dc:creator>Paolo Possanzini</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetumbria.org/blogs/possanzini/rsscomments.aspx?PostID=525</wfw:commentRss><comments>http://dotnetumbria.org/blogs/possanzini/archive/2008/08/22/book-review-beginning-web-development-silverlight-and-asp-net-ajax.aspx#comments</comments><description>&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;</description></item><item><title>[OT] TS: MS .NET Framework 3.5, ADO .NET Application Development --&gt; Passed</title><link>http://dotnetumbria.org/blogs/possanzini/archive/2008/07/23/ot-ts-ms-net-framework-3-5-ado-net-application-development-gt-passed.aspx</link><pubDate>Wed, 23 Jul 2008 20:31:00 GMT</pubDate><guid isPermaLink="false">7c6ab959-8411-4d1b-a449-1796eac035b7:469</guid><dc:creator>Paolo Possanzini</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetumbria.org/blogs/possanzini/rsscomments.aspx?PostID=469</wfw:commentRss><comments>http://dotnetumbria.org/blogs/possanzini/archive/2008/07/23/ot-ts-ms-net-framework-3-5-ado-net-application-development-gt-passed.aspx#comments</comments><description>&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;</description></item><item><title>Uno snippet per le DependencyProperty su WPF</title><link>http://dotnetumbria.org/blogs/possanzini/archive/2008/05/27/uno-snippet-per-le-dependencyproperty-su-wpf.aspx</link><pubDate>Tue, 27 May 2008 07:59:00 GMT</pubDate><guid isPermaLink="false">7c6ab959-8411-4d1b-a449-1796eac035b7:376</guid><dc:creator>Paolo Possanzini</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetumbria.org/blogs/possanzini/rsscomments.aspx?PostID=376</wfw:commentRss><comments>http://dotnetumbria.org/blogs/possanzini/archive/2008/05/27/uno-snippet-per-le-dependencyproperty-su-wpf.aspx#comments</comments><description>&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;</description><enclosure url="http://dotnetumbria.org/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.00.03.76/propdpf.snippet" length="2166" type="text/xml" /></item><item><title>WPF - VS 2008 {Community} Launch - Il Codice della demo</title><link>http://dotnetumbria.org/blogs/possanzini/archive/2008/05/12/wpf-vs-2008-community-launch-il-codice-della-demo.aspx</link><pubDate>Mon, 12 May 2008 00:24:00 GMT</pubDate><guid isPermaLink="false">7c6ab959-8411-4d1b-a449-1796eac035b7:354</guid><dc:creator>Paolo Possanzini</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetumbria.org/blogs/possanzini/rsscomments.aspx?PostID=354</wfw:commentRss><comments>http://dotnetumbria.org/blogs/possanzini/archive/2008/05/12/wpf-vs-2008-community-launch-il-codice-della-demo.aspx#comments</comments><description>&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;</description><enclosure url="http://dotnetumbria.org/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.00.03.54/WpfPresentation_5F00_Media4.rar" length="153910" type="application/octet-stream" /><category domain="http://dotnetumbria.org/blogs/possanzini/archive/tags/WPF/default.aspx">WPF</category><category domain="http://dotnetumbria.org/blogs/possanzini/archive/tags/XAML/default.aspx">XAML</category></item><item><title>WPF: Costruiamo un RSS Reader passo 4 (ListView)</title><link>http://dotnetumbria.org/blogs/possanzini/archive/2008/05/11/wpf-costruiamo-un-rss-reader-passo-4-listview.aspx</link><pubDate>Sun, 11 May 2008 21:24:00 GMT</pubDate><guid isPermaLink="false">7c6ab959-8411-4d1b-a449-1796eac035b7:353</guid><dc:creator>Paolo Possanzini</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetumbria.org/blogs/possanzini/rsscomments.aspx?PostID=353</wfw:commentRss><comments>http://dotnetumbria.org/blogs/possanzini/archive/2008/05/11/wpf-costruiamo-un-rss-reader-passo-4-listview.aspx#comments</comments><description>&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;</description><enclosure url="http://dotnetumbria.org/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.00.03.53/WpfRssReader.rar" length="88998" type="application/octet-stream" /></item><item><title>WPF: Costruiamo un RSS Reader passo 3 (TreeView)</title><link>http://dotnetumbria.org/blogs/possanzini/archive/2008/04/23/wpf-costruiamo-un-rss-reader-passo-3-treeview.aspx</link><pubDate>Wed, 23 Apr 2008 12:47:12 GMT</pubDate><guid isPermaLink="false">7c6ab959-8411-4d1b-a449-1796eac035b7:336</guid><dc:creator>Paolo Possanzini</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetumbria.org/blogs/possanzini/rsscomments.aspx?PostID=336</wfw:commentRss><comments>http://dotnetumbria.org/blogs/possanzini/archive/2008/04/23/wpf-costruiamo-un-rss-reader-passo-3-treeview.aspx#comments</comments><description>&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;</description></item><item><title>WPF: Costruiamo un RSS Reader passo 2 (L'interfaccia utente)</title><link>http://dotnetumbria.org/blogs/possanzini/archive/2008/04/21/wpf-costruiamo-un-rss-reader-passo-2-l-interfaccia-utente.aspx</link><pubDate>Mon, 21 Apr 2008 07:30:24 GMT</pubDate><guid isPermaLink="false">7c6ab959-8411-4d1b-a449-1796eac035b7:335</guid><dc:creator>Paolo Possanzini</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetumbria.org/blogs/possanzini/rsscomments.aspx?PostID=335</wfw:commentRss><comments>http://dotnetumbria.org/blogs/possanzini/archive/2008/04/21/wpf-costruiamo-un-rss-reader-passo-2-l-interfaccia-utente.aspx#comments</comments><description>&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;</description><category domain="http://dotnetumbria.org/blogs/possanzini/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://dotnetumbria.org/blogs/possanzini/archive/tags/WPF/default.aspx">WPF</category></item><item><title>WPF: Costruiamo un RSS Reader passo 1 (utilizzare Microsoft.Feeds.dll)</title><link>http://dotnetumbria.org/blogs/possanzini/archive/2008/04/19/wpf-costruiamo-un-rss-reader-parte-1-di-n.aspx</link><pubDate>Sat, 19 Apr 2008 20:44:00 GMT</pubDate><guid isPermaLink="false">7c6ab959-8411-4d1b-a449-1796eac035b7:334</guid><dc:creator>Paolo Possanzini</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetumbria.org/blogs/possanzini/rsscomments.aspx?PostID=334</wfw:commentRss><comments>http://dotnetumbria.org/blogs/possanzini/archive/2008/04/19/wpf-costruiamo-un-rss-reader-parte-1-di-n.aspx#comments</comments><description>&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;</description><category domain="http://dotnetumbria.org/blogs/possanzini/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://dotnetumbria.org/blogs/possanzini/archive/tags/WPF/default.aspx">WPF</category></item><item><title>WPF Performance Tuning</title><link>http://dotnetumbria.org/blogs/possanzini/archive/2008/04/17/wpf-performance-tuning.aspx</link><pubDate>Thu, 17 Apr 2008 10:11:21 GMT</pubDate><guid isPermaLink="false">7c6ab959-8411-4d1b-a449-1796eac035b7:331</guid><dc:creator>Paolo Possanzini</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetumbria.org/blogs/possanzini/rsscomments.aspx?PostID=331</wfw:commentRss><comments>http://dotnetumbria.org/blogs/possanzini/archive/2008/04/17/wpf-performance-tuning.aspx#comments</comments><description>&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;</description></item><item><title>C# ReaderWriterLock</title><link>http://dotnetumbria.org/blogs/possanzini/archive/2008/04/14/c-readerwriterlock.aspx</link><pubDate>Mon, 14 Apr 2008 17:30:53 GMT</pubDate><guid isPermaLink="false">7c6ab959-8411-4d1b-a449-1796eac035b7:327</guid><dc:creator>Paolo Possanzini</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnetumbria.org/blogs/possanzini/rsscomments.aspx?PostID=327</wfw:commentRss><comments>http://dotnetumbria.org/blogs/possanzini/archive/2008/04/14/c-readerwriterlock.aspx#comments</comments><description>&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;</description></item></channel></rss>