<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1721873273354099129</id><updated>2012-01-24T15:00:00.305+01:00</updated><category term='BING'/><category term='LINQ'/><category term='Mobile'/><category term='Windows Forms'/><category term='LightSwitch'/><category term='Team Foundation Server'/><category term='Windows 8'/><category term='DotNetRomaCestà'/><category term='MVC'/><category term='FT Toolkit'/><category term='Kinect'/><category term='RIA Applications'/><category term='IE9'/><category term='TFS'/><category term='Code Contracts'/><category term='Articoli'/><category term='Eventi'/><category term='VB.NET'/><category term='.NET Framework'/><category term='Windows Live'/><category term='Recensioni'/><category term='Visual Studio 2010'/><category term='triggers'/><category term='Caliburn.Micro'/><category term='ASP.NET'/><category term='Roslyn'/><category term='Visual Studio 11'/><category term='Windows Phone 7'/><category term='Web Development'/><category term='Visual Studio 2008'/><category term='Community'/><category term='DomusDotNet'/><category term='wp7'/><category term='Tip'/><category term='WCF'/><category term='action'/><category term='Varie'/><category term='Formazione'/><category term='Marketplace'/><category term='Tools'/><category term='Windows Azure'/><category term='T-SQL'/><category term='WPF'/><category term='Entity Framework'/><category term='Silverlight'/><category term='Windows 7'/><category term='Annunci'/><title type='text'>Code Tailor</title><subtitle type='html'>Quando programmare è un pò ricamare!!!</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default?start-index=101&amp;max-results=100'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>340</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-1762010061710880997</id><published>2012-01-24T15:00:00.001+01:00</published><updated>2012-01-24T15:00:00.343+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Annunci'/><category scheme='http://www.blogger.com/atom/ns#' term='Community'/><category scheme='http://www.blogger.com/atom/ns#' term='FT Toolkit'/><title type='text'>FTToolkit: Intervista sul blog Fotolia</title><content type='html'>&lt;p&gt;Vi segnalo una mia intervista pubblicata sul blog di &lt;a href="http://it.fotolia.com/partner/175559" target="_blank"&gt;Fotolia&lt;/a&gt; all’indirizzo:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://blog.fotolia.com/it/2012/01/23/intervista-a-massimo-bonanni/" href="http://blog.fotolia.com/it/2012/01/23/intervista-a-massimo-bonanni/"&gt;http://blog.fotolia.com/it/2012/01/23/intervista-a-massimo-bonanni/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;relativa al mio progetto open-source FTToolkit (&lt;a href="http://fttk.codeplex.com"&gt;http://fttk.codeplex.com&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;Sono veramente contento di questo apprezzamento da parte di una piattaforma di servizi (quella di Fotolia) orientata all’open source non-Microsoft.&lt;/p&gt;  &lt;p&gt;Prossimamente nuovi aggiornamenti sul toolkit e sui samples.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-1762010061710880997?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/1762010061710880997/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=1762010061710880997&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/1762010061710880997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/1762010061710880997'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2012/01/fttoolkit-intervista-sul-blog-fotolia.html' title='FTToolkit: Intervista sul blog Fotolia'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-8288165105361301299</id><published>2012-01-16T12:40:00.001+01:00</published><updated>2012-01-16T12:40:47.220+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Annunci'/><title type='text'>Guest post su MSDN per Translation Machine</title><content type='html'>&lt;p&gt;Vi segnalo il mio Guest Post su MSDN relativo alla Machine Translation di Microsoft:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://blogs.msdn.com/b/italy/archive/2012/01/16/guest-post-microsoft-translator-traduzioni-automatiche-o-quasi-semplici.aspx" href="http://blogs.msdn.com/b/italy/archive/2012/01/16/guest-post-microsoft-translator-traduzioni-automatiche-o-quasi-semplici.aspx"&gt;http://blogs.msdn.com/b/italy/archive/2012/01/16/guest-post-microsoft-translator-traduzioni-automatiche-o-quasi-semplici.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:5efc0817-a536-4720-9346-8ce8e2acc21c" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/MSDN" rel="tag"&gt;MSDN&lt;/a&gt;,&lt;a href="http://technorati.com/tags/guest+post" rel="tag"&gt;guest post&lt;/a&gt;,&lt;a href="http://technorati.com/tags/machine+translation" rel="tag"&gt;machine translation&lt;/a&gt;,&lt;a href="http://technorati.com/tags/translation" rel="tag"&gt;translation&lt;/a&gt;,&lt;a href="http://technorati.com/tags/bing" rel="tag"&gt;bing&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-8288165105361301299?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/8288165105361301299/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=8288165105361301299&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/8288165105361301299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/8288165105361301299'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2012/01/guest-post-su-msdn-per-translation.html' title='Guest post su MSDN per Translation Machine'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-640294675418896213</id><published>2012-01-04T12:57:00.001+01:00</published><updated>2012-01-04T12:57:09.618+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Annunci'/><category scheme='http://www.blogger.com/atom/ns#' term='FT Toolkit'/><title type='text'>Rilasciata la versione 1.1 di FTTK</title><content type='html'>&lt;p&gt;E' stata rilasciata la versione 1.1 di FTTK (FT Toolkit), il progetto open source per l'integrazione con la piattaforma &lt;a href="http://it.fotolia.com/partner/175559" target="_blank"&gt;Fotolia&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Il toolkit esegue un wrapping delle API (sia in formato REST che XmlRPC) esposte da Fotolia (&lt;a href="http://it.fotolia.com/Services/API/Introduction" target="_blank"&gt;documentazione&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;Il toolkit è composto da tre assembly distinti:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;FTTK.Core&lt;/strong&gt;: contiene le interfacce e le entità dell'Object Model Fotolia.&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;scaricare tramite &lt;a href="https://www.nuget.org/packages/FTTK.Core" target="_blank"&gt;Nuget&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;scaricare tramite &lt;a href="http://fttk.codeplex.com/releases/view/79899" target="_blank"&gt;CodePlex&lt;/a&gt;&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;&lt;strong&gt;FTTK.Rest&lt;/strong&gt;: contiene l'implementazione dei servizi di accesso alla piattaforma Fotolia tramite protocollo REST.&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;scaricare tramite &lt;a href="https://www.nuget.org/packages/FTTK.Rest" target="_blank"&gt;Nuget&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;scaricare tramite &lt;a href="http://fttk.codeplex.com/releases/view/79900" target="_blank"&gt;CodePlex&lt;/a&gt;&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;&lt;strong&gt;FTTK.XmlRpc&lt;/strong&gt;: fornisce l'implementazione dei servizi di accesso alla piattaforma Fotolia tramite protocollo XmlRpc. Questa libreria diventerà obsoleta con i prossimi rilasci poiché i servizi esposti da Fotolia stessa in XmlRpc verranno abbandonati.&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;scaricare tramite &lt;a href="http://www.nuget.org/List/Packages/FTTK.XmlRpc" target="_blank"&gt;Nuget&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;scaricare tramite &lt;a href="http://fttk.codeplex.com/releases/view/79902" target="_blank"&gt;CodePlex&lt;/a&gt;&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;p&gt;Le novità più importanti, oltre alla pubblicazione della versione REST, è il supporto per Silverlight 4.0 e Windows Phone 7 (mango) (attualmente solo per FTTK.Core).&lt;/p&gt;  &lt;p&gt;Prossimamente verrà rilasciato anche FTTK.Rest per WP7 e dei progetti di esempio sull'utilizzo.&lt;/p&gt;  &lt;p&gt;Il sito ufficiale del progetto è &lt;a href="http://fttk.codeplex.com"&gt;http://fttk.codeplex.com&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:869a034a-071b-44c1-82d9-8e4c03764866" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/fotolia+toolkit" rel="tag"&gt;fotolia toolkit&lt;/a&gt;,&lt;a href="http://technorati.com/tags/fotolia" rel="tag"&gt;fotolia&lt;/a&gt;,&lt;a href="http://technorati.com/tags/fotolia+API" rel="tag"&gt;fotolia API&lt;/a&gt;,&lt;a href="http://technorati.com/tags/api+rest" rel="tag"&gt;api rest&lt;/a&gt;,&lt;a href="http://technorati.com/tags/api+xmlrpc" rel="tag"&gt;api xmlrpc&lt;/a&gt;,&lt;a href="http://technorati.com/tags/ft+toolkit" rel="tag"&gt;ft toolkit&lt;/a&gt;,&lt;a href="http://technorati.com/tags/fttk" rel="tag"&gt;fttk&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-640294675418896213?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/640294675418896213/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=640294675418896213&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/640294675418896213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/640294675418896213'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2012/01/rilasciata-la-versione-11-di-fttk.html' title='Rilasciata la versione 1.1 di FTTK'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-5259273457495233391</id><published>2012-01-02T09:29:00.001+01:00</published><updated>2012-01-02T09:29:36.580+01:00</updated><title type='text'>MVP: two in a row!!!!</title><content type='html'>&lt;p&gt;Sono onorato di aver ricevuto anche quest’anno l'MVP Award da parte di Microsoft.&lt;/p&gt;  &lt;p&gt;Se possibile, la seconda volta è più emozionante della prima (che, in ogni caso, rimane indimenticabile).&lt;/p&gt;  &lt;p&gt;Un anno da MVP in cui ho conosciuto persone nuove, dato volti a nomi che avevo solo letto su internet e potuto condividere esperienze altrimenti impossibili (vedi l’MVP Summit a Seattle).&lt;/p&gt;  &lt;p&gt;Debbo ringraziare &lt;a href="http://www.domusdotnet.org" target="_blank"&gt;DomusDotNet&lt;/a&gt; senza la quale, difficilmente, sarei riuscito ad ottenere tutto questo e i ragazzi che la compongono (che mi sopportano)!!!&lt;/p&gt;  &lt;p&gt;Un particolare ringraziamento va a tutti coloro che hanno creduto in me (non c’è la necessità di fare nomi) e che provvederò a ringraziare di persona.&lt;/p&gt;  &lt;p&gt;Diventare MVP è un onore: dissi lo scorso anno che è come andare a giocare in Nazionale, ma essere confermato è veramente fantastico.&lt;/p&gt;  &lt;p&gt;E’ come una droga, una volta che sei MVP, fai del tutto per essere riconfermato!!! &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Sorriso" src="http://lh5.ggpht.com/-WY100zy6RJg/TwFq75EcxrI/AAAAAAAAA_E/GqbkqDUEMbY/wlEmoticon-smile%25255B2%25255D.png?imgmax=800" /&gt;&lt;/p&gt;  &lt;p&gt;Veramente una grande FAMIGGHIA!!!!&lt;/p&gt;  &lt;p&gt;Grazie!!!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:80ce2f40-3e75-46b9-bc9e-2890b8ddbf3e" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/mvp" rel="tag"&gt;mvp&lt;/a&gt;,&lt;a href="http://technorati.com/tags/mvp+award" rel="tag"&gt;mvp award&lt;/a&gt;,&lt;a href="http://technorati.com/tags/mvp+2012" rel="tag"&gt;mvp 2012&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-5259273457495233391?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/5259273457495233391/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=5259273457495233391&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/5259273457495233391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/5259273457495233391'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2012/01/mvp-two-in-row.html' title='MVP: two in a row!!!!'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/-WY100zy6RJg/TwFq75EcxrI/AAAAAAAAA_E/GqbkqDUEMbY/s72-c/wlEmoticon-smile%25255B2%25255D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-2571454592733188430</id><published>2011-12-19T08:00:00.000+01:00</published><updated>2011-12-19T08:00:11.872+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Tip'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2010'/><title type='text'>Deserializzazione JSON e costruttori: OnDeserialized e OnDeserializing</title><content type='html'>&lt;p&gt;In questo post vorrei illustrarvi l’utilizzo degli attributi OnDeserializingAttribute e OnDeserializedAttribute contenuti nel namespace System.Runtime.Serialization.&lt;/p&gt;  &lt;p&gt;Il loro scopo è quello di decorare dei metodi che verranno richiamati, rispettivamente, prima (OnDeserializing) e dopo (OnDeserialized) la deserializzazione di un oggetto tramite determinati serializzatori che vedremo più avanti.&lt;/p&gt;  &lt;p&gt;Vediamo il loro possibile utilizzo in caso di deserializzazione JSON.&lt;/p&gt;  &lt;p&gt;Supponiamo di avere il seguente JSON:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:cdefeea6-401b-46e3-b649-9696da2c21ef" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;{&amp;quot;nome&amp;quot;:&amp;quot;Giuseppe&amp;quot;,&amp;quot;cognome&amp;quot;:&amp;quot;Verdi&amp;quot;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;una possibile classe che permette la deserializzazione di tale JSON potrebbe essere:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:a6fc50e5-658b-4d5a-a524-d47df7ee20f3" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Imports&lt;/span&gt; System.Xml.Serialization&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;Imports&lt;/span&gt; System.Runtime.Serialization&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;DataContract&lt;/span&gt;()&amp;gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Persona&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt; &lt;span style="color:#0000ff"&gt;New&lt;/span&gt;()&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &amp;lt;&lt;span style="color:#2b91af"&gt;DataMember&lt;/span&gt;(Name:=&lt;span style="color:#a31515"&gt;&amp;quot;nome&amp;quot;&lt;/span&gt;)&amp;gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Property&lt;/span&gt; Nome &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;String&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &amp;lt;&lt;span style="color:#2b91af"&gt;DataMember&lt;/span&gt;(Name:=&lt;span style="color:#a31515"&gt;&amp;quot;cognome&amp;quot;&lt;/span&gt;)&amp;gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Property&lt;/span&gt; Cognome &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;String&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Private&lt;/span&gt; _DataCreazione &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;DateTime&lt;/span&gt; = &lt;span style="color:#2b91af"&gt;DateTime&lt;/span&gt;.Now&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;ReadOnly&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Property&lt;/span&gt; DataCreazione &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;DateTime&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;Get&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;Return&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Me&lt;/span&gt;._DataCreazione&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Get&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Property&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Class&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Ho inserito la proprietà che contiene la data di creazione dell’oggetto per dimostrare una cosa che vedremo tra poco.&lt;/p&gt;  &lt;p&gt;Prendiamo il seguente metodo che deserializza il JSON di cui sopra:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:9323c607-69b7-449f-ba3e-b12010981900" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Imports&lt;/span&gt; System.Xml.Serialization&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;Imports&lt;/span&gt; System.IO&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Imports&lt;/span&gt; System.Runtime.Serialization.Json&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;Imports&lt;/span&gt; System.Text&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;Module&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Module1&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt; Main()&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; persona &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Persona&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; serializer = &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;DataContractJsonSerializer&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color:#2b91af"&gt;Persona&lt;/span&gt;))&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;Using&lt;/span&gt; memStream = &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;MemoryStream&lt;/span&gt;(&lt;span style="color:#2b91af"&gt;Encoding&lt;/span&gt;.Default.GetBytes(GetJSON()))&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            persona = &lt;span style="color:#0000ff"&gt;CType&lt;/span&gt;(serializer.ReadObject(memStream), &lt;span style="color:#2b91af"&gt;Persona&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Using&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Private&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt; GetJSON() &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;String&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;Return&lt;/span&gt; &lt;span style="color:#a31515"&gt;&amp;quot;{&amp;quot;&amp;quot;nome&amp;quot;&amp;quot;:&amp;quot;&amp;quot;Giuseppe&amp;quot;&amp;quot;,&amp;quot;&amp;quot;cognome&amp;quot;&amp;quot;:&amp;quot;&amp;quot;Verdi&amp;quot;&amp;quot;}&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Module&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Se eseguiamo il metodo e ci fermiamo immediatamente dopo la deserializzazione (metodo ReadObject della classe DataContractJsonSerializer), otteniamo:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-t8BWbIxVuT4/TuzoPVGUiCI/AAAAAAAAA-c/JCV5JAoUa7w/s1600-h/image%25255B3%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/-APrk4sQRYLE/TuzoQooueYI/AAAAAAAAA-k/UdP8AUoq0D0/image_thumb%25255B1%25255D.png?imgmax=800" width="502" height="181" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;cioè la data di creazione non è stata impostata.&lt;/p&gt;  &lt;p&gt;Questo accade perché il serializzatore DataContractJsonSerializer (ma non è l’unico in quanto avviene anche con il DataContractSerializer, il NetDataContractSerializer e il BinaryFormatter) non richiama il costruttore.&lt;/p&gt;  &lt;p&gt;Quindi, se abbiamo dei valori di default da impostare o dei valori da assegnare alla creazione dell’oggetto, con la deserializzazione siamo fregati.&lt;/p&gt;  &lt;p&gt;E’ in questo scenario che ci vengono in aiuto i due attributi OnDeserializing e OnDeserialized:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:1bf7e619-f96a-495f-92f7-48dc9b530364" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Imports&lt;/span&gt; System.Xml.Serialization&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;Imports&lt;/span&gt; System.Runtime.Serialization&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;DataContract&lt;/span&gt;()&amp;gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Persona&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt; &lt;span style="color:#0000ff"&gt;New&lt;/span&gt;()&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &amp;lt;&lt;span style="color:#2b91af"&gt;DataMember&lt;/span&gt;(Name:=&lt;span style="color:#a31515"&gt;&amp;quot;nome&amp;quot;&lt;/span&gt;)&amp;gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Property&lt;/span&gt; Nome &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;String&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &amp;lt;&lt;span style="color:#2b91af"&gt;DataMember&lt;/span&gt;(Name:=&lt;span style="color:#a31515"&gt;&amp;quot;cognome&amp;quot;&lt;/span&gt;)&amp;gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Property&lt;/span&gt; Cognome &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;String&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Private&lt;/span&gt; _DataCreazione &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;DateTime&lt;/span&gt; = &lt;span style="color:#2b91af"&gt;DateTime&lt;/span&gt;.Now&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;ReadOnly&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Property&lt;/span&gt; DataCreazione &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;DateTime&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;Get&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;Return&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Me&lt;/span&gt;._DataCreazione&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Get&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Property&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &amp;lt;&lt;span style="color:#2b91af"&gt;OnDeserialized&lt;/span&gt;()&amp;gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt; OnDeserialized(context &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;StreamingContext&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &amp;lt;&lt;span style="color:#2b91af"&gt;OnDeserializing&lt;/span&gt;()&amp;gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt; OnDeserializing(context &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;StreamingContext&lt;/span&gt;)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;Me&lt;/span&gt;._DataCreazione = &lt;span style="color:#2b91af"&gt;DateTime&lt;/span&gt;.Now&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Class&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Il metodo decorato con Ondeserializing viene richiamato immediatamente prima della deserializzazione, mentre quello decorato con OnDeserialized immediatamente dopo.&lt;/p&gt;  &lt;p&gt;In questo modo, se rieseguiamo il metodo di prima in cui deserializziamo il JSON:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-8RsSMwsDGSg/TuzoRRli3aI/AAAAAAAAA-o/hSGqQxg34kc/s1600-h/image%25255B7%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-Il54ob97GFg/TuzoSa1-lfI/AAAAAAAAA-0/O35WINLVpsc/image_thumb%25255B3%25255D.png?imgmax=800" width="502" height="148" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;la data è effettivamente valorizzata.&lt;/p&gt;  &lt;p&gt;I metodi decorati con questi attributi debbono avere come argomento un oggetto di tipo StreamingContext e possono essere utilizzati per controllare la deserializzazione dei nostri oggetti:&lt;/p&gt;  &lt;p&gt;Ad esempio il seguente metodo solleva un’eccezione quando si tenta di serializzare oggetti in orari con minuti pari &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Sorriso" src="http://lh4.ggpht.com/-tk3__yjEbz0/TuzoTGa_tjI/AAAAAAAAA-4/K3IIz5ZqBzs/wlEmoticon-smile%25255B2%25255D.png?imgmax=800" /&gt; :&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:58aaccb7-207b-450e-87e8-955ebdf0d025" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;OnDeserializing&lt;/span&gt;()&amp;gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt; OnDeserializing(context &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;StreamingContext&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;If&lt;/span&gt; &lt;span style="color:#2b91af"&gt;DateTime&lt;/span&gt;.Now.Minute &lt;span style="color:#0000ff"&gt;Mod&lt;/span&gt; 2 = 0 &lt;span style="color:#0000ff"&gt;Then&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;Throw&lt;/span&gt; &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Exception&lt;/span&gt;()&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;If&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Me&lt;/span&gt;._DataCreazione = &lt;span style="color:#2b91af"&gt;DateTime&lt;/span&gt;.Now&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Esistono dei corrispettivi attributi OnSerializing e OnSerialized per le operazioni di serializzazione.&lt;/p&gt;      &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:8410409b-bcf5-484a-a862-bfc265e8d5c8" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/json" rel="tag"&gt;json&lt;/a&gt;,&lt;a href="http://technorati.com/tags/deserializzazione" rel="tag"&gt;deserializzazione&lt;/a&gt;,&lt;a href="http://technorati.com/tags/costruttori" rel="tag"&gt;costruttori&lt;/a&gt;,&lt;a href="http://technorati.com/tags/datacontractjsonserializer" rel="tag"&gt;datacontractjsonserializer&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Oonserializedattribute" rel="tag"&gt;Oonserializedattribute&lt;/a&gt;,&lt;a href="http://technorati.com/tags/onserializingattribute" rel="tag"&gt;onserializingattribute&lt;/a&gt;,&lt;a href="http://technorati.com/tags/ondeserializedattribute" rel="tag"&gt;ondeserializedattribute&lt;/a&gt;,&lt;a href="http://technorati.com/tags/ondeserializingattribute" rel="tag"&gt;ondeserializingattribute&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-2571454592733188430?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/2571454592733188430/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=2571454592733188430&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/2571454592733188430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/2571454592733188430'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/12/deserializzazione-json-e-costruttori.html' title='Deserializzazione JSON e costruttori: OnDeserialized e OnDeserializing'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/-APrk4sQRYLE/TuzoQooueYI/AAAAAAAAA-k/UdP8AUoq0D0/s72-c/image_thumb%25255B1%25255D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-1765504304477152598</id><published>2011-12-16T09:21:00.001+01:00</published><updated>2011-12-16T09:21:43.934+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Annunci'/><category scheme='http://www.blogger.com/atom/ns#' term='Eventi'/><category scheme='http://www.blogger.com/atom/ns#' term='DomusDotNet'/><category scheme='http://www.blogger.com/atom/ns#' term='Community'/><title type='text'>Community Days 2012 - Milano, 16 e 17 febbraio 2012</title><content type='html'>&lt;p&gt;DomusDotNet presenta, in collaborazione con le altre community ed user group italiani,   &lt;br /&gt;il maggior evento community dell'anno: 12 track spalmate su 2 giorni interamente dedicati alle ultime tecnologie, 4 lab ed i migliori speaker italiani.&lt;/p&gt;  &lt;p&gt;Windows 8, Windows Phone, Entity Framework, ASP.NET, .NET Framework 4.5 e Visual Studio 2011, applicazioni mobili, HTML 5 e tanto, tanto altro ancora!&lt;/p&gt;  &lt;p&gt;La partecipazione, come sempre, è totalmente gratuita. Le iscrizioni sono aperte e l'agenda è   &lt;br /&gt;disponibile sul sito. ISCRIVITI SUBITO!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.communitydays.it/events/communitydays-2012/" target="_blank"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="728x90" border="0" alt="728x90" src="http://lh4.ggpht.com/-YtqeWLX4IAE/Tur_lgmHn6I/AAAAAAAAA-U/Mpqu34md3H8/728x90%25255B3%25255D.jpg?imgmax=800" width="500" height="59" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:5a404169-f316-41bb-953f-201bfaa70eea" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/community+days" rel="tag"&gt;community days&lt;/a&gt;,&lt;a href="http://technorati.com/tags/evento" rel="tag"&gt;evento&lt;/a&gt;,&lt;a href="http://technorati.com/tags/community" rel="tag"&gt;community&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-1765504304477152598?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/1765504304477152598/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=1765504304477152598&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/1765504304477152598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/1765504304477152598'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/12/community-days-2012-milano-16-e-17.html' title='Community Days 2012 - Milano, 16 e 17 febbraio 2012'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/-YtqeWLX4IAE/Tur_lgmHn6I/AAAAAAAAA-U/Mpqu34md3H8/s72-c/728x90%25255B3%25255D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-8423963126118516861</id><published>2011-12-12T12:28:00.001+01:00</published><updated>2011-12-12T12:28:26.615+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Tip'/><title type='text'>Uguaglianza tra tipi in VB.NET</title><content type='html'>&lt;p&gt;Se abbiamo due istanze della classe Type e vogliamo verificare che tali istanze rappresentino effettivamente lo stesso tipo, possiamo procedere in due modi&lt;/p&gt;  &lt;p&gt;Siano Type1 e Type2 le due istanze di Type da controllare.&lt;/p&gt;  &lt;p&gt;Un primo modo è utilizzare l’operatore Is:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:6af9b0de-77cd-465b-b890-4e9f94e3a4e0" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;If&lt;/span&gt; Type1 &lt;span style="color:#0000ff"&gt;Is&lt;/span&gt; Type2 &lt;span style="color:#0000ff"&gt;Then&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#008000"&gt;&amp;#39; i tipi sono uguali&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Else&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#008000"&gt;&amp;#39; i tipi non sono uguali&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;If&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;In alternativa possiamo utilizzare il metodo statico (shared) Equals:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:c6ee28a6-cb42-4ca2-a71c-a45f8475bbcd" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;If&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Type&lt;/span&gt;.Equals(type1, type2) &lt;span style="color:#0000ff"&gt;Then&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#008000"&gt;&amp;#39; i tipi sono uguali&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Else&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#008000"&gt;&amp;#39; i tipi non sono uguali&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;If&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;In quest’ultimo caso, in realtà, stiamo utilizzando il metodo Equals (shared) di Object, la cui definizione è:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-Jx3MfrD3vB0/TuXlVt-1jvI/AAAAAAAAA-E/M8c3gp2mxDY/s1600-h/image%25255B3%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-l7VINi7NTrY/TuXlWTvFe0I/AAAAAAAAA-I/J1VGDyzAe9o/image_thumb%25255B1%25255D.png?imgmax=800" width="502" height="64" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;      &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:1a2ba908-18db-478e-aa8a-6acfcfb54bd0" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/Type" rel="tag"&gt;Type&lt;/a&gt;,&lt;a href="http://technorati.com/tags/vb.net" rel="tag"&gt;vb.net&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Equals" rel="tag"&gt;Equals&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-8423963126118516861?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/8423963126118516861/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=8423963126118516861&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/8423963126118516861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/8423963126118516861'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/12/uguaglianza-tra-tipi-in-vbnet.html' title='Uguaglianza tra tipi in VB.NET'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/-l7VINi7NTrY/TuXlWTvFe0I/AAAAAAAAA-I/J1VGDyzAe9o/s72-c/image_thumb%25255B1%25255D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-6485774009170276483</id><published>2011-11-28T13:22:00.001+01:00</published><updated>2011-11-28T13:22:15.089+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tip'/><category scheme='http://www.blogger.com/atom/ns#' term='LightSwitch'/><title type='text'>Aprire un file xml in un’applicazione LightSwitch</title><content type='html'>&lt;p&gt;Da qualche giorno sto lavorando con LightSwitch (ed il buon &lt;a href="http://community.visual-basic.it/alessandro/default.aspx" target="_blank"&gt;Alessandro&lt;/a&gt; sa quanto apprezzo il prodotto!!!) e la logica con cui si approccia alla soluzione di un problema, anche banale, di programmazione è piuttosto differente da chi proviene dalle applicazioni desktop classico.&lt;/p&gt;  &lt;p&gt;Ricordatevi sempre che stiamo parlando di Silverlight, quindi, già per questo, non date per scontato che possiate fare quello che volete, in più sotto LightSwitch.&lt;/p&gt;  &lt;p&gt;Per questo motivo, ogni volta che mi scontrerò con un problema da “desktoppiano” classico e riuscirò a venirne a capo, cercherò di postarlo qui. Probabilmente la soluzione sarà banale e puerile, ma magari potrà servire ad altri!!&lt;/p&gt;  &lt;p&gt;Detto questo, supponendo di voler aprire un file Xml e creare un oggetto &lt;a href="http://msdn.microsoft.com/it-it/library/system.xml.linq.xdocument.aspx" target="_blank"&gt;XDocument&lt;/a&gt; utilizzando il metodo statico &lt;a href="http://msdn.microsoft.com/it-it/library/bb343181.aspx" target="_blank"&gt;Load(String)&lt;/a&gt;, normalmente scriveremmo&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:c147e760-bb57-4372-b9d2-1153d01da6b6" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; xmlTemplate &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;XDocument&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;xmlTemplate = &lt;span style="color:#2b91af"&gt;XDocument&lt;/span&gt;.Load(fullFileName)&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;dove fullFileName è il nome completo (con tanto di path) del file xml da aprire.&lt;/p&gt;  &lt;p&gt;Questo funziona benissimo nelle nostre applicazioni desktop classiche ma non in LightSwitch che ci restituirà l’errore:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-qoPvTCEC7Hw/TtN88oo8kQI/AAAAAAAAA90/NBsUUkHbsCw/s1600-h/image%25255B3%25255D.png" target="_blank"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-uqeq-YvnTlY/TtN89fcSdoI/AAAAAAAAA94/uVthtoEqqok/image_thumb%25255B1%25255D.png?imgmax=800" width="500" height="87" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Per risolvere il problema è sufficiente utilizzare il metodo &lt;a href="http://msdn.microsoft.com/it-it/library/cc838321.aspx" target="_blank"&gt;Load(Stream, LoadOptions)&lt;/a&gt;:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:c86c0e0c-bf5f-4def-8e4b-1ca31119a77b" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; xmlTemplate &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;XDocument&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;Using&lt;/span&gt; fileStream = &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;FileStream&lt;/span&gt;(fileFullName, &lt;span style="color:#2b91af"&gt;FileMode&lt;/span&gt;.Open)&lt;/li&gt; &lt;li&gt;    xmlTemplate = &lt;span style="color:#2b91af"&gt;XDocument&lt;/span&gt;.Load(fileStream)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Using&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;In questo modo non otteniamo l’errore precedente e riusciamo a creare il nostro XDocument (a patto, ovviamente che il file sia ben formato).&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:efd2f737-b26a-4081-957b-ca4330c2ce21" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/lightswitch" rel="tag"&gt;lightswitch&lt;/a&gt;,&lt;a href="http://technorati.com/tags/xmlrpc" rel="tag"&gt;xmlrpc&lt;/a&gt;,&lt;a href="http://technorati.com/tags/aprire+xml" rel="tag"&gt;aprire xml&lt;/a&gt;,&lt;a href="http://technorati.com/tags/xdocument" rel="tag"&gt;xdocument&lt;/a&gt;,&lt;a href="http://technorati.com/tags/xdocument.load" rel="tag"&gt;xdocument.load&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-6485774009170276483?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/6485774009170276483/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=6485774009170276483&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/6485774009170276483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/6485774009170276483'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/11/aprire-un-file-xml-in-unapplicazione.html' title='Aprire un file xml in un’applicazione LightSwitch'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/-uqeq-YvnTlY/TtN89fcSdoI/AAAAAAAAA94/uVthtoEqqok/s72-c/image_thumb%25255B1%25255D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-4006262866086826524</id><published>2011-11-16T08:59:00.001+01:00</published><updated>2011-11-16T08:59:46.759+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Annunci'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2010'/><title type='text'>Rilasciata la versione 3 di Async CTP</title><content type='html'>&lt;p&gt;In attesa di avere, “di serie”, la programmazione asincrona a task all’interno di Visual Studio e del framework (sarà presente in Dev11), è stata rilasciata la versione 3 di Async CTP.&lt;/p&gt;  &lt;p&gt;Async CTP è un pacchetto che introduce la programmazione asincrona a task (che semplifica di molto la scrittura del codice multithread) all’interno di Visual Studio 2010.&lt;/p&gt;  &lt;p&gt;Async CTP, di fatto, introduce nuove parole chiave e tutta l’infrastruttura che permette al compilatore di gestirle.&lt;/p&gt;  &lt;p&gt;Per maggiori info sulla programmazione asincrona a task, vi consiglio il link: &lt;a title="http://msdn.microsoft.com/en-us/vstudio/gg316360" href="http://msdn.microsoft.com/en-us/vstudio/gg316360"&gt;http://msdn.microsoft.com/en-us/vstudio/gg316360&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Per il download del pacchetto di installazione di Async CTP 3, potete utilizzare il link: &lt;a title="http://www.microsoft.com/download/en/details.aspx?id=9983" href="http://www.microsoft.com/download/en/details.aspx?id=9983"&gt;http://www.microsoft.com/download/en/details.aspx?id=9983&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;La versione 3 di Async CTP è compatibile con le installazioni non in lingua inglese di VS, Silverlight 5 e Roslyn ed include una EULA (&lt;a title="http://it.wikipedia.org/wiki/EULA" href="http://it.wikipedia.org/wiki/EULA"&gt;http://it.wikipedia.org/wiki/EULA&lt;/a&gt;) che ne permette (ma non incoraggia) l’utilizzo della stessa in produzione.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:bea8d3d6-8bac-4ec8-9d0a-ff96e3912bcd" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/async+ctp" rel="tag"&gt;async ctp&lt;/a&gt;,&lt;a href="http://technorati.com/tags/async" rel="tag"&gt;async&lt;/a&gt;,&lt;a href="http://technorati.com/tags/visual+studio" rel="tag"&gt;visual studio&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-4006262866086826524?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/4006262866086826524/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=4006262866086826524&amp;isPopup=true' title='1 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/4006262866086826524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/4006262866086826524'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/11/in-attesa-di-avere-di-serie-la.html' title='Rilasciata la versione 3 di Async CTP'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-5667327473675551266</id><published>2011-11-13T19:20:00.001+01:00</published><updated>2011-11-13T20:22:30.855+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Annunci'/><category scheme='http://www.blogger.com/atom/ns#' term='FT Toolkit'/><title type='text'>FT Toolkit v.1.0 is out!!</title><content type='html'>&lt;p&gt;Finalmente sono orgoglioso di comunicarvi che la prima release di FT Toolkit è out!!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://fttk.codeplex.com/" target="_blank"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="FTToolkit" border="0" alt="FTToolkit" src="http://lh6.ggpht.com/-9xneDcJ-5wY/TsAKXXqoJKI/AAAAAAAAA9c/_zpkjV8j4jU/FTToolkit%25255B4%25255D.png?imgmax=800" width="256" height="128" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Cosa è FT Toolkit?&lt;/p&gt;  &lt;p&gt;FT Toolkit è un insieme di classi che consentono di accedere in maniera semplice ai servizi di &lt;a href="http://it.fotolia.com/partner/175559" target="_blank"&gt;Fotolia&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Per chi non la conoscesse, Fotolia è una delle maggiori agenzie on-line per stock-foto con circa 14 milioni di immagini a disposizione dei propri clienti.    &lt;br /&gt;Fotolia mette a disposizione degli sviluppatori una serie di servizi (inizialmente con protocollo XmlRpc e adesso anche in Rest) per accedere alle funzionalità della piattaforma (come ad esempio eseguire ricerche sulla banca dati immagini, creare gallerie, gestire il&amp;#160; proprio account e così via).&lt;/p&gt;  &lt;p&gt;Per maggiori info sulle API esposte fare riferimento al link &lt;a title="http://it.fotolia.com/Services/API/Introduction" href="http://it.fotolia.com/Services/API/Introduction"&gt;http://it.fotolia.com/Services/API/Introduction&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Fino ad ora (almeno che io sappia e avendo ricevuto conferma dal gruppo si sviluppo interno a Fotolia stessa) non esisteva un toolkit che permettesse facilmente, a chi sviluppa con linguaggi .NET, di accedere ai servizi (lo si poteva fare ma implementando le interfacce XmlRpc).&lt;/p&gt;  &lt;p&gt;FT Toolkit nasce proprio per questo, fornire un Object Model e dei servizi per wrappare le chiamate ai servizi della piattaforma Fotolia.&lt;/p&gt;  &lt;p&gt;Attualmente ci sono solamente due moduli:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;FTTK.Core (che contiene le entità dell’object model e le interfacce dei servizi) &lt;/li&gt;    &lt;li&gt;FTTK.XmlRpc (che contiene le implementazioni delle interfacce contenute nel Core e che accedono ai servizi XmlRpc). &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Entrambi sono pensati per il framework .NET 4.0 e funzionano per applicazioni Desktop o server (no silverlight o wp7).&lt;/p&gt;  &lt;p&gt;Prossimamente saranno rilasciati i moduli per Silverlight e WP7 , nonchè le implementazioni per il protocollo REST.&lt;/p&gt;  &lt;p&gt;Il sito ufficiale di FTTK è &lt;a href="http://fttk.codeplex.com"&gt;http://fttk.codeplex.com&lt;/a&gt; ma i moduli sono disponibili anche su NuGet: &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-QD0Jzh9GHGE/TsAKY6qrjlI/AAAAAAAAA9k/Ve-UOMqqYzY/s1600-h/image%25255B5%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-ezwZI7bz2E8/TsAKaBTLDHI/AAAAAAAAA9s/21ewa1rarJw/image_thumb%25255B3%25255D.png?imgmax=800" width="454" height="290" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;FTTK.Core : &lt;a title="http://www.nuget.org/List/Packages/FTTK.Core" href="http://www.nuget.org/List/Packages/FTTK.Core"&gt;http://www.nuget.org/List/Packages/FTTK.Core&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;FTTK.XmlRpc: &lt;a title="http://www.nuget.org/List/Packages/FTTK.XmlRpc" href="http://www.nuget.org/List/Packages/FTTK.XmlRpc"&gt;http://www.nuget.org/List/Packages/FTTK.XmlRpc&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Se siete interessati restate connessi, perhè prossimamente pubblicherò altri post al riguardo!!!!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:3eebc85b-6f6f-4eb4-9f25-25784b6feef6" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/fotolia" rel="tag"&gt;fotolia&lt;/a&gt;,&lt;a href="http://technorati.com/tags/fttk" rel="tag"&gt;fttk&lt;/a&gt;,&lt;a href="http://technorati.com/tags/fotolia+toolkit" rel="tag"&gt;fotolia toolkit&lt;/a&gt;,&lt;a href="http://technorati.com/tags/ft+toolkit" rel="tag"&gt;ft toolkit&lt;/a&gt;,&lt;a href="http://technorati.com/tags/xmlrpc" rel="tag"&gt;xmlrpc&lt;/a&gt;,&lt;a href="http://technorati.com/tags/stock+agency" rel="tag"&gt;stock agency&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-5667327473675551266?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/5667327473675551266/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=5667327473675551266&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/5667327473675551266'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/5667327473675551266'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/11/ft-toolkit-v10-is-out.html' title='FT Toolkit v.1.0 is out!!'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/-9xneDcJ-5wY/TsAKXXqoJKI/AAAAAAAAA9c/_zpkjV8j4jU/s72-c/FTToolkit%25255B4%25255D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-3641548963170857174</id><published>2011-11-05T17:21:00.001+01:00</published><updated>2011-11-05T17:21:44.398+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Annunci'/><category scheme='http://www.blogger.com/atom/ns#' term='Kinect'/><title type='text'>Nuova release dell’SDK per Kinect</title><content type='html'>&lt;p&gt;Dopo una settimana intensa dal punto di vista lavorativo e non (evento ALM Revolutions da sovraintendere), eccomi qui a postare qualcosa (come non mi capita più spesso nell’ultimo periodo &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-sadsmile" alt="Triste" src="http://lh4.ggpht.com/-4W6kOg4lv4I/TrViihbwHQI/AAAAAAAAA9E/7h7V_L0pdkU/wlEmoticon-sadsmile%25255B2%25255D.png?imgmax=800" /&gt;).&lt;/p&gt;  &lt;p&gt;Questa volta si tratta della nuova versione del Kinect SDK per Windows rilasciata il 1 Novembre.&lt;/p&gt;  &lt;p&gt;Cominciamo dal nuovo sito ridisegnato (&lt;a title="http://www.kinectforwindows.org/" href="http://www.kinectforwindows.org/"&gt;http://www.kinectforwindows.org/&lt;/a&gt;):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-1kqSgbNfyEI/TrViklWbRKI/AAAAAAAAA9M/sHJKW84hGlo/s1600-h/image%25255B5%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-U_w-fQG3KqU/TrVil7RehlI/AAAAAAAAA9U/9Fm9dP3SSmY/image_thumb%25255B3%25255D.png?imgmax=800" width="504" height="276" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Nel sito trovate documentazione, risorse e il link per il download del nuovo SDK (sia nella versione 32bit che 64 bit).&lt;/p&gt;  &lt;p&gt;Le novità presenti in questa release (che tengo a precisare non è ancora una versione commercial la quale sarà disponibile &lt;em&gt;“early 2012”&lt;/em&gt;) sono, fondamentalmente :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Miglioramenti e ottimizzazioni del motore di skeletal tracking. Viene dichiarato un 20% di incremento delle performance rispetto alla precedente versione e un miglioramento nell’accuratezza e tracciatura dei joint dello scheletro; &lt;/li&gt;    &lt;li&gt;E’ possibile attaccare e staccare a caldo il Kinect senza avere problemi con la classe Runtime di gestione dello stesso; &lt;/li&gt;    &lt;li&gt;Supporto per Windows 8 Developer Preview.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Nei prossimi giorni vedrò di analizzare l’SDK nuovo e segnalarvi eventuali differenze (non dovrebbero esserci) in termini di classi o utilizzo, rispetto alla precedente versione.&lt;/p&gt;  &lt;p&gt;Per ora, il consiglio che vi posso dare è di guardarvi i seguenti video:&lt;/p&gt;  &lt;p&gt;&lt;a title="Kinect Effect Video" href="http://www.xbox.com/en-US/Kinect/Kinect-Effect" target="_blank"&gt;Kinect Effect Video&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="Shape game image" href="http://research.microsoft.com/apps/video/default.aspx?id=150286" target="_blank"&gt;Shape game image&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:91dbaa4b-e4e7-4fce-bb9d-d45cdb056fa9" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/kinect+sdk" rel="tag"&gt;kinect sdk&lt;/a&gt;,&lt;a href="http://technorati.com/tags/kinect+for+windows" rel="tag"&gt;kinect for windows&lt;/a&gt;,&lt;a href="http://technorati.com/tags/sdk" rel="tag"&gt;sdk&lt;/a&gt;,&lt;a href="http://technorati.com/tags/xbox" rel="tag"&gt;xbox&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-3641548963170857174?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/3641548963170857174/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=3641548963170857174&amp;isPopup=true' title='2 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/3641548963170857174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/3641548963170857174'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/11/nuova-release-dellsdk-per-kinect.html' title='Nuova release dell’SDK per Kinect'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/-4W6kOg4lv4I/TrViihbwHQI/AAAAAAAAA9E/7h7V_L0pdkU/s72-c/wlEmoticon-sadsmile%25255B2%25255D.png?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-4826927306279695512</id><published>2011-11-02T09:31:00.001+01:00</published><updated>2011-11-02T09:31:14.053+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Annunci'/><category scheme='http://www.blogger.com/atom/ns#' term='Entity Framework'/><title type='text'>Rilasciata EF 4.2</title><content type='html'>&lt;p&gt;E’ di ieri l’annuncio del rilascio di EF 4.2.&lt;/p&gt;  &lt;p&gt;Maggiori informazioni potete trovarle sul post del blog di ADO.NET all’indirizzo:&amp;#160; &lt;a title="http://blogs.msdn.com/b/adonet/archive/2011/11/01/ef-4-2-released.aspx" href="http://blogs.msdn.com/b/adonet/archive/2011/11/01/ef-4-2-released.aspx"&gt;http://blogs.msdn.com/b/adonet/archive/2011/11/01/ef-4-2-released.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:83e8acb7-7603-4369-8c30-8caa12708f27" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/entity+framework" rel="tag"&gt;entity framework&lt;/a&gt;,&lt;a href="http://technorati.com/tags/ef" rel="tag"&gt;ef&lt;/a&gt;,&lt;a href="http://technorati.com/tags/entity+framework+4.2" rel="tag"&gt;entity framework 4.2&lt;/a&gt;,&lt;a href="http://technorati.com/tags/ef+4.2" rel="tag"&gt;ef 4.2&lt;/a&gt;,&lt;a href="http://technorati.com/tags/code+first" rel="tag"&gt;code first&lt;/a&gt;,&lt;a href="http://technorati.com/tags/database+first" rel="tag"&gt;database first&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-4826927306279695512?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/4826927306279695512/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=4826927306279695512&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/4826927306279695512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/4826927306279695512'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/11/rilasciata-ef-42.html' title='Rilasciata EF 4.2'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-6615979713774681399</id><published>2011-10-21T09:09:00.001+02:00</published><updated>2011-10-21T09:09:54.547+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Eventi'/><category scheme='http://www.blogger.com/atom/ns#' term='wp7'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone 7'/><title type='text'>Windows Phone 7.5 Developer Day/Lab a Roma</title><content type='html'>&lt;p&gt;&lt;a href="http://lh5.ggpht.com/-ww_QPqQpmic/TqEav6-EMfI/AAAAAAAAA8g/k3NITjksWH4/s1600-h/logo_wp75-v_web%25255B7%25255D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 10px 10px 5px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top: 0px; border-right: 0px; padding-top: 0px" title="logo_wp75-v_web" border="0" alt="logo_wp75-v_web" align="left" src="http://lh3.ggpht.com/-K6Fwa2LFGbk/TqEawRBoHAI/AAAAAAAAA8o/0dHIzAxCg-o/logo_wp75-v_web_thumb%25255B5%25255D.jpg?imgmax=800" width="167" height="87" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;Vi segnalo due eventi (che si svolgeranno in contemporanea)organizzati da Microsoft in collaborazione con Nokia per il 15 Novembre 2011 presso la sede Microsoft di Roma (Viale Avignone 10).&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Windows Phone 7.5 Developer Day&lt;/strong&gt; – una giornata dedicata allo sviluppo per Windows Phone 7.5, dove si parlerà del Windows Phone Runtime, delle novità della versione 7.5 (Fast Application Switching, Tombstoning, Multitasking, Live Tiles e Push Notification, etc…), di come costruire un’applicazione completa, del marketplace e di come monetizzare le proprie applicazioni. Gli speaker saranno Daniele Bochicchio e Cristian Civera, che hanno realizzato alcune tra le più importanti e conosciute applicazioni italiane per Windows Phone 7 e 7.5.       &lt;br /&gt;Per iscrivervi potete &lt;a href="http://communitydevtool.com/public/frmdetailevent.aspx?eventid=1103MSLCIBDSKMMISBJKQP" target="_blank"&gt;andare qui&lt;/a&gt;. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Windows Phone 7.5 Developer Lab&lt;/strong&gt; – un laboratorio pratico dedicato a Windows Phone 7.5, dove provare sul campo lo sviluppo di applicazioni per Windows Phone 7.5. Affiancati da me e da altre persone molto competenti sullo sviluppo Phone, potrete anche testare le applicazioni su telefoni reali anche dotati di giroscopio, bussola, etc..       &lt;br /&gt;Durante il laboratorio sarà possibile avere assistenza anche nella migrazione delle proprie applicazioni da altre piattaforme mobili.       &lt;br /&gt;&lt;em&gt;&lt;strong&gt;Per partecipare al laboratorio bisogna portare il proprio portatile con il Windows Phone SDK e lo Zune Client installati.&lt;/strong&gt;&lt;/em&gt; Per iscrivervi potete &lt;a href="http://communitydevtool.com/public/frmdetailevent.aspx?eventid=0403FLFMJNRDDBJITNELNC" target="_blank"&gt;andare qui&lt;/a&gt;. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;In entrambi gli eventi se avete delle applicazioni pronte, in sviluppo o appena rilasciate sul Marketplace portatele e fatecele vedere, riceverete una sorpresa!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:61c96fbf-dbcb-4111-910d-2a05e8b4108b" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/WP%2f" rel="tag"&gt;WP/&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Windows+Phone+7" rel="tag"&gt;Windows Phone 7&lt;/a&gt;,&lt;a href="http://technorati.com/tags/lab" rel="tag"&gt;lab&lt;/a&gt;,&lt;a href="http://technorati.com/tags/nokia" rel="tag"&gt;nokia&lt;/a&gt;,&lt;a href="http://technorati.com/tags/microsoft" rel="tag"&gt;microsoft&lt;/a&gt;,&lt;a href="http://technorati.com/tags/evento" rel="tag"&gt;evento&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-6615979713774681399?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/6615979713774681399/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=6615979713774681399&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/6615979713774681399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/6615979713774681399'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/10/windows-phone-75-developer-daylab-roma.html' title='Windows Phone 7.5 Developer Day/Lab a Roma'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/-K6Fwa2LFGbk/TqEawRBoHAI/AAAAAAAAA8o/0dHIzAxCg-o/s72-c/logo_wp75-v_web_thumb%25255B5%25255D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-1096210285997227225</id><published>2011-10-20T09:37:00.001+02:00</published><updated>2011-10-20T09:37:06.343+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Annunci'/><category scheme='http://www.blogger.com/atom/ns#' term='Roslyn'/><title type='text'>Rilasciata la versione CTP di Roslyn</title><content type='html'>&lt;p&gt;Ieri sera (da noi) è stata rilasciata la versione CTP di Roslyn.&lt;/p&gt;  &lt;p&gt;Roslyn, in poche parole (insufficienti e parziali), è un progetto che nasce con lo scopo di “aprire” la scatola nera Compilatore in modo da permettere una personalizzazione dello stesso.&lt;/p&gt;  &lt;p&gt;Il download della CTP e risorse per poter approfondire il discorso sono disponibili all’indirizzo &lt;a title="http://msdn.microsoft.com/it-it/roslyn" href="http://msdn.microsoft.com/it-it/roslyn"&gt;http://msdn.microsoft.com/it-it/roslyn&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:c6c7ce49-4e0c-4947-84b9-983d2ab2e3a5" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/Roslyn" rel="tag"&gt;Roslyn&lt;/a&gt;,&lt;a href="http://technorati.com/tags/compilatore" rel="tag"&gt;compilatore&lt;/a&gt;,&lt;a href="http://technorati.com/tags/ctp" rel="tag"&gt;ctp&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-1096210285997227225?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/1096210285997227225/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=1096210285997227225&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/1096210285997227225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/1096210285997227225'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/10/rilasciata-la-versione-ctp-di-roslyn.html' title='Rilasciata la versione CTP di Roslyn'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-8391188967161831635</id><published>2011-10-18T13:23:00.001+02:00</published><updated>2011-10-18T13:23:51.731+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Articoli'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Azure'/><title type='text'>MSDN Blog: Umbraco su Windows Azure. Come e Perchè (1 Parte)</title><content type='html'>&lt;p&gt;Vi segnalo la prima parte di una interessante serie di articoli di &lt;a href="http://dotnetlombardia.org/b/rob/default.aspx" target="_blank"&gt;Roberto Freato&lt;/a&gt; sul blog MSDN di &lt;a href="http://blogs.msdn.com/b/mariofontana" target="_blank"&gt;Mario Fontana&lt;/a&gt;:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/b/mariofontana/archive/2011/10/18/umbraco-su-windows-azure-come-e-perch-232-1-parte.aspx"&gt;http://blogs.msdn.com/b/mariofontana/archive/2011/10/18/umbraco-su-windows-azure-come-e-perch-232-1-parte.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:cd484952-8a58-4107-bc23-63ab806edce5" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/azure" rel="tag"&gt;azure&lt;/a&gt;,&lt;a href="http://technorati.com/tags/windows+azure" rel="tag"&gt;windows azure&lt;/a&gt;,&lt;a href="http://technorati.com/tags/cms" rel="tag"&gt;cms&lt;/a&gt;,&lt;a href="http://technorati.com/tags/umbraco" rel="tag"&gt;umbraco&lt;/a&gt;,&lt;a href="http://technorati.com/tags/cloud" rel="tag"&gt;cloud&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-8391188967161831635?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/8391188967161831635/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=8391188967161831635&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/8391188967161831635'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/8391188967161831635'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/10/msdn-blog-umbraco-su-windows-azure-come.html' title='MSDN Blog: Umbraco su Windows Azure. Come e Perchè (1 Parte)'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-4163981599431679623</id><published>2011-10-17T17:04:00.001+02:00</published><updated>2011-10-17T17:04:43.216+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Annunci'/><title type='text'>Alcuni web cast su Denali in BEIT</title><content type='html'>&lt;p&gt;Vi segnalo che sono stati pubblicati alcuni Web Cast su &lt;a href="http://www.microsoft.com/italy/beit/Default.aspx" target="_blank"&gt;BEIT&lt;/a&gt; relativi a Denali la nuova versione di SQL Server.&lt;/p&gt;  &lt;p&gt;L’indirizzo a cui potete trovare il materiale è:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.microsoft.com/italy/beit/Msdn.aspx?search=denali&amp;amp;type=-1&amp;amp;audience=2&amp;amp;userlevel=-1&amp;amp;product=-1&amp;amp;authorName=-1" href="http://www.microsoft.com/italy/beit/Msdn.aspx?search=denali&amp;amp;type=-1&amp;amp;audience=2&amp;amp;userlevel=-1&amp;amp;product=-1&amp;amp;authorName=-1"&gt;http://www.microsoft.com/italy/beit/Msdn.aspx?search=denali&amp;amp;type=-1&amp;amp;audience=2&amp;amp;userlevel=-1&amp;amp;product=-1&amp;amp;authorName=-1&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Buona visione!!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:401fd284-aa8e-4b19-99b0-fc7cc1d8e94c" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/denali" rel="tag"&gt;denali&lt;/a&gt;,&lt;a href="http://technorati.com/tags/webcast" rel="tag"&gt;webcast&lt;/a&gt;,&lt;a href="http://technorati.com/tags/beit" rel="tag"&gt;beit&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-4163981599431679623?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/4163981599431679623/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=4163981599431679623&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/4163981599431679623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/4163981599431679623'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/10/alcuni-web-cast-su-denali-in-beit.html' title='Alcuni web cast su Denali in BEIT'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-245582541739060791</id><published>2011-10-17T14:56:00.001+02:00</published><updated>2011-10-17T14:56:10.258+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 11'/><title type='text'>Visual Studio 11 – Impostare il target framework e la CPU</title><content type='html'>&lt;p&gt;Visual Studio 11, come il suo predecessore Visual Studio 2010, consente di selezionare per quale versione del framework compilare il nostro progetto solo che permette di farlo in maniera più semplice.&lt;/p&gt;  &lt;p&gt;Se vogliamo impostare il framework di compilazione in Visual Studio 2010, dobbiamo andare nelle proprietà del progetto, selezionare la scheda “Compile”&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-blTJsRGCa9A/Tpwl25Cd0yI/AAAAAAAAA7g/a8Abn4e4BRA/s1600-h/SNAGHTML102b74a7%25255B4%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="SNAGHTML102b74a7" border="0" alt="SNAGHTML102b74a7" src="http://lh6.ggpht.com/-HFyKRvD-eag/Tpwl3UZsfFI/AAAAAAAAA7o/XF_r1KVKmZU/SNAGHTML102b74a7_thumb%25255B1%25255D.png?imgmax=800" width="500" height="345" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;e il bottone “Advanced Compile Option” in modo da aprire la finestra delle impostazioni avanzate di compilazione:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-J-gKDRbC95E/Tpwl35OaFdI/AAAAAAAAA7w/lMhk00ZS5hI/s1600-h/SNAGHTML102d32a8%25255B4%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="SNAGHTML102d32a8" border="0" alt="SNAGHTML102d32a8" src="http://lh5.ggpht.com/-sor8OVQCKOY/Tpwl4e9r8kI/AAAAAAAAA74/fMc2R9tzItY/SNAGHTML102d32a8_thumb%25255B1%25255D.png?imgmax=800" width="500" height="378" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In questa finestra troviamo la casella a discesa che ci consente di selezionare il framework di destinazione.&lt;/p&gt;  &lt;p&gt;In VS11 la procedura è stata semplificata e la combo di scelta è stata inserita direttamente nella scheda “Application”:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-qlrropr_vqE/Tpwl4_1vohI/AAAAAAAAA8A/T9FpiCRoHxM/s1600-h/image%25255B3%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-usDEvJ0HwkI/Tpwl5RPJxEI/AAAAAAAAA8I/s6uiv6dX-lg/image_thumb%25255B1%25255D.png?imgmax=800" width="500" height="352" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Possiamo osservare, inoltre, che la scelta della CPU di destinazione, che nel VS2010 è contenuta sempre nella finestra delle impostazioni avanzate di compilazione, è stata spostata all’interno della scheda delle impostazioni di compilazione:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-WxSpcXvxBsQ/Tpwl578ZjwI/AAAAAAAAA8Q/b8tE1exKDCQ/s1600-h/image%25255B7%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-zzZriWNyUoA/Tpwl6dfqFUI/AAAAAAAAA8Y/mWncJaXi9kw/image_thumb%25255B3%25255D.png?imgmax=800" width="500" height="352" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Da notare la presenza del flag “Prefer 32-bit” (utilizzabile solo se si è scelta l’opzione “Any CPU”) che consente di compilare in modo che l’applicazione verrà eseguita in modalità 32-bit ove è possibile.&lt;/p&gt;        &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:6a312b0d-0b7f-47e1-966f-a20d69777aa6" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/visual+studio+11" rel="tag"&gt;visual studio 11&lt;/a&gt;,&lt;a href="http://technorati.com/tags/dev11" rel="tag"&gt;dev11&lt;/a&gt;,&lt;a href="http://technorati.com/tags/target+cpu" rel="tag"&gt;target cpu&lt;/a&gt;,&lt;a href="http://technorati.com/tags/target+framework" rel="tag"&gt;target framework&lt;/a&gt;,&lt;a href="http://technorati.com/tags/application+property" rel="tag"&gt;application property&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-245582541739060791?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/245582541739060791/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=245582541739060791&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/245582541739060791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/245582541739060791'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/10/visual-studio-11-impostare-il-target.html' title='Visual Studio 11 – Impostare il target framework e la CPU'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/-HFyKRvD-eag/Tpwl3UZsfFI/AAAAAAAAA7o/XF_r1KVKmZU/s72-c/SNAGHTML102b74a7_thumb%25255B1%25255D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-6481714094794789313</id><published>2011-10-13T10:22:00.001+02:00</published><updated>2011-10-13T10:22:07.498+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Eventi'/><category scheme='http://www.blogger.com/atom/ns#' term='Formazione'/><title type='text'>WPC2011 sta per arrivare!!!</title><content type='html'>&lt;p&gt;WPC è il più importante evento italiano di formazione: 3 giorni di sessioni di ottimo livello con ottimi speaker!! Che aspettate!!!!&lt;/p&gt;  &lt;p&gt;Fate un giro sul sito ufficiale (&lt;a title="http://www.wpc2011.it" href="http://www.wpc2011.it"&gt;http://www.wpc2011.it&lt;/a&gt;), guardate l’agenda e non potrete non iscrivervi!!!!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.wpc2011.it" target="_blank"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="Stampa" border="0" alt="Stampa" src="http://lh3.ggpht.com/-KplWYAE1sO4/TpafrnvivFI/AAAAAAAAA7Y/laYxPLdR5Ec/b3_728x90%25255B7%25255D.jpg?imgmax=800" width="550" height="68" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:c48f1ae7-6f00-4151-bc9b-9f3bddf4d12c" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/wpc" rel="tag"&gt;wpc&lt;/a&gt;,&lt;a href="http://technorati.com/tags/wpc2011" rel="tag"&gt;wpc2011&lt;/a&gt;,&lt;a href="http://technorati.com/tags/evento" rel="tag"&gt;evento&lt;/a&gt;,&lt;a href="http://technorati.com/tags/formazione" rel="tag"&gt;formazione&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-6481714094794789313?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/6481714094794789313/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=6481714094794789313&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/6481714094794789313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/6481714094794789313'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/10/wpc2011-sta-per-arrivare.html' title='WPC2011 sta per arrivare!!!'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/-KplWYAE1sO4/TpafrnvivFI/AAAAAAAAA7Y/laYxPLdR5Ec/s72-c/b3_728x90%25255B7%25255D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-7749879612777747432</id><published>2011-10-11T08:53:00.001+02:00</published><updated>2011-10-11T08:53:56.500+02:00</updated><title type='text'>ALM Revolutions e FREE Web Workshop</title><content type='html'>&lt;p&gt;Siete interessati all’ALM (Application LIfecycle Management)?&lt;/p&gt;  &lt;p&gt;Se si vi segnalo due interessanti appuntamenti.&lt;/p&gt;  &lt;p&gt;Il primo è un pomeriggio, organizzato da &lt;a href="http://www.domusdotnet.org" target="_blank"&gt;DomusDotNet&lt;/a&gt;, con 4 sessioni tutte incentrate, appunto, su ALM.&lt;/p&gt;  &lt;p&gt;L’evento si terrà il giorno 3 Novembre 2011 presso la sede Microsoft di Roma e l’agenda è la seguente:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;14:00-14:30 &lt;/strong&gt;Registrazione&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;14:30-14:45 &lt;/strong&gt;Keynote di benvenuto&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;14:45-15:30 &lt;/strong&gt;&lt;strong&gt;Non si vive di solo check-out e check-in       &lt;br /&gt;&lt;/strong&gt;&lt;em&gt;(Gian Maria Ricci, MVP Visual Studio ALM e fondatore DotNetMarche)&lt;/em&gt;      &lt;br /&gt;Il source control è lo strumento fondamentale per la gestione dei propri progetti e spesso purtroppo anche il meno conosciuto. Troppo spesso i team utilizzano solamente le funzionalità più base di un VCS senza usufruire a pieno di tutte le sue potenzialità. In questa sessione vedremo alcune best practice da adottare per la gestione del codice basandoci sul source control di TFS e parleremo quindi di branch, shelvest, integration platform ed altro.&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;15:30-16:15 &lt;/strong&gt;&lt;strong&gt;Real World Team Foundation Server       &lt;br /&gt;&lt;/strong&gt;&lt;em&gt;(Matteo Emili, MVP Visual Studio ALM e fondatore DomusDotNet)&lt;/em&gt;      &lt;br /&gt;Tips and tricks per l'amministratore &amp;quot;casuale&amp;quot;. Avete installato in test Team Foundation Server e siete diventati de facto amministratori di uno dei sistemi più importanti per il team di sviluppo? Avete ereditato l'installazione da qualcun'altro e vi state chiedendo come è potuto succedere? In questa sessione vedremo una serie di cose che avreste voluto sapere prima di diventare &amp;quot;casualmente&amp;quot; amministratori di Team Foundation Server.&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;16:15-16:30 &lt;/strong&gt;Pausa&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;16:30-17:15 &lt;/strong&gt;&lt;strong&gt;TFS Team process template customization       &lt;br /&gt;&lt;/strong&gt;&lt;em&gt;(Gian Maria Ricci, MVP Visual Studio ALM e fondatore DotNetMarche)&lt;/em&gt;      &lt;br /&gt;Team Foundation Server garantisce una estrema flessibilità nella personalizzazione dei Work Item, permettendovi di adattarlo al vostro processo di sviluppo. In questa sessione vedremo come modificare la definizione di Work Item aggiungendo campi, regole ed andando a modificare il workflow che regola la gestione degli stati.&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;17:15-18:00 &lt;/strong&gt;&lt;strong&gt;What's new on Visual Studio ALM 11?       &lt;br /&gt;&lt;/strong&gt;&lt;em&gt;(Matteo Emili, MVP Visual Studio ALM e fondatore DomusDotNet)&lt;/em&gt;      &lt;br /&gt;In questa sessione per la prima volta inizieremo a vedere cosa Microsoft sta preparando per la prossima release di Visual Studio ALM.      &lt;br /&gt;Local Workspaces, Team Foundation Service, Feedback Manager e Storyboarding sono solo alcune delle novità che verranno affrontate.      &lt;br /&gt;Da non perdere per non farsi cogliere impreparati &amp;quot;dall'onda&amp;quot;.&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;18:00 &lt;/strong&gt;Conclusioni&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Per maggiori info, dettagli logistici ed iscrizioni, trovate la pagina dell’evento all’indirizzo &lt;a title="http://www.domusdotnet.org/eventi/alm-revolutions.aspx" href="http://www.domusdotnet.org/eventi/alm-revolutions.aspx"&gt;http://www.domusdotnet.org/eventi/alm-revolutions.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Vi segnalo, infine, una serie di Workshop organizzati da Microsoft e segnalati nel seguente post di Lorenzo Barbieri: &lt;a title="http://blogs.msdn.com/b/italy/archive/2011/10/10/free-web-workshop-microsoft-visual-studio-2010-alm-tools.aspx" href="http://blogs.msdn.com/b/italy/archive/2011/10/10/free-web-workshop-microsoft-visual-studio-2010-alm-tools.aspx"&gt;http://blogs.msdn.com/b/italy/archive/2011/10/10/free-web-workshop-microsoft-visual-studio-2010-alm-tools.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ora non avete più scuse per non approfondire il discorso su ALM!!!!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:4f923577-c06c-4148-95e6-c064cb6acde3" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/alm" rel="tag"&gt;alm&lt;/a&gt;,&lt;a href="http://technorati.com/tags/application+lifestyle+management" rel="tag"&gt;application lifestyle management&lt;/a&gt;,&lt;a href="http://technorati.com/tags/agile" rel="tag"&gt;agile&lt;/a&gt;,&lt;a href="http://technorati.com/tags/web+cast" rel="tag"&gt;web cast&lt;/a&gt;,&lt;a href="http://technorati.com/tags/domusdotnet" rel="tag"&gt;domusdotnet&lt;/a&gt;,&lt;a href="http://technorati.com/tags/evento" rel="tag"&gt;evento&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-7749879612777747432?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/7749879612777747432/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=7749879612777747432&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/7749879612777747432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/7749879612777747432'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/10/alm-revolutions-e-free-web-workshop.html' title='ALM Revolutions e FREE Web Workshop'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-318264034609227889</id><published>2011-09-19T09:47:00.001+02:00</published><updated>2011-09-19T09:47:38.944+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Eventi'/><title type='text'>Comunicando: History Tech Day</title><content type='html'>&lt;table style="width: 100%" border="0" cellspacing="0" cellpadding="10"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" align="center"&gt;&lt;a href="http://g9e0.s04.it/f/tr.aspx/?.:Uh&amp;amp;x=pv&amp;amp;i=vtwx4--ee=s42ngf=&amp;amp;x=pv&amp;amp;mij3uqqnp4mkhgc7bc.fkb0kb706biv.g8&amp;amp;x=pv&amp;amp;o8ebg5gQS$6fiicfg=7idt7iem9hk5gQS*6mb9q=7kic9e96iQS*5--=uxs6iQS*5Ii&amp;amp;x=pv&amp;amp;db8=3z5gQS*6c9ca=.mNCLM" target="_blank"&gt;&lt;strong&gt;&lt;img style="margin: 0px 0px 5px" border="0" alt="" align="left" src="http://g9e0.s04.it/images/4/List%20Images/banner_comunicando_piccolo.jpg" width="150" height="150" /&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;        &lt;td&gt;Vi segnalo l’evento Comunicando - da strumenti di calcolo a strumenti di comunicazione- che si terrà il prossimo 24 Settembre 2011.          &lt;br /&gt;L’evento è dedicato all'evoluzione delle piattaforme di sviluppo, e si terrà ad Avellino, presso il Carcere Borbonico di Avellino sito in Corso Vittorio Emanuele II, dalle 9.00 alle 17.30.           &lt;br /&gt;          &lt;br /&gt;          &lt;div style="padding-bottom: 0px; padding-left: 0px; width: 330px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px" id="scid:84E294D0-71C9-4bd0-A0FE-95764E0368D9:ca180558-7ede-47e3-a1ba-9d1e5968ea9b" class="wlWriterEditableSmartContent"&gt;&lt;a href="http://www.bing.com/maps/default.aspx?v=2&amp;amp;cp=40.91479~14.78724&amp;amp;lvl=16&amp;amp;style=h&amp;amp;scene=12147493&amp;amp;sp=aN.40.91484_14.78728_Ex%2520Carcere%2520Borbonico_&amp;amp;mkt=IT-IT&amp;amp;FORM=LLWR" id="map-52326533-b462-45dc-ae4c-1fff423be96f" alt="Visualizza mappa" title="Visualizza mappa"&gt;&lt;img src="http://lh6.ggpht.com/-287ZuWou9NE/TnbzmbkyF4I/AAAAAAAAA7U/i3ZNNyY3O1A/map-ce45bfa27725.jpg?imgmax=800" width="320" height="240" alt="Immagine mappa"&gt;&lt;/a&gt;&lt;/div&gt;          &lt;br /&gt;Purtroppo i posti sono limitati quindi &lt;a href="http://g9e0.s04.it/f/tr.aspx/?.:Uh&amp;amp;x=pv&amp;amp;i=vtwx4--ee=s42ngf=&amp;amp;x=pv&amp;amp;mij3uq:ffboebis0-knfha99hbvgn6f.&amp;amp;q.if8&amp;amp;x=pv&amp;amp;k9-f&amp;amp;o9hk85mgq1lQS$3-k&amp;amp;x=pv&amp;amp;em--=t3_yLQMBQFUHDUBUJMRPUINCLM" target="_blank"&gt;affrettatevi a registrarvi&lt;/a&gt;.&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:c7b7d089-9833-46fd-a7d3-6bc0dfc72281" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/comunicando" rel="tag"&gt;comunicando&lt;/a&gt;,&lt;a href="http://technorati.com/tags/evento" rel="tag"&gt;evento&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-318264034609227889?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/318264034609227889/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=318264034609227889&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/318264034609227889'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/318264034609227889'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/09/comunicando-history-tech-day.html' title='Comunicando: History Tech Day'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/-287ZuWou9NE/TnbzmbkyF4I/AAAAAAAAA7U/i3ZNNyY3O1A/s72-c/map-ce45bfa27725.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-1326997749838294379</id><published>2011-09-14T12:44:00.001+02:00</published><updated>2011-09-14T12:44:25.456+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Annunci'/><category scheme='http://www.blogger.com/atom/ns#' term='Eventi'/><category scheme='http://www.blogger.com/atom/ns#' term='LightSwitch'/><title type='text'>Webinar LightSwitch DevExpress</title><content type='html'>&lt;p&gt;Vi segnalo un interessante webinar (un americanismo per chiamare una sessione on-line) interamente dedicato a LightSwitch e tenuto da &lt;a href="http://community.visual-basic.it/alessandro/default.aspx" target="_blank"&gt;Alessandro Del Sole&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Il webinar è a cura di &lt;a href="http://www.devexpress.com/" target="_blank"&gt;DevExpress&lt;/a&gt; e si terrà il giorno 4 Ottobre 2011 alle ore 19:00 (il link del webinar è &lt;a title="http://www.devexpress.com/Support/Webinars/details.xml?id=IntroLightSwitchDelSole" href="http://www.devexpress.com/Support/Webinars/details.xml?id=IntroLightSwitchDelSole"&gt;http://www.devexpress.com/Support/Webinars/details.xml?id=IntroLightSwitchDelSole&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Maggiori informazioni sul &lt;a href="http://community.visual-basic.it/Alessandro/archive/2011/09/14/Sessione-online-con-DevExpress-applicazioni-business-con-Visual-Studio-LightSwitch.aspx" target="_blank"&gt;post&lt;/a&gt; di Alessandro.&lt;/p&gt;  &lt;p&gt;Se volete cominciare a capire cosa è LightSwitch e se fa al caso vostro, non perdete l’occasione!!!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:81a4d687-602f-47a7-be0f-50656d45aee2" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/devexpress" rel="tag"&gt;devexpress&lt;/a&gt;,&lt;a href="http://technorati.com/tags/webinar" rel="tag"&gt;webinar&lt;/a&gt;,&lt;a href="http://technorati.com/tags/lightswitch" rel="tag"&gt;lightswitch&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-1326997749838294379?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/1326997749838294379/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=1326997749838294379&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/1326997749838294379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/1326997749838294379'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/09/webinar-lightswitch-devexpress.html' title='Webinar LightSwitch DevExpress'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-5266451555197432070</id><published>2011-09-14T08:37:00.001+02:00</published><updated>2011-09-14T08:37:30.840+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Annunci'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows 8'/><title type='text'>Windows 8 @ BUILD : arrivato!!!!</title><content type='html'>&lt;p&gt;Ieri, durante la keynote di BUILD tenutasi ad Anaheim in California, &lt;strong&gt;Steven Sinofsky&lt;/strong&gt; mostrato alcune delle potenzialità del nuovo Windows 8.&lt;/p&gt;  &lt;p&gt;Per vedere la Keynote potete collegarvi all'indirizzo: &lt;a href="http://www.microsoft.com/presspass/events/build/"&gt;http://www.microsoft.com/presspass/events/build/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Da questa mattina presto è stata rilasciata la preview di Windows 8 e degli strumenti di sviluppo. Per scaricare le ISO usate l'indirizzo &lt;a href="http://msdn.microsoft.com/en-us/windows/home/"&gt;http://msdn.microsoft.com/en-us/windows/home/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Le sessioni dell'evento BUILD sono disponibili all'indirizzo: &lt;a href="http://channel9.msdn.com/Events/BUILD/BUILD2011?sort=sequential&amp;amp;direction=desc&amp;amp;term"&gt;http://channel9.msdn.com/Events/BUILD/BUILD2011?sort=sequential&amp;amp;direction=desc&amp;amp;term&lt;/a&gt;=&lt;/p&gt;  &lt;p&gt;A questo punto non ci resta che “giocare”!!!!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:7a62a870-a6bf-4609-afac-75ea01a62c6e" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/windows+8" rel="tag"&gt;windows 8&lt;/a&gt;,&lt;a href="http://technorati.com/tags/windows+8+developer+preview" rel="tag"&gt;windows 8 developer preview&lt;/a&gt;,&lt;a href="http://technorati.com/tags/build" rel="tag"&gt;build&lt;/a&gt;,&lt;a href="http://technorati.com/tags/build+keynote" rel="tag"&gt;build keynote&lt;/a&gt;,&lt;a href="http://technorati.com/tags/win8" rel="tag"&gt;win8&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-5266451555197432070?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/5266451555197432070/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=5266451555197432070&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/5266451555197432070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/5266451555197432070'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/09/windows-8-build-arrivato.html' title='Windows 8 @ BUILD : arrivato!!!!'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-2414197617087756500</id><published>2011-09-09T09:36:00.001+02:00</published><updated>2011-09-09T09:36:06.149+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Annunci'/><category scheme='http://www.blogger.com/atom/ns#' term='Eventi'/><category scheme='http://www.blogger.com/atom/ns#' term='DomusDotNet'/><category scheme='http://www.blogger.com/atom/ns#' term='Entity Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='Community'/><title type='text'>DomusDotNet : Pomeriggio Entity Framework</title><content type='html'>&lt;p&gt;&lt;a href="http://www.domusdotnet.org/eventi/pomeriggio-ef.aspx" target="_blank"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-UPrRHm9wt64/Tmm_8TOE8kI/AAAAAAAAA7Q/fB09opjkjxY/image%25255B6%25255D.png?imgmax=800" width="550" height="458" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.domusdotnet.org" target="_blank"&gt;DomusDotNet&lt;/a&gt;, in collaborazione con Microsoft, &lt;a href="http://efprof.com/" target="_blank"&gt;EF Profiler by Hibernating Rhinos&lt;/a&gt;, &lt;a href="http://www.fag.it/" target="_blank"&gt;Edizioni FAG&lt;/a&gt;, &lt;a href="http://oreilly.com/" target="_blank"&gt;O’Reilly&lt;/a&gt;, organizza l’evento &lt;a href="http://www.domusdotnet.org/eventi/pomeriggio-ef.aspx" target="_blank"&gt;Pomeriggio Entity Framework&lt;/a&gt;. Un pomeriggio dedicato all’ORM di casa Microsoft.&lt;/p&gt;  &lt;p&gt;Se avete dubbi, perplessità, domande o semplicemente volete conoscere EF, potrebbe essere il caso di investire un pomeriggio e venire a seguirci!!!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:e5588803-5e35-4382-9d0f-1a57b576d5a6" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/entity+framework" rel="tag"&gt;entity framework&lt;/a&gt;,&lt;a href="http://technorati.com/tags/evento" rel="tag"&gt;evento&lt;/a&gt;,&lt;a href="http://technorati.com/tags/pomeriggio+entity+framework" rel="tag"&gt;pomeriggio entity framework&lt;/a&gt;,&lt;a href="http://technorati.com/tags/code+first" rel="tag"&gt;code first&lt;/a&gt;,&lt;a href="http://technorati.com/tags/db+first" rel="tag"&gt;db first&lt;/a&gt;,&lt;a href="http://technorati.com/tags/model+first" rel="tag"&gt;model first&lt;/a&gt;,&lt;a href="http://technorati.com/tags/wp7" rel="tag"&gt;wp7&lt;/a&gt;,&lt;a href="http://technorati.com/tags/sql+compact+edition" rel="tag"&gt;sql compact edition&lt;/a&gt;,&lt;a href="http://technorati.com/tags/domusdotnet" rel="tag"&gt;domusdotnet&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-2414197617087756500?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/2414197617087756500/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=2414197617087756500&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/2414197617087756500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/2414197617087756500'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/09/domusdotnet-pomeriggio-entity-framework.html' title='DomusDotNet : Pomeriggio Entity Framework'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/-UPrRHm9wt64/Tmm_8TOE8kI/AAAAAAAAA7Q/fB09opjkjxY/s72-c/image%25255B6%25255D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-1741510556368431743</id><published>2011-09-07T08:00:00.000+02:00</published><updated>2011-09-07T08:00:04.742+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Kinect'/><title type='text'>Alla scoperta del Kinect : utilizzo del Kinect in modalità polling</title><content type='html'>&lt;p&gt;Nei precedenti post abbiamo visto che il Kinect ci mette a disposizione una serie di eventi che ci permettono di recuperare i frame video, di profondità o gli skeleton data.&lt;/p&gt;  &lt;p&gt;Possiamo utilizzare le potenzialità del Kinect anche senza fare ricorso alla gestione di tali eventi ma utilizzando una tecnica di polling sugli streams.&lt;/p&gt;  &lt;p&gt;Partiamo dall’inizio: la classe Runtime (già vista in precedenza) ci mette a disposizione 3 proprietà utilissime in questo contesto e che contengono proprio gli stream di cui sopra.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-_IO6Bbg7P2c/TmJaCh-Nx5I/AAAAAAAAA7I/9YCQxqeUPs0/s1600-h/image%25255B2%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-s2QV02lXrNA/TmJaDaiX7iI/AAAAAAAAA7M/asswXwGrRyU/image_thumb.png?imgmax=800" width="500" height="180" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;VideoStream&lt;/strong&gt; : è un’istanza di ImageStream che incapsula lo stream video; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;DepthStream&lt;/strong&gt; : è un’istanza di ImageStream che incapsula lo stream dei dati di profondità; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;SkeletonEngine&lt;/strong&gt; : è il motore di skeletal Tracking che permette l’accesso ai frem di skeleton data. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;In particolare osserviamo la presenza, in tutte le classi in gioco, del metodo GetNextFrame il cui risultato è un oggetto di tipo ImageFrame per il VideoStream e per il DepthStream e SkeletonFrame per lo SkeletonEngine.&lt;/p&gt;  &lt;p&gt;ImageFrame e SkeletonFrame sono esattamente le istanze che ci vengono restituite all’interno degli eventi della classe Runtime utilizzati in precedenza.&lt;/p&gt;  &lt;p&gt;Per questo motivo possiamo utilizzare questo metodo per accedere allo stream e recuperare il frame che ci interessa.&lt;/p&gt;  &lt;p&gt;L’applicazione allegata a questo post altro non fa che visualizzare lo stream video e depth utilizzando un polling.&lt;/p&gt;  &lt;p&gt;In particolare vengono utilizzati due Task che si occupano di eseguire il “polling” accedendo ai differenti stream.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:d5403218-11a6-4c84-9793-7665bb6ba4e6" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Private&lt;/span&gt; Nui &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Runtime&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Private&lt;/span&gt; VideoWorkTask &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Task&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;Private&lt;/span&gt; DepthWorkTask &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Task&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Private&lt;/span&gt; WorkTaskTokenSource &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;CancellationTokenSource&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Private&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt; MainWindow_Loaded(sender &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Object&lt;/span&gt;, e &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; System.Windows.&lt;span style="color:#2b91af"&gt;RoutedEventArgs&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;Handles&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Me&lt;/span&gt;.Loaded&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Try&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        Nui = &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Runtime&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        Nui.Initialize(&lt;span style="color:#2b91af"&gt;RuntimeOptions&lt;/span&gt;.UseColor &lt;span style="color:#0000ff"&gt;Or&lt;/span&gt; &lt;span style="color:#2b91af"&gt;RuntimeOptions&lt;/span&gt;.UseDepthAndPlayerIndex)&lt;/li&gt; &lt;li&gt;        Nui.VideoStream.Open(&lt;span style="color:#2b91af"&gt;ImageStreamType&lt;/span&gt;.Video, 2, &lt;span style="color:#2b91af"&gt;ImageResolution&lt;/span&gt;.Resolution640x480, &lt;span style="color:#2b91af"&gt;ImageType&lt;/span&gt;.Color)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        Nui.DepthStream.Open(&lt;span style="color:#2b91af"&gt;ImageStreamType&lt;/span&gt;.Depth, 2, &lt;span style="color:#2b91af"&gt;ImageResolution&lt;/span&gt;.Resolution320x240, &lt;span style="color:#2b91af"&gt;ImageType&lt;/span&gt;.DepthAndPlayerIndex)&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        WorkTaskTokenSource = &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;CancellationTokenSource&lt;/span&gt;()&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; cancellationToken = WorkTaskTokenSource.Token&lt;/li&gt; &lt;li&gt;        VideoWorkTask = &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Task&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Action&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Object&lt;/span&gt;)(&lt;span style="color:#0000ff"&gt;AddressOf&lt;/span&gt; VideoWorkTaskCode), Nui, cancellationToken)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        VideoWorkTask.Start()&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        cancellationToken = WorkTaskTokenSource.Token&lt;/li&gt; &lt;li&gt;        DepthWorkTask = &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Task&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Action&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Object&lt;/span&gt;)(&lt;span style="color:#0000ff"&gt;AddressOf&lt;/span&gt; DepthWorkTaskCode), Nui, cancellationToken)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        DepthWorkTask.Start()&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Catch&lt;/span&gt; ex &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Exception&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Try&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Viene inizializzata l’istanza di Runtime e gli stream Video e Depth, non vengono agganciati i gestori di evento ma vengono avviati due task che si occupano di recuperare i frame:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:62c00186-31a4-422c-bb63-8d2a2873529b" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Private&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt; VideoWorkTaskCode(obj &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Object&lt;/span&gt;)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; nui = &lt;span style="color:#0000ff"&gt;CType&lt;/span&gt;(obj, &lt;span style="color:#2b91af"&gt;Runtime&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;While&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Not&lt;/span&gt; WorkTaskTokenSource.IsCancellationRequested&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;If&lt;/span&gt; nui &lt;span style="color:#0000ff"&gt;IsNot&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color:#0000ff"&gt;AndAlso&lt;/span&gt; nui.VideoStream &lt;span style="color:#0000ff"&gt;IsNot&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Then&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; frame = nui.VideoStream.GetNextFrame(0)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="color:#0000ff"&gt;If&lt;/span&gt; frame &lt;span style="color:#0000ff"&gt;IsNot&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Then&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                Dispatcher.BeginInvoke(&lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt;()&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                                           &lt;span style="color:#0000ff"&gt;Me&lt;/span&gt;.VideoImage.Source = frame.ToBitmapSource()&lt;/li&gt; &lt;li&gt;                                       &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt;)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;If&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;If&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        System.Threading.&lt;span style="color:#2b91af"&gt;Thread&lt;/span&gt;.Sleep(100)&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;While&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:6d2d25a5-c828-49a3-afb0-4e865bd954a5" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Private&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt; DepthWorkTaskCode(obj &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Object&lt;/span&gt;)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; nui = &lt;span style="color:#0000ff"&gt;CType&lt;/span&gt;(obj, &lt;span style="color:#2b91af"&gt;Runtime&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;While&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Not&lt;/span&gt; WorkTaskTokenSource.IsCancellationRequested&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;If&lt;/span&gt; nui &lt;span style="color:#0000ff"&gt;IsNot&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color:#0000ff"&gt;AndAlso&lt;/span&gt; nui.DepthStream &lt;span style="color:#0000ff"&gt;IsNot&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Then&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; frame = nui.DepthStream.GetNextFrame(0)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="color:#0000ff"&gt;If&lt;/span&gt; frame &lt;span style="color:#0000ff"&gt;IsNot&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Then&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                Dispatcher.BeginInvoke(&lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt;()&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                                           &lt;span style="color:#0000ff"&gt;Me&lt;/span&gt;.DepthImage.Source = frame.ToBitmapSource()&lt;/li&gt; &lt;li&gt;                                       &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt;)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;If&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;If&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        System.Threading.&lt;span style="color:#2b91af"&gt;Thread&lt;/span&gt;.Sleep(100)&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;While&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;A differenza della gestione degli eventi vista nei precedenti post, in questo caso i task vengono eseguiti in threads differenti dal principale ed è, quindi, necessario l’utilizzo del Dispatcher per aggiornare l’interfaccia.&lt;/p&gt;  &lt;p&gt;Il metodo GetNextFrame prevede un parametro che indica quanti millisecondi attendere prima di restituire il frame.&lt;/p&gt;  &lt;p&gt;Il valore di ritorno di GetFrame può anche essere nothing (nel caso che il frame non sia ancora pronto).&lt;/p&gt;  &lt;p&gt;Questa tecnica è un “pelino” più complicata di quella Event-Driven e deve essere utilizzata quando l’applicazione lo richiede (ad esempio abbiamo la necessità di recuperare un frame ogni x secondi).&lt;/p&gt;  &lt;p&gt;&lt;iframe style="padding-bottom: 0px; background-color: #fcfcfc; padding-left: 0px; width: 98px; padding-right: 0px; height: 115px; padding-top: 0px" title="Preview" marginheight="0" src="https://skydrive.live.com/embedicon.aspx/Public/Allegati%20Blog/Kinect/Kinect-Polling.zip?cid=4aab693689223ee9&amp;amp;sc=documents" frameborder="0" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;   &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:ab8b1205-11fc-4df8-94a9-e754494e0b8e" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/kinect" rel="tag"&gt;kinect&lt;/a&gt;,&lt;a href="http://technorati.com/tags/kinect+sdk" rel="tag"&gt;kinect sdk&lt;/a&gt;,&lt;a href="http://technorati.com/tags/polling" rel="tag"&gt;polling&lt;/a&gt;,&lt;a href="http://technorati.com/tags/video+stream" rel="tag"&gt;video stream&lt;/a&gt;,&lt;a href="http://technorati.com/tags/depth+stream" rel="tag"&gt;depth stream&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-1741510556368431743?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/1741510556368431743/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=1741510556368431743&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/1741510556368431743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/1741510556368431743'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/09/alla-scoperta-del-kinect-utilizzo-del.html' title='Alla scoperta del Kinect : utilizzo del Kinect in modalità polling'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/-s2QV02lXrNA/TmJaDaiX7iI/AAAAAAAAA7M/asswXwGrRyU/s72-c/image_thumb.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-8923326953811803380</id><published>2011-09-05T08:00:00.000+02:00</published><updated>2011-09-05T08:00:03.222+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Kinect'/><title type='text'>Alla scoperta del Kinect: gli smooth parameters</title><content type='html'>&lt;p&gt;Abbiamo accennato in questo &lt;a href="http://codetailor.blogspot.com/2011/08/alla-scoperta-del-kinect-gli-scheletri.html" target="_blank"&gt;post&lt;/a&gt; come sia possibile eseguire un filtro sui dati grezzi provenienti dal Kinect per “smussare” e correggere le fluttuazioni.&lt;/p&gt;  &lt;p&gt;In questo post vorrei cercare di capire (per primo io) quale è il significato dei vari parametri utilizzabili.&lt;/p&gt;  &lt;p&gt;Riprendiamo il discorso dall’inizializzazione della classi Runtime e l’impostazione dei parametri di smoothing:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:f95dd1cd-3380-4924-840d-e873ac2bd1e2" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Try&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    _Nui = &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Runtime&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    _Nui.Initialize(&lt;span style="color:#2b91af"&gt;RuntimeOptions&lt;/span&gt;.UseSkeletalTracking)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;AddHandler&lt;/span&gt; _Nui.SkeletonFrameReady, &lt;span style="color:#0000ff"&gt;AddressOf&lt;/span&gt; SkeletonFrameReadyHandler&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    _Nui.SkeletonEngine.TransformSmooth = &lt;span style="color:#0000ff"&gt;True&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; parameters = &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;TransformSmoothParameters&lt;/span&gt;() &lt;span style="color:#0000ff"&gt;With&lt;/span&gt; {.Smoothing = 1.0F,&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                                                        .Correction = 0.1F,&lt;/li&gt; &lt;li&gt;                                                        .Prediction = 0.1F,&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                                                        .JitterRadius = 0.05F,&lt;/li&gt; &lt;li&gt;                                                        .MaxDeviationRadius = 0.05F}&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    _Nui.SkeletonEngine.SmoothParameters = parameters&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Catch&lt;/span&gt; ex &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Exception&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Try&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;La classe TransformSmoothParameters, come possiamo vedere, ha 5 proprietà che dovrebbero consentire il filtraggio delle imprecisioni e dei rumori che i sensori del Kinect introducono nei dati grezzi.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Smooting&lt;/strong&gt; : lo smoothing (il termine italiano più vicino è “pulizia”), in elaborazione delle immagini, consiste nell’applicare una funzione di filtro il cui scopo è quello di mettere in evidenza la parte del segnale “buona” cercando di sopprimere l’eventuale rumore dovuto da cause di diversa natura che, comunque, sporcano il segnale stesso. Nel nostro caso, piccoli movimenti del corpo umano, possono determinare del rumore che rende la tracciatura dello stesso poco affidabile. La proprietà Smoothing (che accetta il range [0,1]) permette di impostare la quantità di smoothing da applicare. Il valore 0 indica che non viene applicato alcun smoothing mentre l’effetto smoothing aumenta all’avvicinarsi al valore 1. Aumentare il valore di questa proprietà aumenta la latenza del segnale.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Correction&lt;/strong&gt; : la proprietà permette di impostare la correzione&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Prediction&lt;/strong&gt; : permette di impostare il numero di frame predetti dal motore.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Jitter Radius&lt;/strong&gt; : il jitter è la variazione di una o più grandezze caratteristiche di un segnale che possono minare l’integrità del segnale stesso. La proprietà JitterRadius consente di impostare il raggio di riduzione del jitter (espresso in metri). Qualsiasi jitter che superi il raggio impostato viene normalizzato al raggio stesso.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Maximum Deviation Radius&lt;/strong&gt; : permette di specificare il massimo scostamento (in metri) dei dati filtrati rispetto ai dati grezzi. I valori filtrati che superano la distanza impostata rispetto ai dati grezzi, vengono normalizzati a questa distanza (rispetto al valore filtrato).&lt;/p&gt;  &lt;p&gt;Non esistono dei valori “buoni” per qualsiasi applicazione ma è necessario procedere sperimentando i migliori valori di smoothing. L’apporto di tali correzioni dipende dall’ambiente circostante e, quindi, anche a parità di applicazione possono variare in base a dove il Kinect è posizionato.&lt;/p&gt;  &lt;p&gt;Per chi fosse interessato ad approfondire, è necessario sapere che il filtro attualmente utilizzato nell’SDK del Kinect si basa sul metodo a doppio esponenziale di Holt (&lt;a href="http://vbautomation.110mb.com/FORECASTING/expoential_smoothing_methods.htm#Holt's" target="_blank"&gt;link&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:7e13bdec-518d-40ec-8e45-55a54d7c0c04" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/kinect" rel="tag"&gt;kinect&lt;/a&gt;,&lt;a href="http://technorati.com/tags/kinect+sdk" rel="tag"&gt;kinect sdk&lt;/a&gt;,&lt;a href="http://technorati.com/tags/smooth+parameters" rel="tag"&gt;smooth parameters&lt;/a&gt;,&lt;a href="http://technorati.com/tags/correction" rel="tag"&gt;correction&lt;/a&gt;,&lt;a href="http://technorati.com/tags/smoothing" rel="tag"&gt;smoothing&lt;/a&gt;,&lt;a href="http://technorati.com/tags/skeletal+engine" rel="tag"&gt;skeletal engine&lt;/a&gt;,&lt;a href="http://technorati.com/tags/skeletal+data" rel="tag"&gt;skeletal data&lt;/a&gt;,&lt;a href="http://technorati.com/tags/jitter" rel="tag"&gt;jitter&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-8923326953811803380?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/8923326953811803380/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=8923326953811803380&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/8923326953811803380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/8923326953811803380'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/09/alla-scoperta-del-kinect-gli-smooth.html' title='Alla scoperta del Kinect: gli smooth parameters'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-6795895828292773399</id><published>2011-08-29T08:00:00.000+02:00</published><updated>2011-08-29T08:00:04.287+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Kinect'/><title type='text'>Alla scoperta del Kinect : gli scheletri e l’uomo vitruviano</title><content type='html'>&lt;p&gt;Cosa c’entra Leonardo e il suo &lt;a href="http://it.wikipedia.org/wiki/Uomo_vitruviano" target="_blank"&gt;Uomo Vitruviano&lt;/a&gt;, gli scheletri ed il Kinect? &lt;/p&gt;  &lt;p&gt;Apparentemente nulla, ma leggendo questo post scoprirete che, invece, un legame c’è.&lt;/p&gt;  &lt;p&gt;Abbiamo visto in precedenti post che l’infernale aggeggio (il Kinect) ci permette di ottenere, in maniera molto facile, le immagini video e le immagini di profondità. Già con questi due insiemi di informazioni potremmo realizzare una sorta di interazione tra i player ed il nostro applicativo.&lt;/p&gt;  &lt;p&gt;L’SDK del Kinect, però, fa molto di più perché è in grado di fornirci gli “scheletri” dei player disposti davanti ad esso.&lt;/p&gt;  &lt;p&gt;Vediamo come procedere per ricavare ciò.&lt;/p&gt;  &lt;p&gt;La classe Runtime (di cui abbiamo parlato in questo &lt;a href="http://codetailor.blogspot.com/2011/08/alla-scoperta-del-kinect-la-classe.html" target="_blank"&gt;post&lt;/a&gt;) prevede un evento chiamato SkeletonFrameReady che viene sollevato quando SDK ha a disposizione un oggetto di tipo SkeletonFrame pronto per essere elaborato.&lt;/p&gt;  &lt;p&gt;L’istanza di questo oggetto è passata come proprietà dell’argomento dell’evento SkeletonFrameReady:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-J2r7w8isix4/TlZwJ8jdvFI/AAAAAAAAA6g/D0IFbRI54vo/s1600-h/image5.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/-H9lvMt2iMg0/TlZwKuYMRpI/AAAAAAAAA6k/LWwWzPRrRV0/image_thumb1.png?imgmax=800" width="500" height="246" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;La classe SkeletonFrame, come possiamo vedere, espone una serie di proprietà decisamente interessanti:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;FloorClipPlane&lt;/strong&gt; : l’oggetto Vector contenuto in questa proprietà ci fornisce i coefficienti dell’equazione del piano di terra (pavimento) stimata dall’SDK. L’equazione ha la forma: &lt;/li&gt; &lt;/ul&gt;  &lt;p align="center"&gt;Ax+By+Cz+D=0&lt;/p&gt;  &lt;p&gt;dove:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font color="#000000"&gt;A = FloorClipPlane.X&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font color="#000000"&gt;B = FloorClipPlane.Y&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font color="#000000"&gt;C = FloorClipPlane.Z&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font color="#000000"&gt;D = FloorClipPlane.W&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font color="#000000"&gt;L’equazione del piano è normalizzata, quindi D rappresenta, di fatto, l’altezza della camera rispetto al pavimento. Nella versione Beta dell’SDK il vettore è sempre nullo;&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;NormalToGravity&lt;/strong&gt; : consente di avere informazioni sul vettore di&amp;#160; gravità. Nella versione Beta dell’SDK il vettore è sempre nullo.; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;FrameNumber&lt;/strong&gt; : è il numero del frame in esame; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;TimeStamp&lt;/strong&gt; : timestamp del frame (in maniera analoga a quanto visto per il video e la profondità); &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Quality&lt;/strong&gt; : indica la qualità del frame; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Skeletons&lt;/strong&gt; : contiene un array di “scheletri” dei giocatori tracciati. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Il Kinect è in grado di tracciare fino a 6 giocatori contemporaneamente anche se:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;solo 2 giocatori possono essere tracciati “attivamente”. Di questi si conoscono tantissime info all’interno della struttura SkeletonData; &lt;/li&gt;    &lt;li&gt;fino a 4 giocatori possono essere tracciati “passivamente”. L’SDK mantiene solo alcune informazioni di questi giocatori.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;La classe SkeletonData contiene, per ogni giocatore, i dati relativi alla posizione dello stesso nello spazio:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-bVollaiDGEU/TlZwLTNh1-I/AAAAAAAAA6o/vUMIzFsRrWM/s1600-h/image11.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-suz0QebgLWo/TlZwMvqeTdI/AAAAAAAAA6s/iqwY01s6LS8/image_thumb3.png?imgmax=800" width="500" height="279" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Lo scheletro è individuato da una collezione di punti del corpo umano, denominati Joint, e memorizzati nell’array Joints. Ogni Joint è individuato da un Id (di tipo JointID) e, allo stato attuale, possiamo contare su ben 20 punti mostrati nella seguente figura (ecco l’uomo vitruviano del titolo):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-CzY4WTgHzGQ/TlZwOdYaIcI/AAAAAAAAA6w/porgvzzaWy4/s1600-h/VitruvialMan2.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="VitruvialMan" border="0" alt="VitruvialMan" src="http://lh6.ggpht.com/-GCCE2uK3B-U/TlZwP5iUHNI/AAAAAAAAA60/I6PWGXmInOI/VitruvialMan_thumb.png?imgmax=800" width="291" height="288" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ogni Joint fornisce la propria posizione nello spazio (proprietà Position) e lo stato di tracciamento (proprietà TrackingState). La posizione è identificata dalle tre coordinate spaziali secondo il seguente schema:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-c1yDvkGc0Fg/TlZwQkG9LBI/AAAAAAAAA64/P_VWSBgreCI/s1600-h/xyz2.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="xyz" border="0" alt="xyz" src="http://lh6.ggpht.com/-P_u-LxWN3O4/TlZwRPUvtMI/AAAAAAAAA68/exrxwPIB54k/xyz_thumb.png?imgmax=800" width="236" height="260" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;X e Y variano in un intervallo [-1,1] mentre Z esprime la distanza (in metri) dal sensore. Il valore di W, secondo quanto riportato dalla documentazione ufficiale dovrebbe variare tra 0 e 1 e identificare la precisione della posizione (1 posizione affidabile, 0 posizione totalmente inaffidabile) ma, allo stato attuale, il valore di W è sempre pari a 1.&lt;/p&gt;  &lt;p&gt;La proprietà TrackingState della classe SkeletonData ci fornisce informazioni relative al tipo di tracciamento a cui è sottoposto lo scheletro e cioè se si tratta di un giocatore attivo (Tracked), passivo (PositionOnly) oppure se non è tracciato (NotTracked).&lt;/p&gt;  &lt;p&gt;La proprietà Quality ci dice se lo scheletro è stato “tagliato”. Se, ad esempio, il Kinect riesce ad individuare lo scheletro dalle ginocchia in su (ad esempio perché caviglie e piedi sono nascosti), allora nella proprietà Quality avremo il valore ClippedBottom ad indicare che lo scheletro è stato “tagliato” in basso.&lt;/p&gt;  &lt;p&gt;Interessante la proprietà Position di SkeletonData che contiene la posizione (approssimata) del centro di massa dello scheletro.&lt;/p&gt;  &lt;p&gt;L’applicazione pratica che vi vorrei proporre a corollario di questo post è la realizzazione di una semplice applicazione che mostra, in tempo reale, la posizione dei venti punti dell’uomo vitruviano di cui sopra.&lt;/p&gt;  &lt;p&gt;Cominciamo con il mostrare cosa vogliamo ottenere:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-4SI8rukN5ag/TlZwV14qmNI/AAAAAAAAA7A/hnZeAC2pO08/s1600-h/image20.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-2UcTmyK1uqM/TlZwXhVLxpI/AAAAAAAAA7E/UG3AGCER-QI/image_thumb8.png?imgmax=800" width="502" height="272" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In pratica abbiamo, istantaneamente, la posizione di tutti i Joints disponibili del primo SkeletonData tracciato e, per ogni Joint, abbiamo un diverso colore di sfondo in base al loro stato di tracciamento.&lt;/p&gt;  &lt;p&gt;In più visualizziamo il centro di massa (la TextBox in posizione “equivoca”),la qualità dello SkeletonFrame, il vettore NormalToGravity, il vettore FloorClipPlane (questi ultimi due sempre nulli).&lt;/p&gt;  &lt;p&gt;L’applicazione è un’applicazione WPF in cui ho deciso di adottare il pattern MVVM, quindi, per spiegare il funzionamento, ci occuperemo, innanzitutto del ViewModel per poi usare il motore di binding di WPF per agganciare la UI.&lt;/p&gt;  &lt;p&gt;Nel costruttore del View Model (MainWindowViewModel) avviamo l’istanza della classe Runtime dell’SDK del Kinect:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:26a838ff-f157-4774-b24e-fe2a3137a527" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt; &lt;span style="color:#0000ff"&gt;New&lt;/span&gt;()&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;If&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Not&lt;/span&gt; &lt;span style="color:#2b91af"&gt;DesignerProperties&lt;/span&gt;.GetIsInDesignMode(&lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;DependencyObject&lt;/span&gt;()) &lt;span style="color:#0000ff"&gt;Then&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;Try&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            Nui = &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Runtime&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;AddHandler&lt;/span&gt; Nui.DepthFrameReady, &lt;span style="color:#0000ff"&gt;AddressOf&lt;/span&gt; DepthFrameReadyHandler&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="color:#0000ff"&gt;AddHandler&lt;/span&gt; Nui.SkeletonFrameReady, &lt;span style="color:#0000ff"&gt;AddressOf&lt;/span&gt; SkeletonFrameHandler&lt;/li&gt; &lt;li&gt;            Nui.Initialize(&lt;span style="color:#2b91af"&gt;RuntimeOptions&lt;/span&gt;.UseDepthAndPlayerIndex &lt;span style="color:#0000ff"&gt;Or&lt;/span&gt; &lt;span style="color:#2b91af"&gt;RuntimeOptions&lt;/span&gt;.UseSkeletalTracking)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            Nui.DepthStream.Open(&lt;span style="color:#2b91af"&gt;ImageStreamType&lt;/span&gt;.Depth, 2, &lt;span style="color:#2b91af"&gt;ImageResolution&lt;/span&gt;.Resolution320x240, &lt;span style="color:#2b91af"&gt;ImageType&lt;/span&gt;.DepthAndPlayerIndex)&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;Catch&lt;/span&gt; ex &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Exception&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Try&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;If&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Se non ci troviamo in design mode (primo if) eseguiamo i seguenti passi:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;creiamo l’istanza di Runtime; &lt;/li&gt;    &lt;li&gt;agganciamo il gestore dell’evento DepthFrameReady che ci servirà esclusivamente per mostrare l’immagine di profondità a video; &lt;/li&gt;    &lt;li&gt;agganciamo il gestore dell’evento SkeletonFrameReady che ci servirà per elaborare gli scheletri che il Kinect ci fornirà nel tempo; &lt;/li&gt;    &lt;li&gt;inizializziamo la Runtime selezionando lo stream di profondità e di Skeletal tracking; &lt;/li&gt;    &lt;li&gt;apriamo lo stream di profondità decidendo una risoluzione di 320x240 (per la profondità abbiamo solamente 320x240 e 80x60). &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Tralasciamo il gestore di evento per le immagini di profondità (che abbiamo già visto nel precedente &lt;a href="http://codetailor.blogspot.com/2011/08/alla-scoperta-del-kinect-questione-di.html" target="_blank"&gt;post&lt;/a&gt;) e ci dedichiamo a quello dello Skeletal Tracking:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:7c0d51a3-aa3f-422f-8b08-f727f5ed6fa0" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Private&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt; SkeletonFrameHandler(sender &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Object&lt;/span&gt;, e &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;SkeletonFrameReadyEventArgs&lt;/span&gt;)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Me&lt;/span&gt;.NormalToGravity = e.SkeletonFrame.NormalToGravity&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Me&lt;/span&gt;.FloorClipPlane = e.SkeletonFrame.FloorClipPlane&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Me&lt;/span&gt;.Quality = e.SkeletonFrame.Quality.ToString()&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; skeleton = (&lt;span style="color:#0000ff"&gt;From&lt;/span&gt; s &lt;span style="color:#0000ff"&gt;In&lt;/span&gt; e.SkeletonFrame.Skeletons&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                  &lt;span style="color:#0000ff"&gt;Where&lt;/span&gt; s.TrackingState = &lt;span style="color:#2b91af"&gt;SkeletonTrackingState&lt;/span&gt;.Tracked&lt;/li&gt; &lt;li&gt;                  &lt;span style="color:#0000ff"&gt;Select&lt;/span&gt; s).FirstOrDefault()&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;If&lt;/span&gt; skeleton &lt;span style="color:#0000ff"&gt;IsNot&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Then&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;Me&lt;/span&gt;.CenterPosition = skeleton.Position&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;Me&lt;/span&gt;.Joints = skeleton.Joints.OfType(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Joint&lt;/span&gt;)()&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Else&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;Me&lt;/span&gt;.Joints = &lt;span style="color:#0000ff"&gt;Nothing&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;Me&lt;/span&gt;.CenterPosition = &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Vector&lt;/span&gt;()&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;If&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Le prime tre istruzioni non fanno altro che recuperare, rispettivamente, NormalToGravity, FloorClipPlane e Quality e valorizzare le relative proprietà del View Model (che andranno in binding con opportuni controlli di visualizzazione).&lt;/p&gt;  &lt;p&gt;Tramite la query LINQ seguente andiamo a selezionare, tra tutti gli scheletri forniti nell’argomento dell’evento, il primo che abbia stato di tracciamento pari a Tracked.    &lt;br /&gt;Se ne esiste almeno uno (abbiamo, quindi, una istanza valida di SkeletonData), andiamo a valorizzare le proprietà del View Model che ci consentono di visualizzare il valore del centro di massa (proprietà CenterPosition) e il valore di ogni singolo Joint dello scheletro (proprietà Joints).&lt;/p&gt;  &lt;p&gt;A questo punto abbiamo due tipologie di proprietà nel nostro View Model: quelle di tipo Vector (NormalToGravity, FloorClipPlane e CenterPosition) e la collezione di Joint esposta dalla Joints.&lt;/p&gt;  &lt;p&gt;Tutte queste proprietà verranno visualizzate tramite TextBox e utilizzeremo degli appositi Converter per formattare opportunamente le stesse.&lt;/p&gt;  &lt;p&gt;Per le proprietà di tipo Vector creiamo il converter:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:3ccfd0d9-bae1-4c6d-b242-7d212cfc34f9" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;VectorToStringConverter&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Implements&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IValueConverter&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt; Convert(value &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Object&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;                            targetType &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; System.&lt;span style="color:#2b91af"&gt;Type&lt;/span&gt;,&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                            parameter &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Object&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;                            culture &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; System.Globalization.&lt;span style="color:#2b91af"&gt;CultureInfo&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Object&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Implements&lt;/span&gt; System.Windows.Data.&lt;span style="color:#2b91af"&gt;IValueConverter&lt;/span&gt;.Convert&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;If&lt;/span&gt; &lt;span style="color:#0000ff"&gt;TypeOf&lt;/span&gt; value &lt;span style="color:#0000ff"&gt;Is&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Vector&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Then&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; vector = &lt;span style="color:#0000ff"&gt;CType&lt;/span&gt;(value, &lt;span style="color:#2b91af"&gt;Vector&lt;/span&gt;)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; strFormat = &lt;span style="color:#a31515"&gt;&amp;quot;{0:0.000} {1:0.000} {2:0.000} [{3:0.000}]&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;If&lt;/span&gt; parameter &lt;span style="color:#0000ff"&gt;IsNot&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Then&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                strFormat = parameter.ToString()&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;If&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; str = &lt;span style="color:#0000ff"&gt;String&lt;/span&gt;.Format(strFormat, vector.X, vector.Y, vector.Z, vector.W)&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;Return&lt;/span&gt; str&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;Else&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;Return&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Nothing&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;If&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt; ConvertBack(value &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Object&lt;/span&gt;,&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                                targetType &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; System.&lt;span style="color:#2b91af"&gt;Type&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;                                parameter &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Object&lt;/span&gt;,&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                                culture &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; System.Globalization.&lt;span style="color:#2b91af"&gt;CultureInfo&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Object&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Implements&lt;/span&gt; System.Windows.Data.&lt;span style="color:#2b91af"&gt;IValueConverter&lt;/span&gt;.ConvertBack&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;Throw&lt;/span&gt; &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#00008b"&gt;NotImplementedException&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Class&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;In sostanza, prendiamo il valore da convertire e se è di tipo Vector e eseguiamo il metodo String.Format utilizzando la stringa di formato passata come parametro (o quella di default se il parametro non è impostato) e i valori di X, Y, Z e W del vettore.    &lt;br /&gt;Grazie all’utilizzo di questo converter possiamo visualizzare il centro di massa con il seguente XAML:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:510e1050-f77c-4a94-881c-bd332903e00f" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;TextBox&lt;/span&gt;&lt;span style="color:#ff0000"&gt; Text&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color:#a31515"&gt;Binding&lt;/span&gt;&lt;span style="color:#ff0000"&gt; Path&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=CenterPosition,&lt;/span&gt;&lt;span style="color:#ff0000"&gt; Converter&lt;/span&gt;&lt;span style="color:#0000ff"&gt;={&lt;/span&gt;&lt;span style="color:#a31515"&gt;StaticResource&lt;/span&gt;&lt;span style="color:#ff0000"&gt; VectorToStringConverter}&lt;/span&gt;&lt;span style="color:#0000ff"&gt;,&lt;/span&gt;&lt;span style="color:#ff0000"&gt; ConverterParameter&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;#92;&lt;/span&gt;\cf1 {0&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;0&lt;span style="color:#0000ff"&gt;.&lt;/span&gt;000&amp;#92;\cf1 } &amp;#92;\cf1 {1&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;0&lt;span style="color:#0000ff"&gt;.&lt;/span&gt;000&amp;#92;\cf1 } &amp;#92;\cf1 {2&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;0&lt;span style="color:#0000ff"&gt;.&lt;/span&gt;000&amp;#92;\cf1 } }&amp;quot;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#ff0000"&gt; Canvas.Left&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;448&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000"&gt; Canvas.Top&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;460&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000"&gt; Style&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color:#a31515"&gt;StaticResource&lt;/span&gt;&lt;span style="color:#ff0000"&gt; PosizionTextBox}&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;quot;&lt;/span&gt; &lt;/li&gt; &lt;li&gt;        &lt;span style="color:#ff0000"&gt; Background&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;LightSteelBlue&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt; Foreground&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;White&amp;quot;/&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Più interessante è sicuramente il converter che ci permetterà di visualizzare i dati di posizione del singolo Joint all’interno dei 20 TextBox che circondano l’uomo vitruviano.    &lt;br /&gt;In questo caso il converter accetta come parametri la stringa identificante l’id del Joint (as esempio “HandRight” per la mano destra) e la stringa di formattazione (questa è opzionale) separati dal carattere “|”.     &lt;br /&gt;Il codice del converter è il seguente:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:90d45b91-abd1-4103-8d21-86ab18cd805c" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;SkeletonJointPositionToStringConverter&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Implements&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IValueConverter&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt; Convert(value &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Object&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;                            targetType &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; System.&lt;span style="color:#2b91af"&gt;Type&lt;/span&gt;,&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                            parameter &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Object&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;                            culture &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; System.Globalization.&lt;span style="color:#2b91af"&gt;CultureInfo&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Object&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Implements&lt;/span&gt; System.Windows.Data.&lt;span style="color:#2b91af"&gt;IValueConverter&lt;/span&gt;.Convert&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;If&lt;/span&gt; &lt;span style="color:#0000ff"&gt;TypeOf&lt;/span&gt; value &lt;span style="color:#0000ff"&gt;Is&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IEnumerable&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Joint&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;Then&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; joints = &lt;span style="color:#0000ff"&gt;CType&lt;/span&gt;(value, &lt;span style="color:#2b91af"&gt;IEnumerable&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Joint&lt;/span&gt;))&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; parameters = parameter.ToString.Split(&lt;span style="color:#a31515"&gt;&amp;quot;|&amp;quot;c&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;If&lt;/span&gt; parameters.Count &amp;gt; 0 &lt;span style="color:#0000ff"&gt;Then&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; jointId = parameters(0)&lt;/li&gt; &lt;li&gt;                &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; jointQuery = &lt;span style="color:#0000ff"&gt;From&lt;/span&gt; j &lt;span style="color:#0000ff"&gt;In&lt;/span&gt; joints&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                                &lt;span style="color:#0000ff"&gt;Where&lt;/span&gt; j.ID = &lt;span style="color:#0000ff"&gt;CType&lt;/span&gt;(&lt;span style="color:#2b91af"&gt;[Enum]&lt;/span&gt;.Parse(&lt;span style="color:#0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color:#2b91af"&gt;JointID&lt;/span&gt;), jointId), &lt;span style="color:#2b91af"&gt;JointID&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;                                &lt;span style="color:#0000ff"&gt;Select&lt;/span&gt; j&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="color:#0000ff"&gt;If&lt;/span&gt; jointQuery.Any() &lt;span style="color:#0000ff"&gt;Then&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; joint = jointQuery.First()&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                    &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; strFormat = &lt;span style="color:#a31515"&gt;&amp;quot;{0:0.000} {1:0.000} {2:0.000}&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="color:#0000ff"&gt;If&lt;/span&gt; parameters.Count &amp;gt; 1 &lt;span style="color:#0000ff"&gt;Then&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                        strFormat = parameters(1)&lt;/li&gt; &lt;li&gt;                    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;If&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                    &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; str = &lt;span style="color:#0000ff"&gt;String&lt;/span&gt;.Format(strFormat, joint.Position.X, joint.Position.Y, joint.Position.Z)&lt;/li&gt; &lt;li&gt;                    &lt;span style="color:#0000ff"&gt;Return&lt;/span&gt; str&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="color:#0000ff"&gt;Else&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="color:#0000ff"&gt;Return&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Nothing&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;If&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;Else&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="color:#0000ff"&gt;Return&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Nothing&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;If&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="color:#0000ff"&gt;Else&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="color:#0000ff"&gt;Return&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Nothing&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;If&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt; ConvertBack(value &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Object&lt;/span&gt;,&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                                targetType &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; System.&lt;span style="color:#2b91af"&gt;Type&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;                                parameter &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Object&lt;/span&gt;,&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                                culture &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; System.Globalization.&lt;span style="color:#2b91af"&gt;CultureInfo&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Object&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Implements&lt;/span&gt; System.Windows.Data.&lt;span style="color:#2b91af"&gt;IValueConverter&lt;/span&gt;.ConvertBack&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;Throw&lt;/span&gt; &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#00008b"&gt;NotImplementedException&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Class&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;In questo caso, se il valore che stiamo convertendo è di tipo IEnumerable(Of Joint) (come la proprietà Joints del ViewModel), andiamo a ricercare, tramite una query LINQ, il Joint che ha id passato come parametro (notare la chiamata al metodo Split di String per ricavare i due argomenti separati da “|”). Se la query LINQ restituisce un joint valido (se la stringa di ID passata per argomento è uno dei valori ammessi), allora creiamo la stringa da visualizzare utilizzando la posizione del joint stesso e la restituiamo al chiamante.&lt;/p&gt;  &lt;p&gt;Grazie a questo converter possiamo utilizzare il binding per visualizzare tutti e 20 i punti dell’uomo vitruviano senza dover creare 20 differenti proprietà nel view model. Ad esempio la visualizzazione della posizione della testa (Head) è la seguente:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:59a9009a-acb6-48fb-aedb-3866e0dfd0f3" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;TextBox&lt;/span&gt;&lt;span style="color:#ff0000"&gt; Canvas.Left&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;470&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000"&gt; Canvas.Top&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;70&amp;quot;&lt;/span&gt;&lt;span style="color:#ff0000"&gt; Style&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color:#a31515"&gt;StaticResource&lt;/span&gt;&lt;span style="color:#ff0000"&gt; PosizionTextBox}&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;quot;&lt;/span&gt; &lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#ff0000"&gt; Text&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color:#a31515"&gt;Binding&lt;/span&gt;&lt;span style="color:#ff0000"&gt; Path&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=Joints,&lt;/span&gt;&lt;span style="color:#ff0000"&gt; Converter&lt;/span&gt;&lt;span style="color:#0000ff"&gt;={&lt;/span&gt;&lt;span style="color:#a31515"&gt;StaticResource&lt;/span&gt;&lt;span style="color:#ff0000"&gt; SkeletonJointPositionToStringConverter1}&lt;/span&gt;&lt;span style="color:#0000ff"&gt;,&lt;/span&gt;&lt;span style="color:#ff0000"&gt; ConverterParameter&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=Head&lt;/span&gt;|&amp;#92;\cf1 {0&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;0&lt;span style="color:#0000ff"&gt;.&lt;/span&gt;000&amp;#92;\cf1 } &amp;#92;\cf1 {1&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;0&lt;span style="color:#0000ff"&gt;.&lt;/span&gt;000&amp;#92;\cf1 } &amp;#92;\cf1 {2&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;0&lt;span style="color:#0000ff"&gt;.&lt;/span&gt;000&amp;#92;\cf1 }}&amp;quot; &lt;/li&gt; &lt;li&gt;        &lt;span style="color:#ff0000"&gt; Background&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color:#a31515"&gt;Binding&lt;/span&gt;&lt;span style="color:#ff0000"&gt; Path&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=Joints,&lt;/span&gt;&lt;span style="color:#ff0000"&gt; Converter&lt;/span&gt;&lt;span style="color:#0000ff"&gt;={&lt;/span&gt;&lt;span style="color:#a31515"&gt;StaticResource&lt;/span&gt;&lt;span style="color:#ff0000"&gt; SkeletonJointTrackingStateToSolidColorBrushConverter}&lt;/span&gt;&lt;span style="color:#0000ff"&gt;,&lt;/span&gt;&lt;span style="color:#ff0000"&gt; ConverterParameter&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=Head&lt;/span&gt;|&lt;span style="color:#0000ff"&gt;LightGreen&lt;/span&gt;|&lt;span style="color:#0000ff"&gt;LightYellow&lt;/span&gt;|&lt;span style="color:#0000ff"&gt;LightCoral}&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Osservando lo XAML, possiamo notare l’utilizzo di un binding anche sul background del TextBox e, questo, per fare in modo che in base allo stato di tracciamento del joint, si abbia un differente colore di sfondo. Anche in questo caso ricorriamo ad un converter:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:2a3e05f1-1462-4ad9-a742-371adeea6abf" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;SkeletonJointTrackingStateToSolidColorBrushConverter&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Implements&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IValueConverter&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt; Convert(value &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Object&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;                            targetType &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; System.&lt;span style="color:#2b91af"&gt;Type&lt;/span&gt;,&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                            parameter &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Object&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;                            culture &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; System.Globalization.&lt;span style="color:#2b91af"&gt;CultureInfo&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Object&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Implements&lt;/span&gt; System.Windows.Data.&lt;span style="color:#2b91af"&gt;IValueConverter&lt;/span&gt;.Convert&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;If&lt;/span&gt; &lt;span style="color:#0000ff"&gt;TypeOf&lt;/span&gt; value &lt;span style="color:#0000ff"&gt;Is&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IEnumerable&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Joint&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;Then&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; joints = &lt;span style="color:#0000ff"&gt;CType&lt;/span&gt;(value, &lt;span style="color:#2b91af"&gt;IEnumerable&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Joint&lt;/span&gt;))&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; parameters = parameter.ToString.Split(&lt;span style="color:#a31515"&gt;&amp;quot;|&amp;quot;c&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;If&lt;/span&gt; parameters.Count &amp;gt; 0 &lt;span style="color:#0000ff"&gt;Then&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; jointId = parameters(0)&lt;/li&gt; &lt;li&gt;                &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; jointQuery = &lt;span style="color:#0000ff"&gt;From&lt;/span&gt; j &lt;span style="color:#0000ff"&gt;In&lt;/span&gt; joints&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                                &lt;span style="color:#0000ff"&gt;Where&lt;/span&gt; j.ID = &lt;span style="color:#0000ff"&gt;CType&lt;/span&gt;(&lt;span style="color:#2b91af"&gt;[Enum]&lt;/span&gt;.Parse(&lt;span style="color:#0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color:#2b91af"&gt;JointID&lt;/span&gt;), jointId), &lt;span style="color:#2b91af"&gt;JointID&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;                                &lt;span style="color:#0000ff"&gt;Select&lt;/span&gt; j&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;                &lt;span style="color:#0000ff"&gt;If&lt;/span&gt; jointQuery.Any() &lt;span style="color:#0000ff"&gt;Then&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                    &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; joint = jointQuery.First()&lt;/li&gt; &lt;li&gt;                    &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; color &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Color&lt;/span&gt;?&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                    &lt;span style="color:#0000ff"&gt;Select&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Case&lt;/span&gt; joint.TrackingState&lt;/li&gt; &lt;li&gt;                        &lt;span style="color:#0000ff"&gt;Case&lt;/span&gt; &lt;span style="color:#2b91af"&gt;JointTrackingState&lt;/span&gt;.Tracked&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                            color = &lt;span style="color:#0000ff"&gt;If&lt;/span&gt;(parameters.Count() &amp;lt; 1, &lt;span style="color:#2b91af"&gt;Colors&lt;/span&gt;.LightGreen, &lt;span style="color:#2b91af"&gt;ColorUtility&lt;/span&gt;.GetColorFromName(parameters(1)))&lt;/li&gt; &lt;li&gt;                        &lt;span style="color:#0000ff"&gt;Case&lt;/span&gt; &lt;span style="color:#2b91af"&gt;JointTrackingState&lt;/span&gt;.Inferred&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                            color = &lt;span style="color:#0000ff"&gt;If&lt;/span&gt;(parameters.Count() &amp;lt; 2, &lt;span style="color:#2b91af"&gt;Colors&lt;/span&gt;.LightYellow, &lt;span style="color:#2b91af"&gt;ColorUtility&lt;/span&gt;.GetColorFromName(parameters(2)))&lt;/li&gt; &lt;li&gt;                        &lt;span style="color:#0000ff"&gt;Case Else&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                            color = &lt;span style="color:#0000ff"&gt;If&lt;/span&gt;(parameters.Count() &amp;lt; 3, &lt;span style="color:#2b91af"&gt;Colors&lt;/span&gt;.LightCoral, &lt;span style="color:#2b91af"&gt;ColorUtility&lt;/span&gt;.GetColorFromName(parameters(3)))&lt;/li&gt; &lt;li&gt;                    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Select&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                    &lt;span style="color:#0000ff"&gt;If&lt;/span&gt; color.HasValue &lt;span style="color:#0000ff"&gt;Then&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                        &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; brush = &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;SolidColorBrush&lt;/span&gt;(color.Value)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                        &lt;span style="color:#0000ff"&gt;Return&lt;/span&gt; brush&lt;/li&gt; &lt;li&gt;                    &lt;span style="color:#0000ff"&gt;Else&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                        &lt;span style="color:#0000ff"&gt;Return&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Nothing&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;If&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="color:#0000ff"&gt;Else&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="color:#0000ff"&gt;Return&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Nothing&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;If&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;Else&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="color:#0000ff"&gt;Return&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Nothing&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;If&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="color:#0000ff"&gt;Else&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="color:#0000ff"&gt;Return&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Nothing&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;If&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt; ConvertBack(value &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Object&lt;/span&gt;,&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                                targetType &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; System.&lt;span style="color:#2b91af"&gt;Type&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;                                parameter &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Object&lt;/span&gt;,&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                                culture &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; System.Globalization.&lt;span style="color:#2b91af"&gt;CultureInfo&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Object&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Implements&lt;/span&gt; System.Windows.Data.&lt;span style="color:#2b91af"&gt;IValueConverter&lt;/span&gt;.ConvertBack&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;Throw&lt;/span&gt; &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#00008b"&gt;NotImplementedException&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Class&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Il converter è del tutto analogo al precedente con la differenza che utilizza i parametri per ricevere la stringa identificante l’id del joint da analizzare e la terna di colori da utilizzare per gli stati Tracked, Inferred e NotTracked.&lt;/p&gt;  &lt;p&gt;Ultima cosa prima di chiudere il post riguarda la possibilità di affinare la precisione dello skeletal tracking.&lt;/p&gt;  &lt;p&gt;Se provate ad utilizzare lo skeletal tracking, infatti, vi renderete conto che anche rimanendo immobili, i valori di posizione oscillano.&lt;/p&gt;  &lt;p&gt;E’ possibile intervenire su questo fenomeno di jittering impostando alcune proprietà del motore di skeletal tracking. La classe SkeletonEngine esposta dalla classe Runtime tramite la proprietà omonima, consente di impostare i parametri di Smooth Transform. &lt;/p&gt;  &lt;p&gt;Questi parametri permettono il controllo della precisione del rilevamento dello scheletro da parte del KInect e la loro disamina accurata sarà oggetto di un altro post.&lt;/p&gt;  &lt;p&gt;Nel nostro caso potremmo modificare il costruttore nel seguente modo:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:2f7a7641-c28c-4b9a-8d99-c5df30a2b308" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt; &lt;span style="color:#0000ff"&gt;New&lt;/span&gt;()&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;If&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Not&lt;/span&gt; &lt;span style="color:#2b91af"&gt;DesignerProperties&lt;/span&gt;.GetIsInDesignMode(&lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;DependencyObject&lt;/span&gt;()) &lt;span style="color:#0000ff"&gt;Then&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;Try&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            Nui = &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Runtime&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;AddHandler&lt;/span&gt; Nui.DepthFrameReady, &lt;span style="color:#0000ff"&gt;AddressOf&lt;/span&gt; DepthFrameReadyHandler&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="color:#0000ff"&gt;AddHandler&lt;/span&gt; Nui.SkeletonFrameReady, &lt;span style="color:#0000ff"&gt;AddressOf&lt;/span&gt; SkeletonFrameHandler&lt;/li&gt; &lt;li&gt;            Nui.Initialize(&lt;span style="color:#2b91af"&gt;RuntimeOptions&lt;/span&gt;.UseDepthAndPlayerIndex &lt;span style="color:#0000ff"&gt;Or&lt;/span&gt; &lt;span style="color:#2b91af"&gt;RuntimeOptions&lt;/span&gt;.UseSkeletalTracking)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;            Nui.SkeletonEngine.TransformSmooth = &lt;span style="color:#0000ff"&gt;True&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; parameters = &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;TransformSmoothParameters&lt;/span&gt; &lt;span style="color:#0000ff"&gt;With&lt;/span&gt; {.Smoothing = 0.75F,&lt;/li&gt; &lt;li&gt;                                                                .Correction = 0.0F,&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                                                                .Prediction = 0.0F,&lt;/li&gt; &lt;li&gt;                                                                .JitterRadius = 0.05F,&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                                                                .MaxDeviationRadius = 0.04F}&lt;/li&gt; &lt;li&gt;            Nui.SkeletonEngine.SmoothParameters = parameters&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;            Nui.DepthStream.Open(&lt;span style="color:#2b91af"&gt;ImageStreamType&lt;/span&gt;.Depth, 2, &lt;span style="color:#2b91af"&gt;ImageResolution&lt;/span&gt;.Resolution320x240, &lt;span style="color:#2b91af"&gt;ImageType&lt;/span&gt;.DepthAndPlayerIndex)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;Catch&lt;/span&gt; ex &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Exception&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Try&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;If&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;A seguito dell’initialize attiviamo la gestione dello smoothing (TransformSmooth=true), istanziamo un oggetto di classe TransformSmoothParameters e impostiamo la proprietà SmoothParameters dello SkeletonEngine.&lt;/p&gt;  &lt;p&gt;La classe TransformSmoothParameters è poco documentata e per questo motivo cercheremo di approfondire il suo utilizzo in un ulteriore post.&lt;/p&gt;    &lt;p&gt;&lt;iframe style="padding-bottom: 0px; background-color: #fcfcfc; padding-left: 0px; width: 98px; padding-right: 0px; height: 115px; padding-top: 0px" title="Preview" marginheight="0" src="https://skydrive.live.com/embedicon.aspx/Public/Allegati%20Blog/Kinect/Kinect-VitruvianMan.zip?cid=4aab693689223ee9&amp;amp;sc=documents" frameborder="0" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;   &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:40645f06-855c-4167-8925-0aca212f2685" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/kinect+sdk" rel="tag"&gt;kinect sdk&lt;/a&gt;,&lt;a href="http://technorati.com/tags/kinect" rel="tag"&gt;kinect&lt;/a&gt;,&lt;a href="http://technorati.com/tags/uomo+vitruviano" rel="tag"&gt;uomo vitruviano&lt;/a&gt;,&lt;a href="http://technorati.com/tags/skeletal+tracking" rel="tag"&gt;skeletal tracking&lt;/a&gt;,&lt;a href="http://technorati.com/tags/skeletondata" rel="tag"&gt;skeletondata&lt;/a&gt;,&lt;a href="http://technorati.com/tags/scheletro" rel="tag"&gt;scheletro&lt;/a&gt;,&lt;a href="http://technorati.com/tags/runtime+class" rel="tag"&gt;runtime class&lt;/a&gt;,&lt;a href="http://technorati.com/tags/skeletal" rel="tag"&gt;skeletal&lt;/a&gt;,&lt;a href="http://technorati.com/tags/nui" rel="tag"&gt;nui&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-6795895828292773399?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/6795895828292773399/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=6795895828292773399&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/6795895828292773399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/6795895828292773399'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/08/alla-scoperta-del-kinect-gli-scheletri.html' title='Alla scoperta del Kinect : gli scheletri e l’uomo vitruviano'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/-H9lvMt2iMg0/TlZwKuYMRpI/AAAAAAAAA6k/LWwWzPRrRV0/s72-c/image_thumb1.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-368953629380436542</id><published>2011-08-22T08:00:00.000+02:00</published><updated>2011-08-22T08:00:03.512+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Kinect'/><title type='text'>Alla scoperta del Kinect: video e depth insieme per eliminare lo sfondo</title><content type='html'>&lt;p&gt;Nel precedenti post (&lt;a href="http://codetailor.blogspot.com/2011/08/alla-scoperta-del-kinect-la-classe.html" target="_blank"&gt;qui&lt;/a&gt; e &lt;a href="http://codetailor.blogspot.com/2011/08/alla-scoperta-del-kinect-questione-di.html" target="_blank"&gt;qui&lt;/a&gt;) abbiamo visto singolarmente come utilizzare lo stream video e i dati di “distanza” che provengono dal nostro Kinect.&lt;/p&gt;  &lt;p&gt;In questo post cercheremo di utilizzare contemporaneamente i due stream in modo da utilizzare le informazioni di distanza per modificare l’immagine video.&lt;/p&gt;  &lt;p&gt;In particolare vedremo come (in maniera molto rozza e, sicuramente, ottimizzabile) riuscire a modificare l’immagine proveniente dallo stream video per lasciare visibili i player uniformando lo sfondo con un colore a nostra scelta.&lt;/p&gt;  &lt;p&gt;Quello che faremo è prendere le singole immagini video e depth fornite dagli eventi del Runtime del Kinect, scandire l’immagine di depth e, ogni volta che si ha un player index pari a 0, colorare il corrispondente pixel dell’immagine video con il colore da noi scelto.&lt;/p&gt;  &lt;p&gt;Uno dei problemi che si pongono immediatamente è che la risoluzione dell’immagine video sia diversa dalla risoluzione dell’immagine depth.&lt;/p&gt;  &lt;p&gt;Ad esempio nel seguente pezzo di codice l’immagine video è 640x480 mentre l’immagine depth è 320x240.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:c2ff1721-c5c7-4db3-8753-2d0b39f3d3f8" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Try&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    Nui = &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Runtime&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;AddHandler&lt;/span&gt; Nui.VideoFrameReady, &lt;span style="color:#0000ff"&gt;AddressOf&lt;/span&gt; VideoFrameHandler&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;AddHandler&lt;/span&gt; Nui.DepthFrameReady, &lt;span style="color:#0000ff"&gt;AddressOf&lt;/span&gt; DepthFrameReadyHandler&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    Nui.Initialize(&lt;span style="color:#2b91af"&gt;RuntimeOptions&lt;/span&gt;.UseDepthAndPlayerIndex &lt;span style="color:#0000ff"&gt;Or&lt;/span&gt; &lt;span style="color:#2b91af"&gt;RuntimeOptions&lt;/span&gt;.UseColor)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    Nui.VideoStream.Open(&lt;span style="color:#2b91af"&gt;ImageStreamType&lt;/span&gt;.Video, 2, &lt;span style="color:#2b91af"&gt;ImageResolution&lt;/span&gt;.Resolution640x480, &lt;span style="color:#2b91af"&gt;ImageType&lt;/span&gt;.Color)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    Nui.DepthStream.Open(&lt;span style="color:#2b91af"&gt;ImageStreamType&lt;/span&gt;.Depth, 2, &lt;span style="color:#2b91af"&gt;ImageResolution&lt;/span&gt;.Resolution320x240, &lt;span style="color:#2b91af"&gt;ImageType&lt;/span&gt;.DepthAndPlayerIndex)&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;Catch&lt;/span&gt; ex &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Exception&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Try&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;In alcuni casi non si può avere uguaglianza di risoluzione anche forzando i parametri del metodo Open degli stream.&lt;/p&gt;  &lt;p&gt;Ad esempio nel mio pc non è ammesso avere 320x240 per entrambe le sorgenti (ottengo una eccezione in fase di open).&lt;/p&gt;  &lt;p&gt;Nel caso mostrato nel codice precedente dobbiamo trovare qualche modo per correlare un pixel dell’immagine depth con uno o più pixel dell’immagine video.&lt;/p&gt;  &lt;p&gt;L’SDK del Kinect ci mette a disposizione il metodo GetColorPixelCoordinatesFromDepthPixel della classe NuiCamera che consente di ottenere le coordinate x,y del punto video a partire dalle coordinate x,y del punto depth.&lt;/p&gt;  &lt;p&gt;Nel nostro caso non utilizzeremo questa funzione perché andremo a calcolarci da soli i punti corrispondenti sull’immagine video.&lt;/p&gt;  &lt;p&gt;In maniera molto grossolana (ci manterremo sul semplice essendo questo post didattico), ogni punto dell’immagine depth corrisponde a 4 punti dell’immagine video (visto che la risoluzione della video è 4 volte quella della depth).&lt;/p&gt;  &lt;p&gt;Per questo dovremo ricavare le coordinate del punto in alto a sinistra di questo quadrato e prendere i 3 punti adiacenti.&lt;/p&gt;  &lt;p&gt;Se indichiamo con x&lt;sub&gt;d&lt;/sub&gt; e y&lt;sub&gt;d&lt;/sub&gt; le coordinate di un punto dell’immagine depth, e con x&lt;sub&gt;v&lt;/sub&gt; e y&lt;sub&gt;v&lt;/sub&gt; le coordinate del punto in alto a sinistra dell’immagine video, potremmo considerare:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-oBBG6qeo_PU/TkkIivmZT3I/AAAAAAAAA6E/HKyOYBmHVDc/s1600-h/clip_image002%25255B6%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://lh4.ggpht.com/-owF4w22M7rU/TkkIjN-acYI/AAAAAAAAA6I/mc4MQglO2cU/clip_image002_thumb%25255B1%25255D.png?imgmax=800" width="77" height="35" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;e, di conseguenza dovremmo elaborare i 4 punti:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-6Ug1M6s2yCQ/TkkIjtESp_I/AAAAAAAAA6M/Wp7UkWPLqiU/s1600-h/clip_image002%25255B4%25255D%25255B3%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image002[4]" border="0" alt="clip_image002[4]" src="http://lh3.ggpht.com/-MJuafPdX9X8/TkkIkDaJRVI/AAAAAAAAA6Q/KBrw4WRY4i8/clip_image002%25255B4%25255D_thumb%25255B1%25255D.png?imgmax=800" width="298" height="20" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;L’algoritmo che utilizzeremo sarà quindi:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;per ogni x, y dell’immagine depth (con x compreso tra 0 e 319 e y compreso tra 0 e 239) &lt;/li&gt;    &lt;li&gt;recupereremo il player index come visto nel precedente &lt;a href="http://codetailor.blogspot.com/2011/08/alla-scoperta-del-kinect-questione-di.html" target="_blank"&gt;post&lt;/a&gt;; &lt;/li&gt;    &lt;li&gt;se il player index è zero, andremo ad impostare i bytes dell’immagine video corrispondenti ai 4 punti di cui sopra con i valori corrispondenti al colore di sfondo desiderato. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Il codice che implementa ciò è il seguente:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:33c74f66-ae5c-418c-9682-c730b8d0ea32" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Private&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt; ElaborateImage(videoFrame &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ImageFrame&lt;/span&gt;, depthFrame &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ImageFrame&lt;/span&gt;)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; depthIndex = 0&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; videoIndex = 0&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;For&lt;/span&gt; x = 0 &lt;span style="color:#0000ff"&gt;To&lt;/span&gt; depthFrame.Image.Width - 1&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;For&lt;/span&gt; y = 0 &lt;span style="color:#0000ff"&gt;To&lt;/span&gt; depthFrame.Image.Height - 1&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            depthIndex = (y * depthFrame.Image.Width + x) * depthFrame.Image.BytesPerPixel&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; playerIndex = depthFrame.Image.Bits(depthIndex) &lt;span style="color:#0000ff"&gt;And&lt;/span&gt; 7&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="color:#0000ff"&gt;If&lt;/span&gt; playerIndex = 0 &lt;span style="color:#0000ff"&gt;Then&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; x1 = 2 * x&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; x2 = 2 * x + 1&lt;/li&gt; &lt;li&gt;                &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; y1 = 2 * y&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; y2 = 2 * y + 1&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                SetPixelValue(videoFrame, x1, y1, &lt;span style="color:#2b91af"&gt;Colors&lt;/span&gt;.Red)&lt;/li&gt; &lt;li&gt;                SetPixelValue(videoFrame, x1, y2, &lt;span style="color:#2b91af"&gt;Colors&lt;/span&gt;.Red)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                SetPixelValue(videoFrame, x2, y1, &lt;span style="color:#2b91af"&gt;Colors&lt;/span&gt;.Red)&lt;/li&gt; &lt;li&gt;                SetPixelValue(videoFrame, x2, y2, &lt;span style="color:#2b91af"&gt;Colors&lt;/span&gt;.Red)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;If&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;Next&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Next&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Me&lt;/span&gt;.ElaboratedImage.Source = videoFrame.ToBitmapSource()&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;dove il metodo SetPixelValue altro non fa che impostare i 4 bytes del pixel video con le componenti del colore scelto:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:a0636ed4-291f-4142-a87a-305e823970c0" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Private&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt; SetPixelValue(imageFrame &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ImageFrame&lt;/span&gt;, x &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Integer&lt;/span&gt;, y &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Integer&lt;/span&gt;, color &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Color&lt;/span&gt;)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; index = (y * imageFrame.Image.Width + x) * imageFrame.Image.BytesPerPixel&lt;/li&gt; &lt;li&gt;    imageFrame.Image.Bits(index) = color.B&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    imageFrame.Image.Bits(index + 1) = color.G&lt;/li&gt; &lt;li&gt;    imageFrame.Image.Bits(index + 2) = color.R&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    imageFrame.Image.Bits(index + 3) = color.A &lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Il risultato che otteniamo è un’immagine rossa che vedrà apparire le figure dei player nel momento in cui il KInect le “aggancia”.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-eNqlsEiYLn0/TkkInir8jTI/AAAAAAAAA6U/K0e9ItQx6-E/s1600-h/image%25255B2%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/-E4D4BUTJJUI/TkkIo0CpUUI/AAAAAAAAA6Y/zZri4lgMxsw/image_thumb.png?imgmax=800" width="452" height="288" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Il bordo che si forma attorno alla figura è dovuto all’algoritmo di recupero dei punti video molto semplicistico e al fatto che le immagini che andiamo a prendere potrebbero non essere sincronizzate tra loro. Nel nostro semplice esempio non andiamo assolutamente a controllare il timestamp delle due immagini e, poichè i due stream potrebbero avere frame rate differente, le immagini potrebbero non coincidere e creare la fastidiosa scia.&lt;/p&gt;  &lt;p&gt;Inoltre teniamo presente che i sensori video e di profondità che monta il Kinect sono posizionati in due differenti punti dell’”aggeggio” e, quindi, soffrono &lt;a href="http://it.wikipedia.org/wiki/Errore_di_parallasse" target="_blank"&gt;dell’errore di parallasse&lt;/a&gt; che fa si che le due immagini non possono mai essere sovrapponibili senza errore.&lt;/p&gt;   &lt;iframe style="padding-bottom: 0px; background-color: #fcfcfc; padding-left: 0px; width: 98px; padding-right: 0px; height: 115px; padding-top: 0px" title="Preview" marginheight="0" src="https://skydrive.live.com/embedicon.aspx/Public/Allegati%20Blog/Kinect/Kinect-OnlyPlayer.zip?cid=4aab693689223ee9&amp;amp;sc=documents" frameborder="0" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;  &lt;br /&gt;  &lt;br /&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:cfd2ac66-4edc-45ff-a848-baa1a1fb3889" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/kinect+sdk" rel="tag"&gt;kinect sdk&lt;/a&gt;,&lt;a href="http://technorati.com/tags/kinect" rel="tag"&gt;kinect&lt;/a&gt;,&lt;a href="http://technorati.com/tags/depth+stream" rel="tag"&gt;depth stream&lt;/a&gt;,&lt;a href="http://technorati.com/tags/video+stream" rel="tag"&gt;video stream&lt;/a&gt;,&lt;a href="http://technorati.com/tags/vb.net" rel="tag"&gt;vb.net&lt;/a&gt;,&lt;a href="http://technorati.com/tags/elaborazione+immagini" rel="tag"&gt;elaborazione immagini&lt;/a&gt;,&lt;a href="http://technorati.com/tags/runtime+class" rel="tag"&gt;runtime class&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-368953629380436542?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/368953629380436542/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=368953629380436542&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/368953629380436542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/368953629380436542'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/08/alla-scoperta-del-kinect-video-e-depth.html' title='Alla scoperta del Kinect: video e depth insieme per eliminare lo sfondo'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/-owF4w22M7rU/TkkIjN-acYI/AAAAAAAAA6I/mc4MQglO2cU/s72-c/clip_image002_thumb%25255B1%25255D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-878677710840394592</id><published>2011-08-08T08:00:00.000+02:00</published><updated>2011-08-08T08:00:07.883+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Kinect'/><title type='text'>Alla scoperta del Kinect : questione di profondità</title><content type='html'>&lt;p&gt;Nei due precedenti post (&lt;a href="http://codetailor.blogspot.com/2011/08/alla-scoperta-del-kinect-la-classe.html" target="_blank"&gt;link&lt;/a&gt; e &lt;a href="http://codetailor.blogspot.com/2011/08/alla-scoperta-del-kinect-calcoliamo.html" target="_blank"&gt;link&lt;/a&gt;) abbiamo fatto conoscenza con “l’aggeggio” kinect e visto come sia possibile, in maniera molto semplice, gestire lo stream video proveniente dalla camera.&lt;/p&gt;  &lt;p&gt;In questo post diamo un’occhiata alla capacità che ha il Kinect di fornire frame in cui l’immagine non è la rappresentazione fedele della realtà che ci circonda ma la rappresentazione bidimensionale della distanza degli oggetti dai sensori di profondità.&lt;/p&gt;  &lt;p&gt;L’aggeggio, infatti, dispone di un sensore di profondità che è in grado di fornirci la distanza dei punti inquadrati da se stesso e, in più, è in grado di dirci a quale “player” fa riferimento ogni singolo pixel.&lt;/p&gt;  &lt;p&gt;Ma andiamo con ordine.&lt;/p&gt;  &lt;p&gt;Per abilitare la ricezione del depth stream è necessario:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Istanziare la classe Runtime; &lt;/li&gt;    &lt;li&gt;Agganciare il gestore dell’evento DepthFrameReady; &lt;/li&gt;    &lt;li&gt;Inizializzare l’istanza della Runtime scegliendo una delle opzioni che abilitano il sensore di profondità; &lt;/li&gt;    &lt;li&gt;Aprire lo stream dei dati relativi alla profondità. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;A livello di codice (abbiamo già visto nei precedenti post) significa:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:25dccdea-070d-4262-a5ea-428aee855fa6" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px;"&gt; &lt;li&gt;Nui = &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Runtime&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;AddHandler&lt;/span&gt; Nui.DepthFrameReady, &lt;span style="color:#0000ff"&gt;AddressOf&lt;/span&gt; DepthFrameHandler&lt;/li&gt; &lt;li&gt;Nui.Initialize(&lt;span style="color:#2b91af"&gt;RuntimeOptions&lt;/span&gt;.UseDepthAndPlayerIndex)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;Nui.DepthStream.Open(&lt;span style="color:#2b91af"&gt;ImageStreamType&lt;/span&gt;.Depth, 2, &lt;span style="color:#2b91af"&gt;ImageResolution&lt;/span&gt;.Resolution320x240, &lt;span style="color:#2b91af"&gt;ImageType&lt;/span&gt;.DepthAndPlayerIndex)&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;dove Nui è una variabile di tipo Runtime.&lt;/p&gt;  &lt;p&gt;Per quanto riguarda le RuntimeOptions, abbiamo la possibilità di scegliere di ricevere i soli dati di profondità (RuntimeOptions.UseDepth) o i dati di profondità e il numero del player (RuntimeOptions.UseDepthAndPlayerIndex).&lt;/p&gt;  &lt;p&gt;La differenza tra le due opzioni si manifesta nella differenza della struttura dei dati che ci arrivano all’interno dell’evento DepthFrameReady.&lt;/p&gt;  &lt;p&gt;In questo evento, come già visto nei precedenti post, riceviamo l’array dei bytes costuenti l’immagine recuperata dai sensori del Kinect.&lt;/p&gt;  &lt;p&gt;L’array è contenuto nella proprietà Image (di tipo PlanarImage) dell’istanza di ImageFrame contenuta all’interno dell’argomento dell’evento DepthFrameReady:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-3LmQsr4f804/Tj7ftiNEUwI/AAAAAAAAA5M/C55YrAKhBRY/s1600-h/image%25255B2%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-1Mq6CGweYIQ/Tj7fuSJIiCI/AAAAAAAAA5Q/8IfAPoszQjc/image_thumb.png?imgmax=800" width="500" height="182" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Per le immagini fornite dal sensore di profondità, ogni pixel è descritto da 2 Bytes (totale 16 bits), la struttura dei quali cambia in base al fatto che stiamo chiedendo il player index o meno.&lt;/p&gt;  &lt;p&gt;In entrambi i casi, l’array contiene la distanza (in mm) per ogni punto dell’immagine, e questa varia da un minimo di 800/850 mm ad un massimo di circa 4000 mm. Se “l’aggeggio” non riesce a recuperare la distanza (ad esempio per una fonte di luce forte alle spalle del soggetto inquadrato) la profondità restituita sarà 0.&lt;/p&gt;  &lt;p&gt;La dimensione dell’array è, quindi, pari al prodotto delle dimensioni dell’immagine (ad esempio 320x240) per 2 ed è strutturato per righe a partire dall’angolo in alto a sinistra.&lt;/p&gt;  &lt;p&gt;Se stiamo utilizzando RuntimeOptions.UseDepth, i due bytes contengono esattamente la distanza (espressa in mm) dal sensore) con il primo byte che contiene la parte meno significativa, mentre il secondo la più significativa:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-HcWxOztpOo0/Tj7fu1ZSSyI/AAAAAAAAA5U/FCDxZo5DvzE/s1600-h/Bytes%252520senza%252520player%252520index%25255B2%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Bytes senza player index" border="0" alt="Bytes senza player index" src="http://lh3.ggpht.com/-60LP8fv6VC0/Tj7fvY4neJI/AAAAAAAAA5Y/VKhhOhTq3rY/Bytes%252520senza%252520player%252520index_thumb.png?imgmax=800" width="500" height="102" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In questo caso, dati i due bytes dell’array, la distanza è calcolabile nel seguente modo:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:7772c697-83ef-43af-9663-259a9318776a" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px;"&gt; &lt;li&gt;depth = &lt;span style="color:#0000ff"&gt;CLng&lt;/span&gt;(frame.Image.Bits(arrayIndex)) + (&lt;span style="color:#0000ff"&gt;CLng&lt;/span&gt;(frame.Image.Bits(arrayIndex + 1)) &amp;lt;&amp;lt; 8)&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;La conversione a CLng è opportuna in quanto l’operazione di shift (&amp;lt;&amp;lt;) farebbe perdere i bit più significativi.&lt;/p&gt;  &lt;p&gt;Se stiamo utilizzando RuntimeOptions.UseDepthAndPlayerIndex, invece, i primi tre bit del byte meno significativo (il primo dei due) sono utilizzati per contenere l’indice del player a cui fa riferimento il dato di profondità (se non c’è un player o Kinect non ha agganciato un player abbiamo il valore 0):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-ZJPUVEVrgZA/Tj7fwAh7jVI/AAAAAAAAA5c/HETqDNUFnQ4/s1600-h/Bytes%252520con%252520player%252520index%25255B2%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Bytes con player index" border="0" alt="Bytes con player index" src="http://lh5.ggpht.com/-yzgdjTA1AK8/Tj7fwhWgh0I/AAAAAAAAA5g/ooy2fPro1Xk/Bytes%252520con%252520player%252520index_thumb.png?imgmax=800" width="500" height="134" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In questo caso la distanza si calcola nel seguente modo:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:c015947b-f7a2-4082-b912-c364a72c1b0f" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px;"&gt; &lt;li&gt;depth = (&lt;span style="color:#0000ff"&gt;CLng&lt;/span&gt;(frame.Image.Bits(arrayIndex)) &amp;gt;&amp;gt; 3) + (&lt;span style="color:#0000ff"&gt;CLng&lt;/span&gt;(frame.Image.Bits(arrayIndex + 1)) &amp;lt;&amp;lt; 5)&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Per fare un esempio concreto, supponiamo di voler calcolare la distanza e il player index del punto (160,120) dell’immagine.&lt;/p&gt;  &lt;p&gt;In questo caso i due bytes interessati sono il 160*320+120=51320 e 51321:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-h3ikNIsiEqA/Tj7fxcPoSMI/AAAAAAAAA5k/eVdn6USow5I/s1600-h/Esempio%252520con%252520player%252520index%25255B2%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Esempio con player index" border="0" alt="Esempio con player index" src="http://lh6.ggpht.com/-UyqvZxfR6Po/Tj7fyJmj7GI/AAAAAAAAA5o/gaQDmt_TSFw/Esempio%252520con%252520player%252520index_thumb.png?imgmax=800" width="500" height="156" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Nell’esempio abbiamo come player index il valore 2 (010 binario) mentre la profondità è 2009 (0011111011001 in binario).&lt;/p&gt;  &lt;p&gt;Nella solution che allego al post è presente un semplice programma che ci consente di selezionare, tramite il mouse, un punto sull’immagine (identificato da un pallino giallo) e di avere in tempo reale le informazioni di player index e profondità:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-f8n3jkxHOPc/Tj7fzD3Gt2I/AAAAAAAAA5s/g6p6NBkpx6M/s1600-h/SNAGHTML1c545cf%25255B3%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="SNAGHTML1c545cf" border="0" alt="SNAGHTML1c545cf" src="http://lh3.ggpht.com/-CYUw5ynjbME/Tj7f0POA9OI/AAAAAAAAA5w/ZTnu_d38bMA/SNAGHTML1c545cf_thumb.png?imgmax=800" width="500" height="188" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;iframe style="padding-bottom: 0px; background-color: #fcfcfc; padding-left: 0px; width: 98px; padding-right: 0px; height: 115px; padding-top: 0px" title="Preview" marginheight="0" src="https://skydrive.live.com/embedicon.aspx/Public/Allegati%20Blog/Kinect/Kinect-Depth.zip?cid=4aab693689223ee9&amp;amp;sc=documents" frameborder="0" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;  &lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:b0bc6eb7-983d-425f-a2b0-92f44f80a9c0" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/kinect" rel="tag"&gt;kinect&lt;/a&gt;,&lt;a href="http://technorati.com/tags/kinect+sdk" rel="tag"&gt;kinect sdk&lt;/a&gt;,&lt;a href="http://technorati.com/tags/depth" rel="tag"&gt;depth&lt;/a&gt;,&lt;a href="http://technorati.com/tags/player+index" rel="tag"&gt;player index&lt;/a&gt;,&lt;a href="http://technorati.com/tags/runtime" rel="tag"&gt;runtime&lt;/a&gt;,&lt;a href="http://technorati.com/tags/vb.net" rel="tag"&gt;vb.net&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-878677710840394592?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/878677710840394592/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=878677710840394592&amp;isPopup=true' title='5 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/878677710840394592'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/878677710840394592'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/08/alla-scoperta-del-kinect-questione-di.html' title='Alla scoperta del Kinect : questione di profondità'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/-1Mq6CGweYIQ/Tj7fuSJIiCI/AAAAAAAAA5Q/8IfAPoszQjc/s72-c/image_thumb.png?imgmax=800' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-6638512357950513258</id><published>2011-08-04T08:00:00.000+02:00</published><updated>2011-08-04T08:00:13.106+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Kinect'/><title type='text'>Alla scoperta del Kinect: calcoliamo l’FPS degli stream video.</title><content type='html'>&lt;p&gt;Abbiamo visto nel precedente &lt;a href="http://codetailor.blogspot.com/2011/08/alla-scoperta-del-kinect-la-classe.html" target="_blank"&gt;post&lt;/a&gt; della serie come poter utilizzare il nostro Kinect per catturare gli stream Video e Depth e visualizzarli.&lt;/p&gt;  &lt;p&gt;Il questo post vogliamo vedere due possibili modi per calcolare l’effettivo FPS di tali stream, ovvero quanti frame nell’unità di tempo ci arrivano.&lt;/p&gt;  &lt;p&gt;Questa funzione non esiste out-of-the-box tra le funzionalità esposte dall’SDK, ma è molto semplice calcolare tale numero basandoci sulle istanze della classe ImageFrame che ci arrivano nei gestori degli eventi DepthFrameReady e VideoFrameReady.&lt;/p&gt;  &lt;p&gt;Per chi avesse perso il precedente post, la classe Runtime (fulcro dell’SDK di Kinect) solleva uno dei precedenti eventi ogni volta che è disponibile una immagine video o depth.&lt;/p&gt;  &lt;p&gt;Possiamo gestire il flusso delle immagini tramite dei gestori di evento:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:4ea5368d-758b-445e-a286-5e2842d95f1b" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Private&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt; DepthFrameHandler(sender &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Object&lt;/span&gt;, e &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ImageFrameReadyEventArgs&lt;/span&gt;)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    .&lt;/li&gt; &lt;li&gt;    .&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    .&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Private&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt; VideoFrameHandler(sender &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Object&lt;/span&gt;, e &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ImageFrameReadyEventArgs&lt;/span&gt;)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    .&lt;/li&gt; &lt;li&gt;    .&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    .&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;L’argomento degli eventi ci fornisce un’istanza della classe ImageFrame che contiene informazioni molto importanti che ci possono permettere di calcolare il Frame rate del filmato.&lt;/p&gt;  &lt;p&gt;La classe ImageFrameReadyEventArgs ha la seguente struttura:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-0PHfnTyEevQ/TjZ5RufOTnI/AAAAAAAAA48/a0-pBDpt0cg/s1600-h/image2.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/-kOcu-dxmWQo/TjZ5TOGC89I/AAAAAAAAA5A/NLYaMltP70k/image_thumb.png?imgmax=800" width="485" height="288" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Nel codice di seguito useremo l’attributo Timestamp della classe ImageFrame per il calcolo dell’Fps.&lt;/p&gt;  &lt;p&gt;Cominciamo definendo l’interfaccia che deve implementare quello che noi definiremo “Calcolatore di FPS”:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:ee1a0b3d-2ef3-499d-85e2-3386936ed884" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Imports&lt;/span&gt; Microsoft.Research.Kinect.Nui&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;Imports&lt;/span&gt; System.Diagnostics.Contracts&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;ContractClass&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color:#2b91af"&gt;ContractIFpsCalculator&lt;/span&gt;))&amp;gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Interface&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IFpsCalculator&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;ReadOnly&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Property&lt;/span&gt; CurrentFps &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Integer&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt; SetCurrentImageFrame(image &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ImageFrame&lt;/span&gt;)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Interface&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;ContractClassFor&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color:#2b91af"&gt;IFpsCalculator&lt;/span&gt;))&amp;gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ContractIFpsCalculator&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Implements&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IFpsCalculator&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;ReadOnly&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Property&lt;/span&gt; CurrentFps() &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Integer&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Implements&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IFpsCalculator&lt;/span&gt;.CurrentFps&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;Get&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="color:#0000ff"&gt;Throw&lt;/span&gt; &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#00008b"&gt;NotImplementedException&lt;/span&gt;()&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Get&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Property&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt; SetCurrentImageFrame(&lt;span style="color:#0000ff"&gt;ByVal&lt;/span&gt; image &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ImageFrame&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;Implements&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IFpsCalculator&lt;/span&gt;.SetCurrentImageFrame&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#2b91af"&gt;Contract&lt;/span&gt;.Requires(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ArgumentNullException&lt;/span&gt;)(image &lt;span style="color:#0000ff"&gt;IsNot&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Nothing&lt;/span&gt;, &lt;span style="color:#a31515"&gt;&amp;quot;Image must be not null&amp;quot;&lt;/span&gt;)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;Throw&lt;/span&gt; &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#00008b"&gt;NotImplementedException&lt;/span&gt;()&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Class&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;L’interfaccia IFpsCalculator espone una proprietà CurrentFps che restituisce, istante per istante, l’FPS dello streaming e un metodo SetCurrentImageFrame che utilizziamo per comunicare al calcolatore quale è l’ImageFrame che stiamo elaborando.&lt;/p&gt;  &lt;p&gt;Su questa interfaccia ho definito dei contratti in modo da garantirmi che il metodo SetCurrentImageFrame non possa essere mai chiamato (pena la sollevazione di un eccezione ArgumentNullException) con un parametro Nothing.&lt;/p&gt;  &lt;p&gt;La prima implementazione di FpsCalculator si basa sul calcolo “istantaneo” del frame rate: di fatto, dato l’intervallo di tempo (in millisecondi) tra le ultime due immagini, viene calcolato il frame rate con la seguente formula:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-klN9flkHMSc/TjZ5T1z5kEI/AAAAAAAAA5E/oPebrnaiPYA/s1600-h/clip_image00242.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image002[4]" border="0" alt="clip_image002[4]" src="http://lh3.ggpht.com/-ujjqBhULFOU/TjZ5UnvGSsI/AAAAAAAAA5I/kDq4EUehfsE/clip_image0024_thumb.png?imgmax=800" width="123" height="39" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;dove:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;FPS&lt;sub&gt;n&lt;/sub&gt;&lt;/strong&gt; è il framerate (calcolato) tra l’n-esimo e l’(n-1)-esimo frame; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;ts&lt;sub&gt;n&lt;/sub&gt;&lt;/strong&gt; è il timestamp (in millisecondi) dell’n-esimo frame; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;ts&lt;sub&gt;n-1&lt;/sub&gt;&lt;/strong&gt; è il timestamp dell’(n-1)-esimo frame. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Evidentemente il framerate calcolato è un numero decimale che, per convenienza, approssimeremo ad un intero.&lt;/p&gt;  &lt;p&gt;La classe che implementa questo algoritmo è la seguente:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:fd2143fc-33f3-44eb-9f72-0822c2baf0a7" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;FpsCalculator&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Implements&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IFpsCalculator&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Private&lt;/span&gt; _LastTimestampVideo &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Long&lt;/span&gt;? = &lt;span style="color:#0000ff"&gt;Nothing&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Private&lt;/span&gt; _SecondLastTimestampVideo &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Long&lt;/span&gt;? = &lt;span style="color:#0000ff"&gt;Nothing&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;ReadOnly&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Property&lt;/span&gt; Fps &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Integer&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Implements&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IFpsCalculator&lt;/span&gt;.CurrentFps&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;Get&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;Return&lt;/span&gt; CalculateFps()&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Get&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Property&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Private&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt; CalculateFps() &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Integer&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; fps &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Integer&lt;/span&gt; = 0&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;If&lt;/span&gt; _LastTimestampVideo.HasValue &lt;span style="color:#0000ff"&gt;And&lt;/span&gt; _SecondLastTimestampVideo.HasValue &lt;span style="color:#0000ff"&gt;Then&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; deltaMillisec = _LastTimestampVideo.Value - _SecondLastTimestampVideo.Value&lt;/li&gt; &lt;li&gt;            fps = &lt;span style="color:#0000ff"&gt;CInt&lt;/span&gt;(&lt;span style="color:#2b91af"&gt;Math&lt;/span&gt;.Floor(1000.0 / &lt;span style="color:#0000ff"&gt;CDbl&lt;/span&gt;(deltaMillisec)))&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;If&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;Return&lt;/span&gt; fps&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt; SetCurrentImageFrame(&lt;span style="color:#0000ff"&gt;ByVal&lt;/span&gt; image &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ImageFrame&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;Implements&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IFpsCalculator&lt;/span&gt;.SetCurrentImageFrame&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;Me&lt;/span&gt;._SecondLastTimestampVideo = &lt;span style="color:#0000ff"&gt;Me&lt;/span&gt;._LastTimestampVideo&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;Me&lt;/span&gt;._LastTimestampVideo = image.Timestamp&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Class&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Per il calcolo effettivo tramite la precedente formula, memorizziamo gli ultimi due timestamp e, solo quando li abbiamo tutti e due, procediamo al calcolo (CalculateFps()).&lt;/p&gt;  &lt;p&gt;Un altro modo per poter calcolare il framerate è quello di conteggiare quanti frame vengono elaborati nell’unità di tempo.&lt;/p&gt;  &lt;p&gt;Per fare questo è sufficiente memorizzare il timestamp iniziale e, ad ogni frame elabrorato (metodo Set CurrentImageFrame()) verificare che il timestamp di tale frame non si discosti per più di un secondo da quello di partenza. Se lo scostamento è minore di un secondo viene incrementato il contatore di frame nell’unità di tempo mentre se lo scostamento è maggiore di un secondo (1000 millisecondi) viene valorizzata la proprietà CurrentFps con il valore del contatore.&lt;/p&gt;  &lt;p&gt;La classe che implementa questo algoritmo è la seguente:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:ffc6a02c-f50f-482f-976a-665c3cb9b0f9" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Imports&lt;/span&gt; Microsoft.Research.Kinect.Nui&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;FpsCalculator2&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Implements&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IFpsCalculator&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Private&lt;/span&gt; _StartTimeStamp &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Long&lt;/span&gt;? = &lt;span style="color:#0000ff"&gt;Nothing&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Private&lt;/span&gt; _FrameCount &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Integer&lt;/span&gt; = 0&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Private&lt;/span&gt; _CurrentFps &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Integer&lt;/span&gt; = 0&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;ReadOnly&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Property&lt;/span&gt; CurrentFps &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Integer&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Implements&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IFpsCalculator&lt;/span&gt;.CurrentFps&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;Get&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="color:#0000ff"&gt;Return&lt;/span&gt; _CurrentFps&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Get&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Property&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt; SetCurrentImageFrame(&lt;span style="color:#0000ff"&gt;ByVal&lt;/span&gt; image &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ImageFrame&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;Implements&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IFpsCalculator&lt;/span&gt;.SetCurrentImageFrame&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;If&lt;/span&gt; _StartTimeStamp.HasValue &lt;span style="color:#0000ff"&gt;Then&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="color:#0000ff"&gt;If&lt;/span&gt; image.Timestamp - _StartTimeStamp.Value &amp;gt; 1000 &lt;span style="color:#0000ff"&gt;Then&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                _CurrentFps = _FrameCount&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                _StartTimeStamp = image.Timestamp&lt;/li&gt; &lt;li&gt;                _FrameCount = 0&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="color:#0000ff"&gt;Else&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                _FrameCount += 1&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;If&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;Else&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            _StartTimeStamp = image.Timestamp&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;If&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Class&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Il primo algoritmo aggiorna l’FPS ad ogni frame e genera, quindi una variazione costante dello stesso. Il secondo, invece, fornisce un valore nuovo di FPS ogni secondo dando luogo ad una rilevazione più stabile.&lt;/p&gt;  &lt;p&gt;La classe ImageFrame mette a disposizione, come possiamo vedere dalla precedente immagine, la proprietà FrameNumber che contiene il numero di frame corrispondente all’immagine. Nella refresh dell’SDk appena uscita (scaricabile da qui) questo numero rappresenta realmente il numero del frame dello stream. Per questo, in teoria, possiamo utilizzare questo numero per calcolare l’FPS. In questo caso memorizziamo il numero del frame da cui partiamo, ragioniamo sui timestamp in maniera analoga a quanto fatto nell’FtpCalculator2 e facciamo la differenza tra il numero di frame:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:7c35c43e-67a8-42c3-b821-80f41239d5e4" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Imports&lt;/span&gt; Microsoft.Research.Kinect.Nui&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;FpsCalculator3&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Implements&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IFpsCalculator&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Private&lt;/span&gt; _StartTimeStamp &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Long&lt;/span&gt;? = &lt;span style="color:#0000ff"&gt;Nothing&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Private&lt;/span&gt; _FrameNumberStart &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Integer&lt;/span&gt; = 0&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Private&lt;/span&gt; _CurrentFps &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Integer&lt;/span&gt; = 0&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;ReadOnly&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Property&lt;/span&gt; CurrentFps &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Integer&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Implements&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IFpsCalculator&lt;/span&gt;.CurrentFps&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;Get&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="color:#0000ff"&gt;Return&lt;/span&gt; _CurrentFps&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Get&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Property&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt; SetCurrentImageFrame(&lt;span style="color:#0000ff"&gt;ByVal&lt;/span&gt; image &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ImageFrame&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;Implements&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IFpsCalculator&lt;/span&gt;.SetCurrentImageFrame&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;If&lt;/span&gt; _StartTimeStamp.HasValue &lt;span style="color:#0000ff"&gt;Then&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;If&lt;/span&gt; image.Timestamp - _StartTimeStamp.Value &amp;gt; 1000 &lt;span style="color:#0000ff"&gt;Then&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                _CurrentFps = image.FrameNumber - _FrameNumberStart&lt;/li&gt; &lt;li&gt;                _StartTimeStamp = image.Timestamp&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                _FrameNumberStart = image.FrameNumber&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;If&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;Else&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            _StartTimeStamp = image.Timestamp&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            _FrameNumberStart = image.FrameNumber&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;If&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Class&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:fe0cb7a4-f5b0-4066-9f2c-055daad464d5" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/fps" rel="tag"&gt;fps&lt;/a&gt;,&lt;a href="http://technorati.com/tags/kinect+sdk" rel="tag"&gt;kinect sdk&lt;/a&gt;,&lt;a href="http://technorati.com/tags/kinect" rel="tag"&gt;kinect&lt;/a&gt;,&lt;a href="http://technorati.com/tags/vb.net" rel="tag"&gt;vb.net&lt;/a&gt;,&lt;a href="http://technorati.com/tags/video+stream" rel="tag"&gt;video stream&lt;/a&gt;,&lt;a href="http://technorati.com/tags/depth+stream" rel="tag"&gt;depth stream&lt;/a&gt;,&lt;a href="http://technorati.com/tags/imageframe" rel="tag"&gt;imageframe&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-6638512357950513258?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/6638512357950513258/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=6638512357950513258&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/6638512357950513258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/6638512357950513258'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/08/alla-scoperta-del-kinect-calcoliamo.html' title='Alla scoperta del Kinect: calcoliamo l’FPS degli stream video.'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/-kOcu-dxmWQo/TjZ5TOGC89I/AAAAAAAAA5A/NLYaMltP70k/s72-c/image_thumb.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-2435275582039879977</id><published>2011-08-01T08:00:00.000+02:00</published><updated>2011-08-01T08:00:07.232+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Kinect'/><title type='text'>Alla scoperta del Kinect: la classe Runtime</title><content type='html'>&lt;p&gt;La classe Runtime (del namespace Microsoft.Research.KInect.Nui e contenuta nell’assemlby Microsoft.Research.Kinect) è per la nostra avventura come lo specchio per Alice: la porta peser entrare in un altro mondo……quello del Kinect!!!&lt;/p&gt;  &lt;p&gt;A parte gli scherzi, la classe Runtime è fondamentale perché espone tutte le funzionalità che possiamo utilizzare del Kinect per quel che riguarda la parte delle gesture.&lt;/p&gt;  &lt;p&gt;Di fatto un’istanza della classe Runtime gestisce un device connesso e la sua struttura è mostrata nella seguente immagine:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-gH6VpI9uUHA/TjRNGKN6c8I/AAAAAAAAA4E/ZaMoGkT9XA4/s1600-h/image%25255B5%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/-61UYOj9t1xk/TjRNHMfcZNI/AAAAAAAAA4I/RQc5ljDF1hg/image_thumb%25255B3%25255D.png?imgmax=800" width="550" height="284" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Per poter accedere alle funzionalità del sensore video, di profondità e allo skeleton engine (il “robo” che fa si che il Kinect individui la struttura di&amp;#160; un corpo umano che si agita come un forsennato davanti a lui) è sufficiente creare un’istanza della classe Runtime.&lt;/p&gt;  &lt;p&gt;Ma procediamo con ordine, innanzitutto per avere visibilità sulla classe Runtime è necessario referenziare la libreria Microsoft.Research.Kinect e lo facciamo, come accade usualmente, utilizzando l’opzione di Visual Studio (menù Add Reference che si ottiene con il tasto destro):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-RZ08y0d5kHs/TjRNHxC6vbI/AAAAAAAAA4M/NYaOAZ-raNI/s1600-h/SNAGHTML513572e%25255B5%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="SNAGHTML513572e" border="0" alt="SNAGHTML513572e" src="http://lh5.ggpht.com/-_TFRa2H-QS8/TjRNJOJoh6I/AAAAAAAAA4Q/9AN_TjOPbDs/SNAGHTML513572e_thumb%25255B2%25255D.png?imgmax=800" width="500" height="479" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-1_t8oO5ZdIo/TjRNKIfS58I/AAAAAAAAA4U/ESNL4p-k0QE/s1600-h/SNAGHTML515b803%25255B5%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="SNAGHTML515b803" border="0" alt="SNAGHTML515b803" src="http://lh4.ggpht.com/-YL5NTCNsujI/TjRNLSZ-gSI/AAAAAAAAA4Y/mwaO38iTSK0/SNAGHTML515b803_thumb%25255B2%25255D.png?imgmax=800" width="500" height="288" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;A questo punto possiamo istanziare la classe:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:a6a5b53d-6f7a-488b-968e-9ae30812c851" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; nui = &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Runtime&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Istanziare la classe Runtime non è sufficiente per poter accedere ai sensori, è necessario inizializzare la classe con il metodo Initialize():&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:54187eb8-41ac-4f35-a084-7a86dc51c920" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; nui = &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Runtime&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;nui.Initialize(&lt;span style="color:#2b91af"&gt;RuntimeOptions&lt;/span&gt;.UseColor &lt;span style="color:#0000ff"&gt;or&lt;/span&gt;  &lt;span style="color:#2b91af"&gt;RuntimeOptions&lt;/span&gt;.UseDepth)&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;In questo caso ho richiesto alla Runtime l’utilizzo dello stream video e di quello della profondità.&lt;/p&gt;  &lt;p&gt;Prima di procedere analizziamo a fondo cosa ci mette a disposizione la Runtime a livello di proprietà, metodi ed eventi.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Le proprietà della Runtime&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;InstanceIndex&lt;/strong&gt; : è un intero che identifica il numero di istanza della Runtime. Ogni device connesso al pc ha la sua Runtime e questo numero ci permette di identificare il singolo device; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;NuiCamera&lt;/strong&gt; : è la proprietà che ci consente di accedere all’oggetto Camera per poter, ad esempio, modificare l’inclinazione; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;VideoStream&lt;/strong&gt; : espone un’istanza di ImageStream che descive lo stream della video camera del Kinect. Vedremo in dettaglio in un altro post la classe ImageStream, per ora ci basti immaginarlo come uno stream che fornisce i fotogrammi rilevati dalla videocamera; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;DepthStream&lt;/strong&gt; : anche in questa proprietà espone un’istanza di ImageStream ma questa volta riguarda le immagini di profondità, ovvero le immagini in cui il Kinect traduce la distanza degli oggetti da se stesso; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;SkeletonEngine&lt;/strong&gt; : è la proprietà che espone il motore che gestisce il riconoscimento della figura umana (ce ne occuperemo in un altro post). &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;I metodi della Runtime&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Initialize&lt;/strong&gt; : abbiamo già visto questo metodo ed ha lo scopo di “avviare” l’aggetto richiedendo le funzionalità di cui abbiamo bisogno. Il parametro che accetta come argomento è del tipo RuntimeOptions, un’enumerazione flag con i seguenti valori: &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-TyADLfAzWMw/TjRNL2XDqsI/AAAAAAAAA4c/zEMS1q62DTo/s1600-h/image%25255B9%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-HTDUabR3cbg/TjRNMozkC-I/AAAAAAAAA4g/W_0Hx96SA6g/image_thumb%25255B8%25255D.png?imgmax=800" width="502" height="284" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Uninitialize&lt;/strong&gt; : esegue lo shutdown dell’istanza di runtime. Una volta eseguito lo shutdown della Runtime, pur se l’oggetto managed non è Nothing, non è più possibile tentare di inizializzarlo in quanto viene rilasciata definitivamente tutta la parte unmanaged che c’è dietro. Se si prova si ottiene un’eccezione. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Gli eventi della Runtime&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Gli eventi della classe Runtime sono i membri della classe che, di fatto, ci permettono un primo uso, anche se banale della stessa:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;VideoFrameReady&lt;/strong&gt; : viene sollevato quando un’immagine dello stream video è pronta per essere utilizzata; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;DepthFrameReady&lt;/strong&gt; : viene sollevato quando un’immagine dello stream di profondità è pronta per essere utilizzata; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;SkeletonFrameReady&lt;/strong&gt; : viene sollevato quando un’immagine del riconoscimento della figura umana è stata elaborata dallo skeleton engine ed è pronta per essere utilizzata. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I primi due eventi hanno per argomento la classe ImageFrameReadyEventArgs, mentre il terzo ha come argomento la classe SkeletonFrameReadyEventArgs.&lt;/p&gt;  &lt;p&gt;Vedremo in dettaglio la struttura della SkeletonFrameReadyEventArgs in un prossimo post, mentre la ImageFrameReadyEventArgs ha la seguente struttura:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-ewFGMJ3NEv4/TjRNNThXMKI/AAAAAAAAA4k/F3vWIE8LABA/s1600-h/image%25255B15%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/-MdFaKKtcmKM/TjRNOfBr0RI/AAAAAAAAA4o/i8nA0O5tK-E/image_thumb%25255B10%25255D.png?imgmax=800" width="485" height="288" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Di fatto l’argomento dell’evento ci fornisce l’immagine dello stream corrispondente che possiamo elaborare a nostro piacimento.&lt;/p&gt;  &lt;p&gt;Quindi, istanziamo la Runtime, la inizializziamo, gestiamo gli eventi di cui sopra e siamo in grado, almeno per ora di riportare a video ciò che il Kinect sta inquadrando. In realtà, tra l’inizializzazione della Runtime e la fruizione delle immagini manca uno step fondamentale ovvero l’apertura degli stream VideoStream e DepthStream che se non aperti non comincerebbero a produrre immagini.&lt;/p&gt;  &lt;p&gt;Il&amp;#160; metodo Open ha la seguente sintassi:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-fSqpfEHP-Uo/TjRNO-LpLPI/AAAAAAAAA4s/XoyO-U7FerI/s1600-h/image%25255B18%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/-3_uduc_NfI0/TjRNPR8zhDI/AAAAAAAAA4w/Gsq3S3F5Dvs/image_thumb%25255B11%25255D.png?imgmax=800" width="312" height="97" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;dove:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;streamType&lt;/strong&gt; : ci consente di definire la tipologia di stream che vogliamo ricevere; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;poolSize&lt;/strong&gt; : è il numero di frame che il runtime di NUI deve memorizzare. Il valore massimo è 4, nella maggior parte delle applicazioni è sufficiente 2; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;resolution&lt;/strong&gt; : dichiara la risoluzione che si vuole per lo stream. Sono disponibili svariate risoluzioni ma se si hanno più stream aperti (ad esempio video e depth) non tutte le combinazioni funzionano; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;image&lt;/strong&gt; : definisce la tipologia dell’immagine. Ad esempio DepthAndPlayerIndex cioè un’immagine che contiene al suo interno i dati di distanza e del numero del giocatore. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Andremo in dettaglio dello stream di distanza in un altro post prossimamente.&lt;/p&gt;  &lt;p&gt;Nell’esempio allegato a questo post trovate una banale applicazione WPF, sviluppata con il pattern MVVM, che visualizza i due stream illustrati in precedenza.&lt;/p&gt;  &lt;p&gt;La creazione del ViewModel relativo alla finestra principale è la seguente:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:f05df3a2-1d08-432e-8924-941e26180cfd" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt; &lt;span style="color:#0000ff"&gt;New&lt;/span&gt;()&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;If&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Not&lt;/span&gt; &lt;span style="color:#2b91af"&gt;DesignerProperties&lt;/span&gt;.GetIsInDesignMode(&lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;DependencyObject&lt;/span&gt;()) &lt;span style="color:#0000ff"&gt;Then&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        Nui = &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Runtime&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;AddHandler&lt;/span&gt; Nui.DepthFrameReady, &lt;span style="color:#0000ff"&gt;AddressOf&lt;/span&gt; DepthFrameHandler&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;AddHandler&lt;/span&gt; Nui.VideoFrameReady, &lt;span style="color:#0000ff"&gt;AddressOf&lt;/span&gt; VideoFrameHandler&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        Nui.Initialize(&lt;span style="color:#2b91af"&gt;RuntimeOptions&lt;/span&gt;.UseColor &lt;span style="color:#0000ff"&gt;Or&lt;/span&gt; &lt;span style="color:#2b91af"&gt;RuntimeOptions&lt;/span&gt;.UseDepthAndPlayerIndex)&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        Nui.DepthStream.Open(&lt;span style="color:#2b91af"&gt;ImageStreamType&lt;/span&gt;.Depth, 2, &lt;span style="color:#2b91af"&gt;ImageResolution&lt;/span&gt;.Resolution640x480, &lt;span style="color:#2b91af"&gt;ImageType&lt;/span&gt;.DepthAndPlayerIndex)&lt;/li&gt; &lt;li&gt;        Nui.VideoStream.Open(&lt;span style="color:#2b91af"&gt;ImageStreamType&lt;/span&gt;.Video, 2, &lt;span style="color:#2b91af"&gt;ImageResolution&lt;/span&gt;.Resolution640x480, &lt;span style="color:#2b91af"&gt;ImageType&lt;/span&gt;.Color)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;If&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;dove Nui è un attributo privato del ViewModel di tipo Runtime.&lt;/p&gt;  &lt;p&gt;Per la gestione delle immagini provenienti dai due stream mi sono affidato ad un toolkit sviluppato da &lt;a href="http://channel9.msdn.com/coding4fun/" target="_blank"&gt;Coding4Fun&lt;/a&gt; che fornisce degli extension methods per la conversione tra immagini Kinect e immagini WPF. Il toolkit si chiama “Kinect toolkit for WPF” (ne esiste una versione anche per Windows Form) e si può referenziare nel nostro progetto tramite NuGet:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-jVsDtK6KKis/TjRNQePDkWI/AAAAAAAAA40/GQFmxTOswcc/s1600-h/SNAGHTML5752519%25255B3%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="SNAGHTML5752519" border="0" alt="SNAGHTML5752519" src="http://lh4.ggpht.com/-xuqZlrZfcck/TjRNRfpq8_I/AAAAAAAAA44/Csef_JixpfI/SNAGHTML5752519_thumb.png?imgmax=800" width="500" height="275" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In questo caso il ViewModel espone le ultime due immagini dei due stream che possono essere messe in binding con un normale controllo Image dell’interfaccia:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:aa88c009-3498-4334-a4d9-40158d0b5788" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Imports&lt;/span&gt; System.ComponentModel&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;Imports&lt;/span&gt; Microsoft.Research.Kinect.Nui&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Imports&lt;/span&gt; Coding4Fun.Kinect.Wpf&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;MainWindowViewModel&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Implements&lt;/span&gt; &lt;span style="color:#2b91af"&gt;INotifyPropertyChanged&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Private&lt;/span&gt; Nui &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Runtime&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt; &lt;span style="color:#0000ff"&gt;New&lt;/span&gt;()&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;If&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Not&lt;/span&gt; &lt;span style="color:#2b91af"&gt;DesignerProperties&lt;/span&gt;.GetIsInDesignMode(&lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;DependencyObject&lt;/span&gt;()) &lt;span style="color:#0000ff"&gt;Then&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            Nui = &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Runtime&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="color:#0000ff"&gt;AddHandler&lt;/span&gt; Nui.DepthFrameReady, &lt;span style="color:#0000ff"&gt;AddressOf&lt;/span&gt; DepthFrameHandler&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;AddHandler&lt;/span&gt; Nui.VideoFrameReady, &lt;span style="color:#0000ff"&gt;AddressOf&lt;/span&gt; VideoFrameHandler&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;            Nui.Initialize(&lt;span style="color:#2b91af"&gt;RuntimeOptions&lt;/span&gt;.UseColor &lt;span style="color:#0000ff"&gt;Or&lt;/span&gt; &lt;span style="color:#2b91af"&gt;RuntimeOptions&lt;/span&gt;.UseDepth)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;            Nui.VideoStream.Open(&lt;span style="color:#2b91af"&gt;ImageStreamType&lt;/span&gt;.Video, 2, &lt;span style="color:#2b91af"&gt;ImageResolution&lt;/span&gt;.Resolution640x480, &lt;span style="color:#2b91af"&gt;ImageType&lt;/span&gt;.Color)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            Nui.DepthStream.Open(&lt;span style="color:#2b91af"&gt;ImageStreamType&lt;/span&gt;.Depth, 2, &lt;span style="color:#2b91af"&gt;ImageResolution&lt;/span&gt;.Resolution320x240, &lt;span style="color:#2b91af"&gt;ImageType&lt;/span&gt;.Depth)&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;If&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Event&lt;/span&gt; PropertyChanged &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;PropertyChangedEventHandler&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Implements&lt;/span&gt; &lt;span style="color:#2b91af"&gt;INotifyPropertyChanged&lt;/span&gt;.PropertyChanged&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Protected&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt; OnNotifyPropertyChanged(propertyName &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;String&lt;/span&gt;)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;RaiseEvent&lt;/span&gt; PropertyChanged(&lt;span style="color:#0000ff"&gt;Me&lt;/span&gt;, &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;PropertyChangedEventArgs&lt;/span&gt;(propertyName))&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Private&lt;/span&gt; _VideoImage &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ImageSource&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Property&lt;/span&gt; VideoImage &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ImageSource&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;Get&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="color:#0000ff"&gt;Return&lt;/span&gt; _VideoImage&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Get&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;Protected&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Set&lt;/span&gt;(value &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ImageSource&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;Me&lt;/span&gt;._VideoImage = value&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            OnNotifyPropertyChanged(&lt;span style="color:#a31515"&gt;&amp;quot;VideoImage&amp;quot;&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Set&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Property&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Private&lt;/span&gt; _DepthImage &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ImageSource&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Property&lt;/span&gt; DepthImage &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ImageSource&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;Get&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;Return&lt;/span&gt; _DepthImage&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Get&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;Protected&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Set&lt;/span&gt;(value &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ImageSource&lt;/span&gt;)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="color:#0000ff"&gt;Me&lt;/span&gt;._DepthImage = value&lt;/li&gt; &lt;li&gt;            OnNotifyPropertyChanged(&lt;span style="color:#a31515"&gt;&amp;quot;DepthImage&amp;quot;&lt;/span&gt;)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Set&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Property&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Private&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt; DepthFrameHandler(sender &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Object&lt;/span&gt;, e &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ImageFrameReadyEventArgs&lt;/span&gt;)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;Me&lt;/span&gt;.DepthImage = e.ImageFrame.ToBitmapSource()&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Private&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt; VideoFrameHandler(sender &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Object&lt;/span&gt;, e &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ImageFrameReadyEventArgs&lt;/span&gt;)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;Me&lt;/span&gt;.VideoImage = e.ImageFrame.ToBitmapSource()&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Protected&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Overrides&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt; Finalize()&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;MyBase&lt;/span&gt;.Finalize()&lt;/li&gt; &lt;li&gt;        Nui.Uninitialize()&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Class&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;   &lt;iframe style="padding-bottom: 0px; background-color: #fcfcfc; padding-left: 0px; width: 98px; padding-right: 0px; height: 115px; padding-top: 0px" title="Preview" marginheight="0" src="https://skydrive.live.com/embedicon.aspx/Public/Allegati%20Blog/Kinect/Kinect-RuntimeClass.zip?cid=4aab693689223ee9&amp;amp;sc=documents" frameborder="0" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;    &lt;br /&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:db80e13b-0f8f-48d9-9e2d-5fe801e4cab6" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/kinect+sdk" rel="tag"&gt;kinect sdk&lt;/a&gt;,&lt;a href="http://technorati.com/tags/runtime+class" rel="tag"&gt;runtime class&lt;/a&gt;,&lt;a href="http://technorati.com/tags/video+stream" rel="tag"&gt;video stream&lt;/a&gt;,&lt;a href="http://technorati.com/tags/depth+stream" rel="tag"&gt;depth stream&lt;/a&gt;,&lt;a href="http://technorati.com/tags/kinect" rel="tag"&gt;kinect&lt;/a&gt;,&lt;a href="http://technorati.com/tags/vb.net" rel="tag"&gt;vb.net&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-2435275582039879977?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/2435275582039879977/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=2435275582039879977&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/2435275582039879977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/2435275582039879977'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/08/alla-scoperta-del-kinect-la-classe.html' title='Alla scoperta del Kinect: la classe Runtime'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/-61UYOj9t1xk/TjRNHMfcZNI/AAAAAAAAA4I/RQc5ljDF1hg/s72-c/image_thumb%25255B3%25255D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-7646191909230545547</id><published>2011-07-30T14:40:00.001+02:00</published><updated>2011-07-30T14:40:50.076+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Varie'/><title type='text'>Agosto in città?………Parti per tecnolandia!!!</title><content type='html'>&lt;p&gt;Ad Agosto resti in città? Niente ferie estive o poca voglia di andare nella calca “ferragostiana”?&lt;/p&gt;  &lt;p&gt;Allora approfitta per studiare, aggiornarti ed imparare cose nuove grazie ad MSDN:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.microsoft.com/italy/technolandia/"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Large-HP-MS_1107" border="0" alt="Large-HP-MS_1107" src="http://lh5.ggpht.com/-u98R1_Ia1Yc/TjP70ayAH_I/AAAAAAAAA4A/A7EATAxZXXw/Large-HP-MS_1107%25255B9%25255D.jpg?imgmax=800" width="500" height="345" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:66121a76-698e-472f-8a7e-49419bd5d5c5" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/tecnolandia" rel="tag"&gt;tecnolandia&lt;/a&gt;,&lt;a href="http://technorati.com/tags/msdn" rel="tag"&gt;msdn&lt;/a&gt;,&lt;a href="http://technorati.com/tags/risorse" rel="tag"&gt;risorse&lt;/a&gt;,&lt;a href="http://technorati.com/tags/cloud" rel="tag"&gt;cloud&lt;/a&gt;,&lt;a href="http://technorati.com/tags/web" rel="tag"&gt;web&lt;/a&gt;,&lt;a href="http://technorati.com/tags/mobile" rel="tag"&gt;mobile&lt;/a&gt;,&lt;a href="http://technorati.com/tags/windows+phone" rel="tag"&gt;windows phone&lt;/a&gt;,&lt;a href="http://technorati.com/tags/windows" rel="tag"&gt;windows&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-7646191909230545547?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/7646191909230545547/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=7646191909230545547&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/7646191909230545547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/7646191909230545547'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/07/agosto-in-cittaparti-per-tecnolandia.html' title='Agosto in città?………Parti per tecnolandia!!!'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/-u98R1_Ia1Yc/TjP70ayAH_I/AAAAAAAAA4A/A7EATAxZXXw/s72-c/Large-HP-MS_1107%25255B9%25255D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-2817280769005131663</id><published>2011-07-29T21:22:00.001+02:00</published><updated>2011-07-29T21:40:07.558+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kinect'/><title type='text'>Alla scoperta del Kinect: presentazioni e convenevoli</title><content type='html'>&lt;p&gt;Oggi è arrivato un Kinect nuovo nuovo su cui cominciare a fare sperimentazione ed ho, quindi, deciso di condividere tutto ciò che scopro, le cavolate che faccio e i segreti che scopro con chi mi segue.&lt;/p&gt;  &lt;p&gt;I post che cercherò di scrivere con frequenza sono post di un neofita che si avvicina all’”Aggeggio” e che quindi sono diretti a chi nulla dell’argomento.&lt;/p&gt;  &lt;p&gt;Gli esperti troveranno noiosi e banali questi post, ma non si può aver tutto dalla vita.&lt;/p&gt;  &lt;p&gt;Per cominciare, scartato l’”Aggeggio” ho cominciato a preparare l’ambiente di sviluppo:&lt;/p&gt;  &lt;p&gt;1) Visual Studio 2010 Ultimate (che uso normalmente ma che non è necessario in quanto si può sviluppare tranquillamente con la express edition);&lt;/p&gt;  &lt;p&gt;2) Kinect SDK, scaricabile all’indirizzo &lt;a title="http://research.microsoft.com/en-us/um/redmond/projects/kinectsdk/download.aspx" href="http://research.microsoft.com/en-us/um/redmond/projects/kinectsdk/download.aspx"&gt;http://research.microsoft.com/en-us/um/redmond/projects/kinectsdk/download.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;3) DirectX Software Development Kit scaricabile all’indirizzo &lt;a title="http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;amp;id=6812" href="http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;amp;id=6812"&gt;http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;amp;id=6812&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;A questo punto vi basta connettere il Kinect alla presa di corrente e al vostro PC tramite cavo USB e potete cominciare a giocare.&lt;/p&gt;  &lt;p&gt;Vi consiglio di dare un’occhiata ai seguenti webcast di channel9:&lt;/p&gt;  &lt;div style="text-align: center"&gt;&lt;video controls poster="http://media.ch9.ms/ch9/ada8/c94194fb-a322-411e-8a0a-9efe0072ada8/KinectInstall_512_ch9.jpg"&gt;&lt;source src="http://media.ch9.ms/ch9/ada8/c94194fb-a322-411e-8a0a-9efe0072ada8/KinectInstall_low_ch9.mp4" /&gt;&lt;object type="application/x-silverlight-2" data="data:application/x-silverlight-2," width="512" height="288"&gt;&lt;param name="minRuntimeVersion" value="4.0.50401.0" /&gt;&lt;param name="source" value="http://channel9.msdn.com/scripts/Channel9.xap?v=1.7" /&gt;&lt;param name="initParams" value="mediaurl=http://smooth.ch9.ms/ch9/ada8/c94194fb-a322-411e-8a0a-9efe0072ada8/KinectInstall.ism/manifest,thumbnail=http://media.ch9.ms/ch9/ada8/c94194fb-a322-411e-8a0a-9efe0072ada8/KinectInstall_512_ch9.jpg,deliverymethod=adaptivestreaming,autoplay=false,entryid=c94194fba322411e8a0a9efe0072ada8" /&gt;&lt;/object&gt;&lt;/video&gt;&lt;/div&gt;  &lt;p&gt;e&lt;/p&gt;  &lt;div style="text-align: center"&gt;&lt;video controls poster="http://media.ch9.ms/ch9/3a32/8b0685ac-5f55-43cc-8764-9efe00713a32/SettingUpDevEnvironment_512_ch9.jpg"&gt;&lt;source src="http://media.ch9.ms/ch9/3a32/8b0685ac-5f55-43cc-8764-9efe00713a32/SettingUpDevEnvironment_low_ch9.mp4" /&gt;&lt;object type="application/x-silverlight-2" data="data:application/x-silverlight-2," width="512" height="288"&gt;&lt;param name="minRuntimeVersion" value="4.0.50401.0" /&gt;&lt;param name="source" value="http://channel9.msdn.com/scripts/Channel9.xap?v=1.7" /&gt;&lt;param name="initParams" value="mediaurl=http://smooth.ch9.ms/ch9/3a32/8b0685ac-5f55-43cc-8764-9efe00713a32/SettingUpDevEnvironment.ism/manifest,thumbnail=http://media.ch9.ms/ch9/3a32/8b0685ac-5f55-43cc-8764-9efe00713a32/SettingUpDevEnvironment_512_ch9.jpg,deliverymethod=adaptivestreaming,autoplay=false,entryid=8b0685ac5f5543cc87649efe00713a32" /&gt;&lt;/object&gt;&lt;/video&gt;&lt;/div&gt;  &lt;p&gt;Una volta installati gli SDK e i driver (questi potrebbero metterci qualche tempo) verificate che il dispositivo sia correttamente installato semplicemente controllando se è presente il nodo Kinect nella gestione del computer:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-gmN9x0vVPQ4/TjMMUiYeg6I/AAAAAAAAA3g/lqD0oy3We38/s1600-h/image2%25255B1%25255D%25255B4%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="image2[1]" border="0" alt="image2[1]" src="http://lh4.ggpht.com/-k3mkGMDNmcI/TjMMVawzImI/AAAAAAAAA3k/lIh23YyayIU/image2%25255B1%25255D_thumb%25255B2%25255D.png?imgmax=800" width="300" height="85" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;e che i microfoni siano visti all’interno delle periferiche audio che compaiono dall’opzione Sound del pannello di controllo:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-GYRmI1wnLJY/TjMMWPFDPVI/AAAAAAAAA3o/ZMT3jYE3700/s1600-h/image6%25255B1%25255D%25255B4%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="image6[1]" border="0" alt="image6[1]" src="http://lh3.ggpht.com/-oOeerEJ04xI/TjMMXGrXw5I/AAAAAAAAA3s/bkrdOv-9q44/image6%25255B1%25255D_thumb%25255B2%25255D.png?imgmax=800" width="400" height="440" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;A questo punto dovrebbe essere tutto pronto ma………potrebbe succedervi quello che è successo a me: ho provato a creare, da codice, una istanza della classe Runtime (di cui parleremo in seguito) e ad inizializzarla:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:5d861a62-4930-4b57-a505-6b44292807b1" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 500px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px;"&gt; &lt;li&gt;nui = &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Runtime&lt;/span&gt;()&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;nui.Initialize(&lt;span style="color:#2b91af"&gt;RuntimeOptions&lt;/span&gt;.UseDepth &lt;span style="color:#0000ff"&gt;Or&lt;/span&gt; &lt;span style="color:#2b91af"&gt;RuntimeOptions&lt;/span&gt;.UseColor)&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;ed ho ottenuto:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-6kc2ApLAmH8/TjMMYGsOiUI/AAAAAAAAA3w/GYdPzDgQD2s/s1600-h/SNAGHTMLee51fa%25255B6%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="SNAGHTMLee51fa" border="0" alt="SNAGHTMLee51fa" src="http://lh3.ggpht.com/-GNmaAonXy60/TjMMZBwrtTI/AAAAAAAAA30/HQqt_BqdKlQ/SNAGHTMLee51fa_thumb%25255B3%25255D.png?imgmax=800" width="500" height="221" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Kinect installato, connesso ed alimentato, SDK pronti e codice banale, ma allora cosa accade?&lt;/p&gt;  &lt;p&gt;Non ho mai installato altri framework per gestire il Kinect, quindi non può essere quello.&lt;/p&gt;  &lt;p&gt;Ho chiuso tutte le applicazioni inutili, ma nulla.&lt;/p&gt;  &lt;p&gt;Gira che ti rigira, alla fine ho la fortuna di staccare la docking station dell’ufficio a cui è attaccato il mio notebook per usufruire della tastiera e del mouse wireless e del monitor esterno e a cui c’è attaccato anche un hub USB alimentato.&lt;/p&gt;  &lt;p&gt;Beh, la fortuna ha voluto che fosse quello, il Kinect ha cominciato a funzionare. Quindi fate attenzione che le vostre USB non siano “collegate” in qualche modo tra loro (evidentemente le mie lo sono).&lt;/p&gt;  &lt;p&gt;Staccate tutto quello che avete sull’USB tranne il Kinect e procedete riattacando solo quello che vi serve.&lt;/p&gt;  &lt;p&gt;Rimanete connessi perché i post continueranno.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:e10fe5bf-2455-4a23-a9e2-90e9ec5dd439" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/kinect" rel="tag"&gt;kinect&lt;/a&gt;,&lt;a href="http://technorati.com/tags/xbox" rel="tag"&gt;xbox&lt;/a&gt;,&lt;a href="http://technorati.com/tags/kinect+sdk" rel="tag"&gt;kinect sdk&lt;/a&gt;,&lt;a href="http://technorati.com/tags/visual+studio+2010" rel="tag"&gt;visual studio 2010&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-2817280769005131663?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/2817280769005131663/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=2817280769005131663&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/2817280769005131663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/2817280769005131663'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/07/alla-scoperta-del-kinect-presentazioni.html' title='Alla scoperta del Kinect: presentazioni e convenevoli'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/-k3mkGMDNmcI/TjMMVawzImI/AAAAAAAAA3k/lIh23YyayIU/s72-c/image2%25255B1%25255D_thumb%25255B2%25255D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-5795725198377924663</id><published>2011-07-18T10:43:00.001+02:00</published><updated>2011-07-18T10:43:05.294+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Varie'/><title type='text'>Un grazie a DotNetCampania per la bellissima giornata di sabato!!</title><content type='html'>&lt;p&gt;Mi sembra d’obbligo utilizzare questo post per ringraziare &lt;a href="http://dotnetcampania.org/blogs/michele/" target="_blank"&gt;Michele&lt;/a&gt; e i soci di &lt;a href="http://dotnetcampania.org/" target="_blank"&gt;DotNetCampania&lt;/a&gt; per avermi invitato, sabato scorso, al loro &lt;a href="http://dotnetcampania.org/blogs/michele/archive/2011/07/11/community-day-su-mvc3-e-orchard.aspx" target="_blank"&gt;Community Day su MVC 3 e Orchard&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Una bellissima giornata in compagnia di ragazzi preparati, curiosi e con tanta voglia di fare community.&lt;/p&gt;  &lt;p&gt;In una giornata così informale si riesce a prendere in esame quegli aspetti pratici (i famosi “casi pelosi”) che sarebbe difficile prendere in esame in un evento “ufficiale”.&lt;/p&gt;  &lt;p&gt;Ne nasce una giornata che, magari non segue esattamente l’agenda prevista, ma poco importa perché il dialogo che ne viene fuori è sempre costruttivo e stimolante.&lt;/p&gt;  &lt;p&gt;Complimenti a Michele e a tutti i ragazzi della community campana perché stanno svolgendo un ottimo lavoro e suggerisco a tutti coloro che vivono a Napoli e dintorni di seguire la community campana e di diventare soci perché ne vale la pena!!!&lt;/p&gt;  &lt;p&gt;Un particolare ringraziamento a Gaetano: incarna esattamente il personaggio community come lo intendo io. Mettere a disposizione la propria sede per degli eventi community è da ILLUMINATO come se ne conoscono pochi in Italia e, poi,………sviluppa in VB.NET (che non è da poco)!!!!&lt;/p&gt;  &lt;p&gt;Grazie ancora e spero di poter essere presente anche ad altri Community Day!!!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:7fe64b14-c64e-4f6e-abd7-1a7615ac85cd" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/dotnetcampania" rel="tag"&gt;dotnetcampania&lt;/a&gt;,&lt;a href="http://technorati.com/tags/community+day" rel="tag"&gt;community day&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-5795725198377924663?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/5795725198377924663/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=5795725198377924663&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/5795725198377924663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/5795725198377924663'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/07/un-grazie-dotnetcampania-per-la.html' title='Un grazie a DotNetCampania per la bellissima giornata di sabato!!'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-1631660827041752698</id><published>2011-07-15T09:13:00.001+02:00</published><updated>2011-07-15T09:13:22.648+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Eventi'/><category scheme='http://www.blogger.com/atom/ns#' term='wp7'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone 7'/><title type='text'>Evento on-line su Windows Phone 7 “Mango”</title><content type='html'>&lt;p&gt;Come certamente sapete, da qualche settimana è disponibile, per gli sviluppatori Windows Phone 7, la beta del nuovo sistema operativo per il telefono Microsoft denominato “Mango”.&lt;/p&gt;  &lt;p&gt;MSDN Italia ha preparato un evento on-line in streaming (registrato, ovviamente) che permette di avvicinarsi allo sviluppo su questa piattaforma.&lt;/p&gt;  &lt;p&gt;L'evento (&lt;a href="http://www.microsoft.com/italy/windowsphone/evento/"&gt;link&lt;/a&gt;) è composto da una keynote e da 6 sessioni tecniche:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Introduzione allo sviluppo per Windows Phone – Cristian Civera &lt;/li&gt;    &lt;li&gt;Il design delle applicazioni Windows Phone – Roberto Cavallini &lt;/li&gt;    &lt;li&gt;Le novità della piattaforma di sviluppo in Windows Phone &amp;quot;Mango&amp;quot; – Lorenzo Barbieri &lt;/li&gt;    &lt;li&gt;Multitasking nelle applicazioni Windows Phone &amp;quot;Mango&amp;quot; – Matteo Pagani &lt;/li&gt;    &lt;li&gt;Live Tile e notifiche in Windows Phone &amp;quot;Mango&amp;quot; – Michele Locuratolo &lt;/li&gt;    &lt;li&gt;Phone + Cloud in pochi clic con Azure Toolkit per Windows Phone 7 – Roberto Freato &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:a5037d59-bc17-439b-996a-3a48c1888c28" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/windows+phone+7" rel="tag"&gt;windows phone 7&lt;/a&gt;,&lt;a href="http://technorati.com/tags/mango" rel="tag"&gt;mango&lt;/a&gt;,&lt;a href="http://technorati.com/tags/windows+phone+mango" rel="tag"&gt;windows phone mango&lt;/a&gt;,&lt;a href="http://technorati.com/tags/silverlight" rel="tag"&gt;silverlight&lt;/a&gt;,&lt;a href="http://technorati.com/tags/XNA" rel="tag"&gt;XNA&lt;/a&gt;,&lt;a href="http://technorati.com/tags/evento" rel="tag"&gt;evento&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-1631660827041752698?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/1631660827041752698/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=1631660827041752698&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/1631660827041752698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/1631660827041752698'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/07/evento-on-line-su-windows-phone-7-mango.html' title='Evento on-line su Windows Phone 7 “Mango”'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-1687758313771325786</id><published>2011-07-03T21:20:00.001+02:00</published><updated>2011-07-03T21:20:49.723+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Caliburn.Micro'/><category scheme='http://www.blogger.com/atom/ns#' term='wp7'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone 7'/><title type='text'>Caliburn.Micro, NuGet, Visual Basic.Net e Windows Phone 7</title><content type='html'>&lt;p&gt;No, non mi sono sbagliato e ho ripubblicato un precedente &lt;a href="http://codetailor.blogspot.com/2011/06/caliburnmicro-nuget-e-visual-basicnet.html" target="_blank"&gt;post&lt;/a&gt;, semplicemente si tratta della versione del precedente &lt;a href="http://codetailor.blogspot.com/2011/06/caliburnmicro-nuget-e-visual-basicnet.html" target="_blank"&gt;post&lt;/a&gt; per WP7.&lt;/p&gt;  &lt;p&gt;Anche in questo caso, se tentiamo di utilizzare &lt;a href="http://caliburnmicro.codeplex.com/" target="_blank"&gt;Caliburn.Micro&lt;/a&gt; tramite NuGet in un progetto VB.NET per WP7, otteniamo che le classi che il package NuGet genera sono per C#.&lt;/p&gt;  &lt;p&gt;Ma procediamo con ordine, per cominciare accertiamoci di aver installato ed abilitato NuGet tra le estensioni di VS (basta vedere se con il tasto destro su un progetto appare il menù contestuale “Add Library Package Reference…”). Se non abbiamo NuGet, possiamo installarlo utilizzando l’Extension Manager del menù Tools.&lt;/p&gt;  &lt;p&gt;Come secondo passo creiamo un nuovo progetto WP7 e, una volta che Visual Studio ha terminato la procedura di creazione, selezioniamo il nostro progetto e scegliamo il comando “Manage NuGet Packages…” che compare con la pressione del tasto destro del mouse.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-jzEAsMxWxAc/ThDAyQxw6jI/AAAAAAAAA2w/onnOoPFUJaI/s1600-h/image5.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/-eT3cGnUYbO8/ThDA1IktEJI/AAAAAAAAA20/WOqWPOJJgRM/image_thumb3.png?imgmax=800" width="404" height="219" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Digitiamo “Caliburn” nella casella di ricerca della finestra di NuGet che appare subito dopo:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-J02uQNScKBk/ThDA41aLYwI/AAAAAAAAA24/8CMTQEOJMdw/s1600-h/SNAGHTMLcccd77d5.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="SNAGHTMLcccd77d" border="0" alt="SNAGHTMLcccd77d" src="http://lh4.ggpht.com/-hytk4zp5feo/ThDA8EarZOI/AAAAAAAAA28/whD8fH6bSCE/SNAGHTMLcccd77d_thumb2.png?imgmax=800" width="404" height="224" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Premendo il tasto install, il package NuGet provvede a creare le opportune classi (che abbiamo detto essere in C#) che servono per il funzionamento di Caliburn.Micro su WP7. In particolare, come possiamo vedere nella figura in seguito, vengono create due classi: AppBoostraper.cs e MainPageViewModel.cs&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-adlhSnzJmXI/ThDA9_MeaNI/AAAAAAAAA3A/IPtY7Q8ur3w/s1600-h/image10.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-S7D3MQc_ecU/ThDBARoSfxI/AAAAAAAAA3E/GJTca4F-YEM/image_thumb6.png?imgmax=800" width="304" height="319" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ovviamente, noi VB-isti non possiamo farci nulla delle classi generate quindi le cancelliamo e le sostituiamo con le seguenti:&lt;/p&gt;  &lt;p&gt;&lt;u&gt;&lt;strong&gt;AppBoostrapper.vb&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:f5f40cbf-17b4-46db-908a-7ef44bd60cdc" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 300px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Imports&lt;/span&gt; Caliburn.Micro&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;AppBootstrapper&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Inherits&lt;/span&gt; &lt;span style="color:#2b91af"&gt;PhoneBootstrapper&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; container &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;PhoneContainer&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Protected&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Overrides&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt; Configure()&lt;/li&gt; &lt;li&gt;        container = &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;PhoneContainer&lt;/span&gt;(RootFrame)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        container.RegisterPhoneServices()&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        container.PerRequest(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#ff0000"&gt;MainPageViewModel&lt;/span&gt;)()&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        AddCustomConventions()&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Protected&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Overrides&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt; GetInstance(service &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; System.&lt;span style="color:#2b91af"&gt;Type&lt;/span&gt;, key &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;String&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Object&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;Return&lt;/span&gt; container.GetInstance(service, key)&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Protected&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Overrides&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt; GetAllInstances(service &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; System.&lt;span style="color:#2b91af"&gt;Type&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; System.Collections.Generic.&lt;span style="color:#2b91af"&gt;IEnumerable&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Object&lt;/span&gt;)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;Return&lt;/span&gt; container.GetAllInstances(service)&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Protected&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Overrides&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt; BuildUp(instance &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Object&lt;/span&gt;)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        container.BuildUp(instance)&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt; AddCustomConventions()&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#2b91af"&gt;ConventionManager&lt;/span&gt;.AddElementConvention(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Pivot&lt;/span&gt;)(&lt;span style="color:#2b91af"&gt;Pivot&lt;/span&gt;.ItemsSourceProperty, &lt;span style="color:#a31515"&gt;&amp;quot;SelectedItem&amp;quot;&lt;/span&gt;, &lt;span style="color:#a31515"&gt;&amp;quot;SelectionChanged&amp;quot;&lt;/span&gt;).ApplyBinding = _&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Func&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; System.&lt;span style="color:#2b91af"&gt;Type&lt;/span&gt;, &lt;span style="color:#0000ff"&gt;String&lt;/span&gt;, System.Reflection.&lt;span style="color:#2b91af"&gt;PropertyInfo&lt;/span&gt;, System.Windows.&lt;span style="color:#2b91af"&gt;FrameworkElement&lt;/span&gt;, Caliburn.Micro.&lt;span style="color:#2b91af"&gt;ElementConvention&lt;/span&gt;, &lt;span style="color:#0000ff"&gt;Boolean&lt;/span&gt;) _&lt;/li&gt; &lt;li&gt;            (&lt;span style="color:#0000ff"&gt;Function&lt;/span&gt;(viewModelType, path, [property], element, convention)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                 &lt;span style="color:#0000ff"&gt;If&lt;/span&gt; (&lt;span style="color:#2b91af"&gt;ConventionManager&lt;/span&gt;.GetElementConvention(&lt;span style="color:#0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color:#2b91af"&gt;ItemsControl&lt;/span&gt;)).ApplyBinding(viewModelType, path, [property], element, convention)) &lt;span style="color:#0000ff"&gt;Then&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                     &lt;span style="color:#2b91af"&gt;ConventionManager&lt;/span&gt;.ConfigureSelectedItem(element, &lt;span style="color:#2b91af"&gt;Pivot&lt;/span&gt;.SelectedItemProperty, viewModelType, path)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                     &lt;span style="color:#2b91af"&gt;ConventionManager&lt;/span&gt;.ApplyHeaderTemplate(element, &lt;span style="color:#2b91af"&gt;Pivot&lt;/span&gt;.HeaderTemplateProperty, viewModelType)&lt;/li&gt; &lt;li&gt;                     &lt;span style="color:#0000ff"&gt;Return&lt;/span&gt; &lt;span style="color:#0000ff"&gt;True&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                 &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;If&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                 &lt;span style="color:#0000ff"&gt;Return&lt;/span&gt; &lt;span style="color:#0000ff"&gt;False&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;             &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#2b91af"&gt;ConventionManager&lt;/span&gt;.AddElementConvention(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Panorama&lt;/span&gt;)(&lt;span style="color:#2b91af"&gt;Panorama&lt;/span&gt;.ItemsSourceProperty, &lt;span style="color:#a31515"&gt;&amp;quot;SelectedItem&amp;quot;&lt;/span&gt;, &lt;span style="color:#a31515"&gt;&amp;quot;SelectionChanged&amp;quot;&lt;/span&gt;).ApplyBinding = _&lt;/li&gt; &lt;li&gt;                 &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Func&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; System.&lt;span style="color:#2b91af"&gt;Type&lt;/span&gt;, &lt;span style="color:#0000ff"&gt;String&lt;/span&gt;, System.Reflection.&lt;span style="color:#2b91af"&gt;PropertyInfo&lt;/span&gt;, System.Windows.&lt;span style="color:#2b91af"&gt;FrameworkElement&lt;/span&gt;, Caliburn.Micro.&lt;span style="color:#2b91af"&gt;ElementConvention&lt;/span&gt;, &lt;span style="color:#0000ff"&gt;Boolean&lt;/span&gt;) _&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                 (&lt;span style="color:#0000ff"&gt;Function&lt;/span&gt;(viewModelType, path, [property], element, convention)&lt;/li&gt; &lt;li&gt;                      &lt;span style="color:#0000ff"&gt;If&lt;/span&gt; (&lt;span style="color:#2b91af"&gt;ConventionManager&lt;/span&gt;.GetElementConvention(&lt;span style="color:#0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color:#2b91af"&gt;ItemsControl&lt;/span&gt;)).ApplyBinding(viewModelType, path, [property], element, convention)) &lt;span style="color:#0000ff"&gt;Then&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                          &lt;span style="color:#2b91af"&gt;ConventionManager&lt;/span&gt;.ConfigureSelectedItem(element, &lt;span style="color:#2b91af"&gt;Panorama&lt;/span&gt;.SelectedItemProperty, viewModelType, path)&lt;/li&gt; &lt;li&gt;                          &lt;span style="color:#2b91af"&gt;ConventionManager&lt;/span&gt;.ApplyHeaderTemplate(element, &lt;span style="color:#2b91af"&gt;Panorama&lt;/span&gt;.HeaderTemplateProperty, viewModelType)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                          &lt;span style="color:#0000ff"&gt;Return&lt;/span&gt; &lt;span style="color:#0000ff"&gt;True&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                      &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;If&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;                      &lt;span style="color:#0000ff"&gt;Return&lt;/span&gt; &lt;span style="color:#0000ff"&gt;False&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                  &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Class&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;u&gt;&lt;strong&gt;MainPageViewModel.vb&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:8ade0712-72cd-4fe1-b014-5db28b72c6ed" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 300px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;MainPageViewModel&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;   &lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Class&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;A questo punto possiamo seguire i passi descritti nel &lt;a href="http://caliburnmicro.codeplex.com/wikipage?title=Nuget" target="_blank"&gt;tutorial&lt;/a&gt; per poter configurare la nostra app all’utilizzo di Caliburn.Micro.&lt;/p&gt;  &lt;p&gt;Il suggerimento che vi posso dare è quello di ristrutturare le cartelle dell’applicazione creando le cartelle Views e ViewModels in cui inserire le views e i viewmodels (inizialmente MainPage e MainPageViewModel) nel seguente modo:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-H7MTnVBw300/ThDBBIYajDI/AAAAAAAAA3I/VnnvoHTz_NM/s1600-h/image14.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/-yV4eJxnqQk8/ThDBDxlycWI/AAAAAAAAA3M/p3EM3kgyCo8/image_thumb8.png?imgmax=800" width="304" height="373" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Infine, visto che ci siamo, modifichiamo i namespace delle classi MainPage (namespace CaliburnMicroWP7.Views) e MainPageViewModel (namespace CaliburnMicroWP7.ViewModels).&lt;/p&gt;  &lt;p&gt;In allegato al post trovate la soluzione completa con le classi e le modifiche.&lt;/p&gt;  &lt;p&gt;&lt;iframe style="padding-bottom: 0px; background-color: #fcfcfc; padding-left: 0px; width: 98px; padding-right: 0px; height: 115px; padding-top: 0px" title="Preview" marginheight="0" src="https://skydrive.live.com/embedicon.aspx/Public/Allegati%20Blog/CaliburnMicroWP7.zip?cid=4aab693689223ee9&amp;amp;sc=documents" frameborder="0" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:8f0801ad-7170-4130-bafb-ede2dd8e1746" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/Caliburn.Micro" rel="tag"&gt;Caliburn.Micro&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Caliburn" rel="tag"&gt;Caliburn&lt;/a&gt;,&lt;a href="http://technorati.com/tags/WP7" rel="tag"&gt;WP7&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Windows+Phone+7" rel="tag"&gt;Windows Phone 7&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Visual+Basic+.NET" rel="tag"&gt;Visual Basic .NET&lt;/a&gt;,&lt;a href="http://technorati.com/tags/VB.NET" rel="tag"&gt;VB.NET&lt;/a&gt;,&lt;a href="http://technorati.com/tags/NuGet" rel="tag"&gt;NuGet&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Bootstrapper" rel="tag"&gt;Bootstrapper&lt;/a&gt;,&lt;a href="http://technorati.com/tags/AppBootstrapper" rel="tag"&gt;AppBootstrapper&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-1687758313771325786?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/1687758313771325786/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=1687758313771325786&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/1687758313771325786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/1687758313771325786'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/07/caliburnmicro-nuget-visual-basicnet-e.html' title='Caliburn.Micro, NuGet, Visual Basic.Net e Windows Phone 7'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/-eT3cGnUYbO8/ThDA1IktEJI/AAAAAAAAA20/WOqWPOJJgRM/s72-c/image_thumb3.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-4157436433260529958</id><published>2011-06-23T11:58:00.001+02:00</published><updated>2011-06-23T11:58:24.476+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Recensioni'/><category scheme='http://www.blogger.com/atom/ns#' term='wp7'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone 7'/><title type='text'>Recensione : Windows® Phone 7 Developer Guide</title><content type='html'>&lt;a href="http://lh6.ggpht.com/-HD7x5JYR7uY/TgMOOuhQCzI/AAAAAAAAA2Q/zDOv3i-Z6Ro/s1600-h/Windows%252520Phone%2525207%252520-%252520Developers%252520Guide%252520-%252520Patterns%252520%252526%252520Practices%25255B7%25255D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 0px 5px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top: 0px; border-right: 0px; padding-top: 0px" title="Windows Phone 7 - Developers Guide - Patterns &amp;amp; Practices" border="0" alt="Windows Phone 7 - Developers Guide - Patterns &amp;amp; Practices" align="right" src="http://lh6.ggpht.com/-Hff8QR9ghAw/TgMOPlIQ16I/AAAAAAAAA2U/JXYnuz7r8eE/Windows%252520Phone%2525207%252520-%252520Developers%252520Guide%252520-%252520Patterns%252520%252526%252520Practices_thumb%25255B4%25255D.jpg?imgmax=800" width="138" height="186" /&gt;&lt;/a&gt;&lt;font size="1"&gt;- Titolo: &lt;strong&gt;Windows® Phone 7 Developer Guide&lt;/strong&gt;     &lt;br /&gt;- &lt;/font&gt;&lt;font size="1"&gt;Autori: &lt;strong&gt;Sharp, John&lt;/strong&gt;    &lt;br /&gt;- &lt;/font&gt;&lt;font size="1"&gt;Editore: &lt;strong&gt;Microsoft Press&lt;/strong&gt;    &lt;br /&gt;- &lt;/font&gt;&lt;font size="1"&gt;Data di pubblicazione: &lt;strong&gt;07/12/2010&lt;/strong&gt;    &lt;br /&gt;- &lt;/font&gt;&lt;font size="1"&gt;Pagine: &lt;strong&gt;736&lt;/strong&gt;    &lt;br /&gt;- &lt;/font&gt;&lt;font size="1"&gt;ISBN13: &lt;strong&gt;9780735645561&lt;/strong&gt;    &lt;br /&gt;- &lt;/font&gt;&lt;font size="1"&gt;ISBN10: &lt;strong&gt;9780735645561&lt;/strong&gt;    &lt;br /&gt;-&lt;/font&gt;&lt;font size="1"&gt;Lingua: &lt;strong&gt;Inglese&lt;/strong&gt;&lt;/font&gt;        &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;L’arrivo di Windows Phone 7 ha dato nuova linfa allo sviluppo di applicazioni mobile nell’ambito del framework .NET e il supporto didattico (libri, materiale video, post su blog, etc., etc.) sono andati di pari passo.&lt;/p&gt;  &lt;p&gt;Il rischio che si corre nella scrittura di un libro su questo argomento è quello di realizzare una “collezione” di materiale già esistente e recuperabile nel vasto mondo della rete.&lt;/p&gt;  &lt;p&gt;Quello che colpisce, invece, di questo libro è che “ci mette del suo” cioè, oltre a trattare argomenti “classici” per lo sviluppo Windows Phone 7 che si trovano in tutti i testi o i post sulla rete, va a toccare argomenti poco considerati come l’utilizzo del MVVM nelle applicazioni WP7 (sia in termini generici che facendo riferimento a Prism), la gestione dei dati on the cloud o la gestione delle interazioni asincrone (utilizzando Reactive Extensions).&lt;/p&gt;  &lt;p&gt;Il lato negativo del libro è, invece, che gli argomenti sono trattati in maniera superficiale e senza entrare in dettaglio. Questo può essere visto come un fatto negativo perchè ci costringe ad utilizzare altre fonti per esplodere l’argomento ma anche in termini positivi perchè fa si che il libro si mantenga snello e fluido.&lt;/p&gt;  &lt;p&gt;Da segnalare un’intera appendice riguardante le “capability” dei device WP7 come touch and gesture, contatti e messaggi, etc., etc.; un’appendice su Prism (secondo me mirata a chi già conosce il framework MVVM di casa Microsoft) e una su Sync Framework ed il suo utilizzo con WP7 (poteva forse essere espansa per fornire maggiori info, ma sono presenti, almeno, i links alle risorse da consultare).&lt;/p&gt;  &lt;p&gt;Per quanto riguarda gli argomenti trattati, mi ha colpito la presenza di un paragrafo in cui si parla del design delle applicazioni. E’, a mio modo di vedere, fondamentale capire come deve essere strutturata un’interfaccia WP7 in quanto il successo di un’applicazione per un display con poco spazio e con l’interfaccia in stile Metro dipende fortemente da come i controlli e l’accesso alle funzionalità sono presentate.&lt;/p&gt;  &lt;p&gt;In definitiva un libro discretamente scritto ma che non riscotrerà i favori di chi cerca dettagli specifici su particolari argomenti. Se state cercando di approfondire degli argomenti specifici non è il vostro libro, mentre se state cercando un libro snello che vi dia gli spunti per, poi, approfondire con altre risorse ciò che avete letto, allora il testo è adattissimo allo scopo.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:ad6fada2-038e-4b0f-a091-d1e78423da0d" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/wp7+tools" rel="tag"&gt;wp7 tools&lt;/a&gt;,&lt;a href="http://technorati.com/tags/patterns+%26+practices" rel="tag"&gt;patterns &amp;amp; practices&lt;/a&gt;,&lt;a href="http://technorati.com/tags/recensione" rel="tag"&gt;recensione&lt;/a&gt;,&lt;a href="http://technorati.com/tags/books" rel="tag"&gt;books&lt;/a&gt;,&lt;a href="http://technorati.com/tags/libro" rel="tag"&gt;libro&lt;/a&gt;,&lt;a href="http://technorati.com/tags/windows+phone+7" rel="tag"&gt;windows phone 7&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-4157436433260529958?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/4157436433260529958/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=4157436433260529958&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/4157436433260529958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/4157436433260529958'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/06/recensione-windows-phone-7-developer.html' title='Recensione : Windows® Phone 7 Developer Guide'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/-Hff8QR9ghAw/TgMOPlIQ16I/AAAAAAAAA2U/JXYnuz7r8eE/s72-c/Windows%252520Phone%2525207%252520-%252520Developers%252520Guide%252520-%252520Patterns%252520%252526%252520Practices_thumb%25255B4%25255D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-6436978385840601955</id><published>2011-06-23T09:31:00.001+02:00</published><updated>2011-06-27T20:26:59.642+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Recensioni'/><category scheme='http://www.blogger.com/atom/ns#' term='WCF'/><title type='text'>Recensione : Windows Communication Foundation 4 – Step by Step</title><content type='html'>&lt;p&gt;Adoro leggere e adoro tenermi aggiornato riguardo al mondo .NET, quindi unendo le due cose ecco che vorrei inaugurare una rubrica di recensioni di libri anche in virtù del fatto che faccio parte dell’&lt;a href="http://www.oreillynet.com/oreilly/bloggers/home.csp" target="_blank"&gt;O'Reilly Blogger Review Program&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Il libro di questo post è “&lt;a href="http://oreilly.com/catalog/9780735645561" target="_blank"&gt;Windows Communication Foundation 4 – Step by Step&lt;/a&gt;” di John Sharp.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-tPRxKJoEAqE/TgjK76tuvUI/AAAAAAAAA2o/N__a58PVkmc/wcf%2525204%252520step%252520by%252520step%252520cover%25255B4%25255D.jpg?imgmax=800"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 0px 5px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top: 0px; border-right: 0px; padding-top: 0px" title="wcf 4 step by step cover" border="0" alt="wcf 4 step by step cover" align="right" src="http://lh6.ggpht.com/-T9HZwmWtcbE/TgjLcZ3s2jI/AAAAAAAAA2s/FPx2rAw2rMI/wcf%2525204%252520step%252520by%252520step%252520cover_thumb%25255B1%25255D.jpg?imgmax=800" width="141" height="174" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="1"&gt;- Titolo: &lt;strong&gt;Windows Communication Foundation 4 Step By Step&lt;/strong&gt;       &lt;br /&gt;- &lt;/font&gt;&lt;font size="1"&gt;Autori: &lt;strong&gt;Sharp, John&lt;/strong&gt;       &lt;br /&gt;- &lt;/font&gt;&lt;font size="1"&gt;Editore: &lt;strong&gt;Microsoft Press&lt;/strong&gt;       &lt;br /&gt;- &lt;/font&gt;&lt;font size="1"&gt;Data di pubblicazione: &lt;strong&gt;07/12/2010&lt;/strong&gt;       &lt;br /&gt;- &lt;/font&gt;&lt;font size="1"&gt;Pagine: &lt;strong&gt;736&lt;/strong&gt;       &lt;br /&gt;- &lt;/font&gt;&lt;font size="1"&gt;ISBN13: &lt;strong&gt;9780735645561&lt;/strong&gt;       &lt;br /&gt;- &lt;/font&gt;&lt;font size="1"&gt;ISBN10: &lt;strong&gt;9780735645561&lt;/strong&gt;       &lt;br /&gt;-&lt;/font&gt;&lt;font size="1"&gt;Lingua: &lt;strong&gt;Inglese&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Quando ci si avvicina ad una nuova tecnologia, ed in particolare quando questa tecnologia è complessa come lo è Windows Communication Foundation, è importante, a mio modesto avviso, costruire delle solide basi teoriche, degli strumenti di base, che consentano, in seguito, di poter addentrarsi nei dettagli e nei casi particolari senza dover pagare dazio.&lt;/p&gt;  &lt;p&gt;Nel momento in cui si conosce la tecnologia (almeno le basi) è necessario, invece, avere a disposizione una reference guide in grado di fornire rapidamente le risposte cercate per poter essere immediatamente produttivi o per poter avere quell’input necessario a sbloccare un momento di difficoltà che ci blocca nel nostro lavoro quotidiano.&lt;/p&gt;  &lt;p&gt;Il libro che vi propongo è un libro della collana Step by Step di Microsoft Press, scritto da John Sharp (autore di altri linbri della serie Step by Step soprattutto su C#) ed è un ottimo strumento per chi si avvicina a WCF ed ha la necessità di costruire quel bagaglio di strumenti di base di cui parlavo in precedenza.&lt;/p&gt;  &lt;p&gt;Il libro non è una reference guide ma limitatamente ai concetti introduttivi di WCF 4.0 permette di avere rapidamente le informazioni cercate. Si tratta di un testo adatto a chi si trova per la prima volta alle prese con il framework WCF mentre lo è meno per chi conosce WCF e vuole approfondire l’argomento.&lt;/p&gt;  &lt;p&gt;Gli argomenti trattati non entrano quasi mai nello specifico ma si limitano a fornire una infarinatura di base (decisamente ben fatta, ma comunque di base) ma questa è, generalmente, una caratteristica della serie Step By Step e questo volume non è diverso dagli altri.&lt;/p&gt;  &lt;p&gt;La lettura scorre relativamente fluida (sempre considerando che si tratta di un libro pieno di vocaboli e termini tecnici), gli esempi sono sufficientemente spiegati ed il codice con gli esempi è scaricabile dal web.&lt;/p&gt;  &lt;p&gt;Se vogliamo trovare un punto a sfavore del libro, possiamo dire che la maggior parte del discorso è incentrato sulla visione web services di WCF e vengono poco presi in esame gli altri possibili bindings messi a disposizione da WCF. Credo che, però, questa sia una scelta dell’autore visto il taglio beginner del testo e la vastità del mondo bindings in WCF (di fatto, il primo utilizzo che si fa di WCF da parte di chi si avvicina al framework è quello di sostituire i “vecchi” web service XML). In ogni caso se avete la necessità di studiare o approfondire la visione WCF non WebServices, allora questo libro non fa al caso vostro.&lt;/p&gt;  &lt;p&gt;Per concludere, a mio modesto avviso, si tratta di un buon libro da cui non ci si deve però aspettare il ruolo di reference guide su WCF. Se abbiamo bisogno della “bibbia” di WCF, quseto non è il nostro libro, mentre se dobbiamo avvicinarci al mondo WCF, probabilmente si tratta della scelta giusta.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:ddf99023-a01e-44d8-ae8c-cec9e4705db7" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/o'reilly" rel="tag"&gt;o'reilly&lt;/a&gt;,&lt;a href="http://technorati.com/tags/windows+communication+foundation+4" rel="tag"&gt;windows communication foundation 4&lt;/a&gt;,&lt;a href="http://technorati.com/tags/wcf+4" rel="tag"&gt;wcf 4&lt;/a&gt;,&lt;a href="http://technorati.com/tags/step+by+step" rel="tag"&gt;step by step&lt;/a&gt;,&lt;a href="http://technorati.com/tags/libri" rel="tag"&gt;libri&lt;/a&gt;,&lt;a href="http://technorati.com/tags/books" rel="tag"&gt;books&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-6436978385840601955?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/6436978385840601955/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=6436978385840601955&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/6436978385840601955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/6436978385840601955'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/06/recensione-windows-communication.html' title='Recensione : Windows Communication Foundation 4 – Step by Step'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/-T9HZwmWtcbE/TgjLcZ3s2jI/AAAAAAAAA2s/FPx2rAw2rMI/s72-c/wcf%2525204%252520step%252520by%252520step%252520cover_thumb%25255B1%25255D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-7297292471263292141</id><published>2011-06-16T14:19:00.001+02:00</published><updated>2011-06-16T14:19:52.665+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><category scheme='http://www.blogger.com/atom/ns#' term='wp7'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone 7'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><title type='text'>Caliburn.Micro, NuGet e Visual Basic.Net</title><content type='html'>&lt;p&gt;In questi giorni mi trovo, per lavoro e per la community, a smanettare con &lt;a href="http://caliburnmicro.codeplex.com/" target="_blank"&gt;Caliburn.Micro&lt;/a&gt; (che tra le altre cose consiglio perché se ci riesco a lavorare io, significa che è veramente fatto bene).&lt;/p&gt;  &lt;p&gt;Ho notato che, agganciando il framework con NuGet all’interno di un progetto Visual Basic.Net, compaiono le classi di bootstrap, la shell e l’interfaccia che definisce la shell ma con la spiacevole controindicazione che sono in C#.&lt;/p&gt;  &lt;p&gt;Questo post ha lo scopo di spiegare come agganciare Caliburn con NuGet in un progetto VB.NET.&lt;/p&gt;  &lt;p&gt;Agganciare il framework con NuGet è semplicissimo (come lo è sempre utilizzando NuGet). In questo caso stiamo parlando di un progetto WPF, ma la procedura è identica per Silverlight o WP7.&lt;/p&gt;  &lt;p&gt;Per cominciare accertiamoci di aver installato ed abilitato NuGet tra le estensioni di VS (basta vedere se con il tasto destro su un progetto appare il menù contestuale “Add Library Package Reference…”).&lt;/p&gt;  &lt;p&gt;Lanciamo il comando precedente sul progetto in cui vogliamo aggiungere Caliburn.Micro e selezioniamo il package dalla maschera:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-iHOm-pN6yrQ/Tfn00RIuoAI/AAAAAAAAA1g/iiPsdJcxbRg/s1600-h/SNAGHTMLa8d9aa0%25255B5%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="SNAGHTMLa8d9aa0" border="0" alt="SNAGHTMLa8d9aa0" src="http://lh3.ggpht.com/-pQYl50kXkB8/Tfn01m3ravI/AAAAAAAAA1k/y5saD44peNA/SNAGHTMLa8d9aa0_thumb%25255B2%25255D.png?imgmax=800" width="400" height="227" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Il tasto install ci consente di istallare e configurare Caliburn.Micro.&lt;/p&gt;  &lt;p&gt;Al termine dell’installazione il progetto apparirà nel seguente modo:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-4KOZyVEoYFM/Tfn02dGLZWI/AAAAAAAAA1o/USKwVgNuLI0/s1600-h/image%25255B6%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-kOi1M0k8g8c/Tfn03DJejBI/AAAAAAAAA1s/xgZjrLM_XIc/image_thumb%25255B4%25255D.png?imgmax=800" width="250" height="208" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Rimuoviamo i file .cs e inseriamo gli omonimi file .vb con le classi che riporto di seguito:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;Appbootstrapper.vb&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:906719df-0cfb-4869-850c-bfa2e232aa9e" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 300px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Imports&lt;/span&gt; Caliburn.Micro&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;Imports&lt;/span&gt; System.ComponentModel.Composition.Hosting&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Imports&lt;/span&gt; System.ComponentModel.Composition.Primitives&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;  &lt;span style="color:#0000ff"&gt;Imports&lt;/span&gt;System.ComponentModel.Composition&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;AppBootstrapper&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Inherits&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Bootstrapper&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IShell&lt;/span&gt;)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Private&lt;/span&gt; container &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;CompositionContainer&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#008000"&gt;&amp;#39; &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#008000"&gt;&amp;#39; By default, we are configured to use MEF&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#008000"&gt;&amp;#39; &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Protected&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Overrides&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt; Configure()&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; catalog = &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;AggregateCatalog&lt;/span&gt;(AssemblySource.Instance.Select(&lt;span style="color:#0000ff"&gt;Function&lt;/span&gt;(x) &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;AssemblyCatalog&lt;/span&gt;(x)).OfType(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ComposablePartCatalog&lt;/span&gt;)())&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        container = &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;CompositionContainer&lt;/span&gt;(catalog)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; batch = &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;CompositionBatch&lt;/span&gt;()&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        batch.AddExportedValue(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IWindowManager&lt;/span&gt;)(&lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;WindowManager&lt;/span&gt;())&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        batch.AddExportedValue(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IEventAggregator&lt;/span&gt;)(&lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;EventAggregator&lt;/span&gt;())&lt;/li&gt; &lt;li&gt;        batch.AddExportedValue(container)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        batch.AddExportedValue(catalog)&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        container.Compose(batch)&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Protected&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Overrides&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt; GetInstance(service &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; System.&lt;span style="color:#2b91af"&gt;Type&lt;/span&gt;, key &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;String&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Object&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; contract = &lt;span style="color:#0000ff"&gt;If&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;String&lt;/span&gt;.IsNullOrEmpty(key), &lt;span style="color:#2b91af"&gt;AttributedModelServices&lt;/span&gt;.GetContractName(service), key)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; exports = container.GetExportedValues(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Object&lt;/span&gt;)(contract)&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;If&lt;/span&gt; exports.Count() &amp;gt; 0 &lt;span style="color:#0000ff"&gt;Then&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Return&lt;/span&gt; exports.First()&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;Throw&lt;/span&gt; &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Exception&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;String&lt;/span&gt;.Format(&lt;span style="color:#a31515"&gt;&amp;quot;Could not locate any instances of contract {0}.&amp;quot;&lt;/span&gt;, contract))&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Protected&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Overrides&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt; GetAllInstances(service &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; System.&lt;span style="color:#2b91af"&gt;Type&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; System.Collections.Generic.&lt;span style="color:#2b91af"&gt;IEnumerable&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Object&lt;/span&gt;)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;Return&lt;/span&gt; container.GetExportedValues(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Object&lt;/span&gt;)(&lt;span style="color:#2b91af"&gt;AttributedModelServices&lt;/span&gt;.GetContractName(service))&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Protected&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Overrides&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt; BuildUp(instance &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Object&lt;/span&gt;)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        container.SatisfyImportsOnce(instance)&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Class&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;u&gt;&lt;strong&gt;IShell.vb&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:3c67778a-8a2a-4c36-8f92-06ad4f5d57cb" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 300px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Interface&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IShell&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Interface&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;u&gt;&lt;strong&gt;ShellViewModel.vb&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:9677c0be-f5f7-47cb-917d-974bbd38cedc" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 300px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Imports&lt;/span&gt; System.ComponentModel.Composition&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;Export&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color:#2b91af"&gt;IShell&lt;/span&gt;))&amp;gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ShellViewModel&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Implements&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IShell&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Class&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Le classi possono ovviamente essere personalizzate sia nel comportamento che nei namespace.&lt;/p&gt;  &lt;p&gt;Con l’inserimento di queste classi, il progetto assume la forma:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-csqYsN-V30g/Tfn03qC-ccI/AAAAAAAAA1w/O_bF3mWkg08/s1600-h/image%25255B11%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/-0To6o2O09Rg/Tfn04vCZBTI/AAAAAAAAA10/pJufLtPfKuk/image_thumb%25255B7%25255D.png?imgmax=800" width="250" height="214" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Per la configurazione dello startup dell’applicazione fate riferimento alla documentazione di Caliburn.Micro (&lt;a title="http://caliburnmicro.codeplex.com/wikipage?title=Nuget&amp;amp;referringTitle=Documentation" href="http://caliburnmicro.codeplex.com/wikipage?title=Nuget&amp;amp;referringTitle=Documentation"&gt;http://caliburnmicro.codeplex.com/wikipage?title=Nuget&amp;amp;referringTitle=Documentation&lt;/a&gt;) che spiega passo passo cosa fare.&lt;/p&gt;  &lt;p&gt;Ricordatevi di fare attenzione ai namespace della ShellView e della ShellViewModel per fare in modo che Caliburn riesca ad associarle.&lt;/p&gt;  &lt;p&gt;In particolare è necessario prestare attenzione alla ShellView. Il package NuGet, infatti, crea il seguente Xaml:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:e441ef6d-be92-4646-8711-dfb015655af7" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 300px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Window&lt;/span&gt;&lt;span style="color:#ff0000"&gt; x&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#ff0000"&gt;Class&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;NomeProgetto.ShellView&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;       &lt;span style="color:#ff0000"&gt; xmlns&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;       &lt;span style="color:#ff0000"&gt; xmlns&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#ff0000"&gt;x&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Grid&lt;/span&gt;&lt;span style="color:#ff0000"&gt; Background&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;White&amp;quot;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;TextBlock&lt;/span&gt;&lt;span style="color:#ff0000"&gt; Text&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;Hello Caliburn Micro!&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                  &lt;span style="color:#ff0000"&gt; VerticalAlignment&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;Center&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                  &lt;span style="color:#ff0000"&gt; HorizontalAlignment&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;Center&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                  &lt;span style="color:#ff0000"&gt; FontSize&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;20&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Grid&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Window&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Come possiamo osservare la classe ShellView si trova nel namespace “NomeProgetto.ShellView”, mentre la ShellViewModel (così come definita in precedenza) nel namespace root. In questo caso la convenzione che sta alla base del funzionamento di Caliburn non è in grado di associare View e ViewModel ed otterrete:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-eSBcTbcYyhM/Tfn05PV60EI/AAAAAAAAA14/vLgZqOB9W1Q/s1600-h/SNAGHTMLaf22a05%25255B5%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="SNAGHTMLaf22a05" border="0" alt="SNAGHTMLaf22a05" src="http://lh5.ggpht.com/-vgPlNjaDC5k/Tfn05t39GjI/AAAAAAAAA18/QmttdnuBbd8/SNAGHTMLaf22a05_thumb%25255B2%25255D.png?imgmax=800" width="300" height="48" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Per risolvere il problema è sufficiente togliere il namespace davanti al nome della classe nella view.&lt;/p&gt;  &lt;p&gt;&lt;iframe style="padding-bottom: 0px; background-color: #fcfcfc; padding-left: 0px; width: 98px; padding-right: 0px; height: 115px; padding-top: 0px" title="Preview" marginheight="0" src="http://cid-4aab693689223ee9.office.live.com/embedicon.aspx/Public/Allegati%20Blog/TestCaliburnMicroWPF.zip" frameborder="0" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;   &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:49a2f2e7-fe13-48f3-8faa-2017ce83f522" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/Caliburn.Microsoft+Solver+Foundation" rel="tag"&gt;Caliburn.Microsoft Solver Foundation&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Caliburn" rel="tag"&gt;Caliburn&lt;/a&gt;,&lt;a href="http://technorati.com/tags/NuGet" rel="tag"&gt;NuGet&lt;/a&gt;,&lt;a href="http://technorati.com/tags/VB.NET" rel="tag"&gt;VB.NET&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Visual+Basic" rel="tag"&gt;Visual Basic&lt;/a&gt;,&lt;a href="http://technorati.com/tags/bootstrapper" rel="tag"&gt;bootstrapper&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-7297292471263292141?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/7297292471263292141/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=7297292471263292141&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/7297292471263292141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/7297292471263292141'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/06/caliburnmicro-nuget-e-visual-basicnet.html' title='Caliburn.Micro, NuGet e Visual Basic.Net'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/-pQYl50kXkB8/Tfn01m3ravI/AAAAAAAAA1k/y5saD44peNA/s72-c/SNAGHTMLa8d9aa0_thumb%25255B2%25255D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-1937535230391605115</id><published>2011-06-07T09:24:00.001+02:00</published><updated>2011-06-07T09:24:07.469+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='Annunci'/><category scheme='http://www.blogger.com/atom/ns#' term='Code Contracts'/><title type='text'>Rilasciata una nuova versione dei Code Contracts</title><content type='html'>&lt;p&gt;Il 2 giugno è stata rilasciata la versione 1.4.40602.0 dei Code Contracts.&lt;/p&gt;  &lt;p&gt;Potete scaricare i due pacchetti di installazione dal sito ufficiale (&lt;a href="http://research.microsoft.com/en-us/projects/contracts/" target="_blank"&gt;link&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;Nel sito trovate anche l’extension per Visual Studio (accessibile anche attraverso Extension Manager) che permette di visualizzare nell’ambiente di sviluppo il tooltip con gli eventuali contratti definiti.&lt;/p&gt;  &lt;p&gt;Le novità di questa versione sono relative ad ottimizzazioni e poco più in particolare riguerdanti lo Static Checker.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:bb47a7ea-723b-4968-911a-8fd35c0469a1" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/code+contracts" rel="tag"&gt;code contracts&lt;/a&gt;,&lt;a href="http://technorati.com/tags/rise" rel="tag"&gt;rise&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-1937535230391605115?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/1937535230391605115/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=1937535230391605115&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/1937535230391605115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/1937535230391605115'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/06/rilasciata-una-nuova-versione-dei-code.html' title='Rilasciata una nuova versione dei Code Contracts'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-2645953232138135072</id><published>2011-06-01T16:17:00.001+02:00</published><updated>2011-06-01T16:17:05.205+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Annunci'/><category scheme='http://www.blogger.com/atom/ns#' term='Varie'/><category scheme='http://www.blogger.com/atom/ns#' term='DomusDotNet'/><category scheme='http://www.blogger.com/atom/ns#' term='Community'/><title type='text'>DomusDotNet 1.0 Unleashed è fuori!!!</title><content type='html'>&lt;p&gt;In qualità di curatore e appartenente alla community &lt;a href="http://www.domusdotnet.org" target="_blank"&gt;DomusDotNet&lt;/a&gt; sono orgoglioso di comunicarvi che è stato pubblicato il libro:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.lulu.com/commerce/index.php?fBuyContent=10679401" target="_blank"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Copertina_web" border="0" alt="Copertina_web" src="http://lh5.ggpht.com/-xKsR3gDDAIo/TeZJ37v_OSI/AAAAAAAAA1c/P-kIBEvkkb4/Copertina_web%25255B7%25255D.jpg?imgmax=800" width="204" height="310" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Il testo nasce per festeggiare il primo anno di vita della community romana.&lt;/p&gt;  &lt;p&gt;E’ un estratto di articoli e pillole pubblicate durante il primo anno di vita del portale.&lt;/p&gt;  &lt;p&gt;Il libro è in vendita su &lt;a href="http://www.lulu.com" target="_blank"&gt;Lulu.com&lt;/a&gt;.&lt;/p&gt; &lt;a href="http://www.lulu.com/commerce/index.php?fBuyContent=10679401"&gt;&lt;img style="margin: 0px auto 5px; display: block; float: none" border="0" alt="Support independent publishing: Buy this book on Lulu." src="http://static.lulu.com/images/services/buy_now_buttons/it/book.gif?20110531125308" /&gt;&lt;/a&gt;  &lt;br /&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:ceb0854b-ef36-47f8-bf3d-2b77cd6cfdfd" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/domusdotnet" rel="tag"&gt;domusdotnet&lt;/a&gt;,&lt;a href="http://technorati.com/tags/domusdotnet+1.0+unleashed" rel="tag"&gt;domusdotnet 1.0 unleashed&lt;/a&gt;,&lt;a href="http://technorati.com/tags/pubblicazione" rel="tag"&gt;pubblicazione&lt;/a&gt;,&lt;a href="http://technorati.com/tags/lulu.com" rel="tag"&gt;lulu.com&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-2645953232138135072?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/2645953232138135072/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=2645953232138135072&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/2645953232138135072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/2645953232138135072'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/06/domusdotnet-10-unleashed-e-fuori.html' title='DomusDotNet 1.0 Unleashed è fuori!!!'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/-xKsR3gDDAIo/TeZJ37v_OSI/AAAAAAAAA1c/P-kIBEvkkb4/s72-c/Copertina_web%25255B7%25255D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-2599893777286829232</id><published>2011-05-31T13:04:00.001+02:00</published><updated>2011-05-31T13:04:45.341+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Annunci'/><category scheme='http://www.blogger.com/atom/ns#' term='Varie'/><title type='text'>Certificare gratuitamente le proprie applicazioni che utilizzano SQL Server 2008 R2</title><content type='html'>&lt;p&gt;Vorrei segnalarvi questo &lt;a href="http://blogs.msdn.com/b/vitolo/archive/2011/05/28/test-di-certificazione-self-service-e-gratuito-per-le-applicazioni-che-usano-sql-server-2008-r2.aspx" target="_blank"&gt;post&lt;/a&gt; di Vito Lorusso riguardante la possibilità di certificare gratuitamente le proprie applicazioni che utilizzano SQL Server 2008 R2.&lt;/p&gt;  &lt;p&gt;La certificazione è “self-service” ed gratuita, quindi mi sembra un’ottima opportunità da sfruttare.&lt;/p&gt;  &lt;p&gt;Date una lettura al post e sarà tutto più chiaro!!!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:6a9b9645-87d2-435e-9269-510185f66071" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/msdn" rel="tag"&gt;msdn&lt;/a&gt;,&lt;a href="http://technorati.com/tags/certificazione+sql+server+2008+r2" rel="tag"&gt;certificazione sql server 2008 r2&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-2599893777286829232?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/2599893777286829232/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=2599893777286829232&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/2599893777286829232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/2599893777286829232'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/05/certificare-gratuitamente-le-proprie.html' title='Certificare gratuitamente le proprie applicazioni che utilizzano SQL Server 2008 R2'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-7940234364726270178</id><published>2011-05-30T08:00:00.000+02:00</published><updated>2011-05-30T08:00:10.531+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2010'/><title type='text'>La classe Lazy(Of T)</title><content type='html'>&lt;p&gt;Una interessante classe inserita nella versione 4.0 del framework è la Lazy(Of T).&lt;/p&gt;  &lt;p&gt;Si tratta di un generic il cui scopo è quello di permettere la creazione di oggetti differita.&lt;/p&gt;  &lt;p&gt;Uno scenario tipico che può capitare quando sviluppiamo è quello di avere una nostra classe che occupa molte risorse (memoria, accesso a database, accesso a filesystem, e via discorrendo) e desiderare che tale classe venga istanziata solo quando serve.&lt;/p&gt;  &lt;p&gt;In più, alcune volte, sarebbe anche comodo poter avere un accesso concorrente a tale istanza.&lt;/p&gt;  &lt;p&gt;Se il primo requisito è facilmente implementabile con un manciata di righe di codice, il secondo non è altrettanto banale.&lt;/p&gt;  &lt;p&gt;La classe Lazy(Of T) ci viene in aiuto perché è, di fatto, un wrapper che gestisce la creazione dell’istanza del tipo T e il thread safe in maniera nativa.&lt;/p&gt;  &lt;p&gt;La classe Lazy prevede una serie di costruttori il più semplice dei quali non prevede argomenti. Sia MyClass la nostra classe di cui vogliamo gestire la creazione differita:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:cd3aa315-97d0-4c02-9874-1a3a4a6be726" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 300px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;[MyClass]&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt; &lt;span style="color:#0000ff"&gt;New&lt;/span&gt;()&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#2b91af"&gt;ConsoleHelper&lt;/span&gt;.WriteConsole(&lt;span style="color:#a31515"&gt;&amp;quot;MyClass - New&amp;quot;&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt; &lt;span style="color:#0000ff"&gt;New&lt;/span&gt;(i &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Integer&lt;/span&gt;)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#2b91af"&gt;ConsoleHelper&lt;/span&gt;.WriteConsole(&lt;span style="color:#0000ff"&gt;String&lt;/span&gt;.Format(&lt;span style="color:#a31515"&gt;&amp;quot;MyClass - New with {0}&amp;quot;&lt;/span&gt;, i))&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt; MyMethod()&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#2b91af"&gt;ConsoleHelper&lt;/span&gt;.WriteConsole(&lt;span style="color:#a31515"&gt;&amp;quot;MyClass - MyMethod&amp;quot;&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Class&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;La classe ConsoleHelper permette di utilizzare la Console per scrivere dei messaggi a cui viene anteposto un timestamp. Nei costruttori della classe MyClass ho inserito la scrittura dei messaggi per poter, effettivamente, capire quando il costruttore stesso viene invocato.&lt;/p&gt;  &lt;p&gt;Prendiamo in esame il seguente pezzo di codice:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:ed73f5e3-c7e9-4191-8c71-f527b87a8497" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 300px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt; Main()&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#2b91af"&gt;ConsoleHelper&lt;/span&gt;.WriteConsole(&lt;span style="color:#a31515"&gt;&amp;quot;CreateSimpleLazy - Before&amp;quot;&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; lazy = CreateSimpleLazy()&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#2b91af"&gt;ConsoleHelper&lt;/span&gt;.WriteConsole(&lt;span style="color:#a31515"&gt;&amp;quot;CreateSimpleLazy - After&amp;quot;&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;    Threading.&lt;span style="color:#2b91af"&gt;Thread&lt;/span&gt;.Sleep(1000)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    lazy.Value.MyMethod()&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#2b91af"&gt;Console&lt;/span&gt;.ReadLine()&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;e il seguente:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:3fd60e18-e69d-4297-8163-c0938c0a9f77" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 300px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt; CreateSimpleLazy() &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Lazy&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af"&gt;[MyClass]&lt;/span&gt;)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; retVal = &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Lazy&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af"&gt;[MyClass]&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Return&lt;/span&gt; retVal&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Il metodo CreateSimpleLazy altro non fa che istanziare un oggetto di classe Lazy(Of MyClass) e restituirlo al chiamante.&lt;/p&gt;  &lt;p&gt;Nel metodo chiamante eseguiamo la chiamata al metodo MyMethod della MyClass in maniera differita (cioè solo dopo aver atteso 1 secondo dall’istanziazione dell’oggetto Lazy).&lt;/p&gt;  &lt;p&gt;Il risultato a video è il seguente:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-tUwQwQkyXH4/TeKszMQolrI/AAAAAAAAA1M/fPfNKtgJ10A/s1600-h/SNAGHTML122e0a4b%25255B4%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="SNAGHTML122e0a4b" border="0" alt="SNAGHTML122e0a4b" src="http://lh6.ggpht.com/-P4joszGUbtM/TeKsz6gM-lI/AAAAAAAAA1Q/ypElU9L9yKg/SNAGHTML122e0a4b_thumb%25255B1%25255D.png?imgmax=800" width="404" height="174" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Come possiamo osservare il costruttore della classe MyClass (riga “MyClass – new”) viene richiamato solo nel momento in cui si esegue l’istruzione lazy.Value.MyMethod e non quando viene creato l’oggetto Lazy.&lt;/p&gt;  &lt;p&gt;In effetti la classe Lazy espone l’istanza della classe che wrappa tramite la proprietà Value all’interno della quale viene gestito l’effettivo richiamo del costruttore. Se l’oggetto wrappato non è stato ancora istanziato, nel momento in cui viene utilizzata la proprietà Value, viene richiamato il costruttore di default della classe wrappata.&lt;/p&gt;  &lt;p&gt;Ma se la nostra classe non prevede un costruttore di default?&lt;/p&gt;  &lt;p&gt;In questo caso ci viene in aiuto un altro costruttore della Lazy la cui sintassi è la seguente:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:b4a34944-78ac-4d58-a6ad-0a75453d26e2" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 300px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt; &lt;span style="color:#0000ff"&gt;New&lt;/span&gt;(&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;              valueFactory &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; Func(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; T)&lt;/li&gt; &lt;li&gt;              )&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Questo costruttore prevede che si possa utilizzare una Func(Of T) come parametro (ad esempio una lambda expression), all’interno della quale creeremo l’istanza della nostra classe e la restituiremo alla Lazy che la gestirà in maniera del tutto analoga al caso precedente:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:7d8606bd-746b-44c2-9f7b-b3abdac38544" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 300px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt; Main()&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#2b91af"&gt;ConsoleHelper&lt;/span&gt;.WriteConsole(&lt;span style="color:#a31515"&gt;&amp;quot;CreateParametricLazy - Before&amp;quot;&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; parametricLazy = CreateParametricLazy(100)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#2b91af"&gt;ConsoleHelper&lt;/span&gt;.WriteConsole(&lt;span style="color:#a31515"&gt;&amp;quot;CreateParametricLazy - After&amp;quot;&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;    Threading.&lt;span style="color:#2b91af"&gt;Thread&lt;/span&gt;.Sleep(1000)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    parametricLazy.Value.MyMethod()&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#2b91af"&gt;Console&lt;/span&gt;.ReadLine()&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;In questo caso utilizziamo il costruttore della classe MyClass che prevede un parametro intero:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:ee96d64a-aae0-4b2f-a703-063db5c94b03" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 300px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt; CreateParametricLazy(i &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Integer&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Lazy&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af"&gt;[MyClass]&lt;/span&gt;)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; retVal = &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Lazy&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af"&gt;[MyClass]&lt;/span&gt;)(&lt;span style="color:#0000ff"&gt;Function&lt;/span&gt;()&lt;/li&gt; &lt;li&gt;                                            &lt;span style="color:#0000ff"&gt;Return&lt;/span&gt; &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;[MyClass]&lt;/span&gt;(i)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                                        &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Return&lt;/span&gt; retVal&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Il risultato che otteniamo è:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-Djc_vDuWk74/TeKs0ezcy2I/AAAAAAAAA1U/1bCs-wxwCUI/s1600-h/SNAGHTML1236d622%25255B4%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="SNAGHTML1236d622" border="0" alt="SNAGHTML1236d622" src="http://lh6.ggpht.com/-Umvvv3nLBHA/TeKs1HMfWQI/AAAAAAAAA1Y/_Ca2j4LWROw/SNAGHTML1236d622_thumb%25255B1%25255D.png?imgmax=800" width="404" height="141" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;La classe Lazy, per default, ThreadSafe cioè permette accesso contemporaneo (e sicuro) alla proprietà Value da thread differenti. La modalità di default è la LazyThreadSafetyMode .ExecutionAndPubblication che prevede che un solo thread possa eseguire l’inizializzazione di T ma che tale istanza sia poi disponibili a tutti i thread che la richiedono.   &lt;br /&gt;Questo significa che se più thread tentano di eseguire l’inizializzazione della classe T, uno solo di questi ha accesso al costruttori e gli altri attendono l’effettiva creazione della stessa.&lt;/p&gt;  &lt;p&gt;Questo fatto comporta che se la nostra classe utilizza dei meccanismi di thread safe interni e questi non lavorano correttamente, si potrebbero creare dei dedlock da cui non si può uscire.&lt;/p&gt;  &lt;p&gt;Possiamo stabilire il comportamento della classe Lazy rispetto all’accesso contemporaneo con opportuni costruttori della stessa che ci permettono di avere un’istanza non ThreadSafe oppure di stabilire esattamente il LazyThreadSafetyMode da utilizzare. I possibili valori di questa enumerazione sono:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;None&lt;/strong&gt; : non thread safe;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;ExecutionAndPubblication&lt;/strong&gt;: un unico thread può inizializzare T la cui istanza viene utilizzata da tutti i thread. E’ una modalità ThreadSafe;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;PublicationOnly&lt;/strong&gt; : più thread possono inizializzare T, il primo che riesce rende l’istanza disponibile e viene utilizzata dagli altri. Eventuali altre istanze vengono scartate. E’ una modalità ThreadSafe.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;La tipologia di ThreadSafe scelta influenza anche il comportamento della classe Lazy rispetto alle eventuali eccezioni generate dal costruttore della classe contenuta.&lt;/p&gt;  &lt;p&gt;Se stiamo utilizzando il costruttore di default, l’eventuale eccezione generata viene immediatamente sollevata (a prescindere da quale valore di LazyThreadSafetyMode&amp;#160; abbiamo scelto) mentre se stiamo utilizzando un costruttore con parametri l’eventuale eccezione generata si comporta in maniera differente in base al valore di LazyThreadSafetyMode scelto.&lt;/p&gt;  &lt;p&gt;Se si è scelto PublicationOnly (valore di default) le eccezioni vengono immediatamente generate nel costruttore della Lazy (come nel caso precedente), mentre se stiamo utilizzando uno delle altre sue modalità di LazyThreadSafetyMode, allora le eccezioni vengono salvate in cache e proposte nel momento in cui viene invocata la proprietà Value.&lt;/p&gt;  &lt;p&gt;Infine, la classe Lazy(Of T) prevede la proprietà IsValueCreated che permette di conoscere se l’istanza di T è stata già creata o meno.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:862d67f7-3a80-4347-b478-bfb36958360a" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/Lazy" rel="tag"&gt;Lazy&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Lazy(Of+T)" rel="tag"&gt;Lazy(Of T)&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Framework+4.0" rel="tag"&gt;Framework 4.0&lt;/a&gt;,&lt;a href="http://technorati.com/tags/.NET+Framework+4.0" rel="tag"&gt;.NET Framework 4.0&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Lazy+initialization" rel="tag"&gt;Lazy initialization&lt;/a&gt;,&lt;a href="http://technorati.com/tags/inizializzazione+differita" rel="tag"&gt;inizializzazione differita&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-7940234364726270178?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/7940234364726270178/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=7940234364726270178&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/7940234364726270178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/7940234364726270178'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/05/la-classe-lazyof-t.html' title='La classe Lazy(Of T)'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/-P4joszGUbtM/TeKsz6gM-lI/AAAAAAAAA1Q/ypElU9L9yKg/s72-c/SNAGHTML122e0a4b_thumb%25255B1%25255D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-1723898614135683556</id><published>2011-05-24T16:42:00.001+02:00</published><updated>2011-05-24T16:42:35.460+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wp7'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone 7'/><title type='text'>Disponibili i nuovi tools di sviluppo per WP7</title><content type='html'>&lt;p&gt;Microsoft ha annunciato il rilascio nelle prossime ore dei tools (in beta) per lo sviluppo con le nuove funzionalità previste per l'aggiornamento denominato &amp;quot;Mango&amp;quot;.&lt;/p&gt;  &lt;p&gt;Maggiori informazioni relativamente alle funzionalità introdotte con questa versione sono disponibili all'indirizzo &lt;a href="http://www.microsoft.com/presspass/presskits/windowsphone/" target="_blank"&gt;http://www.microsoft.com/presspass/presskits/windowsphone/&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;I tools saranno scaricabili dall'hub degli sviluppatori all'indirizzo &lt;a href="http://create.msdn.com/en-us/resources/downloads" target="_blank"&gt;http://create.msdn.com/en-us/resources/downloads&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;LA documentazione relativa alle nuove API è già disponibile all'indirizzo &lt;a href="http://msdn.microsoft.com/en-us/library/hh237343%28v=VS.96%29.aspx" target="_blank"&gt;http://msdn.microsoft.com/en-us/library/hh237343%28v=VS.96%29.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:06878a01-e4d1-4540-bea7-2f237f44f776" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/WP7" rel="tag"&gt;WP7&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Windows+phone+7" rel="tag"&gt;Windows phone 7&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Mango" rel="tag"&gt;Mango&lt;/a&gt;,&lt;a href="http://technorati.com/tags/wp7+tools" rel="tag"&gt;wp7 tools&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-1723898614135683556?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/1723898614135683556/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=1723898614135683556&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/1723898614135683556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/1723898614135683556'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/05/disponibili-i-nuovi-tools-di-sviluppo.html' title='Disponibili i nuovi tools di sviluppo per WP7'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-8558632399996151595</id><published>2011-05-23T20:53:00.001+02:00</published><updated>2011-05-23T20:53:53.608+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Varie'/><title type='text'>DDD NLayered .NET 4.0 Architecture Guide</title><content type='html'>&lt;p&gt;Vi segnalo un interessante ebook redatto dal Platform Architecture Team MSDN riguardante l’architettura DDD NLayered.&lt;/p&gt;  &lt;p&gt;Potete scaricare il formato ebook e gli esempi all’indirizzo&lt;/p&gt;  &lt;p&gt;&lt;a title="http://msdn.microsoft.com/es-es/architecture/en/" href="http://msdn.microsoft.com/es-es/architecture/en/"&gt;http://msdn.microsoft.com/es-es/architecture/en/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:c9849542-b099-4928-94d7-a9210397bb99" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/ddd+nlayered" rel="tag"&gt;ddd nlayered&lt;/a&gt;,&lt;a href="http://technorati.com/tags/ddd" rel="tag"&gt;ddd&lt;/a&gt;,&lt;a href="http://technorati.com/tags/architecture" rel="tag"&gt;architecture&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-8558632399996151595?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/8558632399996151595/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=8558632399996151595&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/8558632399996151595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/8558632399996151595'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/05/ddd-nlayered-net-40-architecture-guide.html' title='DDD NLayered .NET 4.0 Architecture Guide'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-2708072793044325397</id><published>2011-04-29T10:07:00.001+02:00</published><updated>2011-04-29T10:07:42.626+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Team Foundation Server'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><title type='text'>TFS2010 Object Model: Collegarsi ad un server TFS 2008 tramite l’object model di TFS 2010</title><content type='html'>&lt;p&gt;Questo post funge da compendio a tutti i post già pubblicati sull’object model di Team Foundation Server 2010 e agli articoli pubblicati su DomuDotNet (&lt;a href="http://www.domusdotnet.org/articoli/tfs2010-object-model---introduzione-server-collezioni-progetti.aspx" target="_blank"&gt;link&lt;/a&gt;, &lt;a href="http://www.domusdotnet.org/articoli/tfs2010-object-model---anatomia-di-un-work-item.aspx" target="_blank"&gt;link&lt;/a&gt;, &lt;a href="http://www.domusdotnet.org/articoli/tfs2010-object-model---alla-ricerca-del-work-item-perduto.aspx" target="_blank"&gt;link&lt;/a&gt;, &lt;a href="http://www.domusdotnet.org/articoli/tfs2010-object-model---gestione-dei-workitems.aspx" target="_blank"&gt;link&lt;/a&gt;, &lt;a href="http://www.domusdotnet.org/articoli/tfs2010-object-model-gestione-versioning.aspx" target="_blank"&gt;link&lt;/a&gt; e &lt;a href="http://www.domusdotnet.org/articoli/tfs-2010-object-model---utilizzo-dei-workspaces.aspx" target="_blank"&gt;link&lt;/a&gt;) e ha lo scopo di mostrare come sia possibile utilizzare l’object model di TFS per accedere ad un server TFS 2008.&lt;/p&gt;  &lt;p&gt;L’object model di Team Foundation Server 2010 è completamente compatibile con il server 2008 e, in particolare, l’unica differenza sostanziale è la modalità con cui si recupera le due istanze fondamentali per l’accesso al server: TfsConfigurationServer e TfsTeamProjectCollection.&lt;/p&gt;  &lt;p&gt;Cominciamo con il prendere in esame il recupero dell’istanza di TfsConfigurationServer e per fare ciò vediamo come si presenta la finestra di inserimento di un nuovo server nelle due versioni del team explorer.&lt;/p&gt;  &lt;p&gt;Nella versione 2010 abbiamo:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_W_Iqke_Yzoc/TbpxxijJDZI/AAAAAAAAA08/TOwgSbH3AMM/s1600-h/SNAGHTML7d931d4.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="SNAGHTML7d931d" border="0" alt="SNAGHTML7d931d" src="http://lh4.ggpht.com/_W_Iqke_Yzoc/TbpxyaTMUiI/AAAAAAAAA1A/yKfLHTyMIdE/SNAGHTML7d931d_thumb1.png?imgmax=800" width="404" height="259" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;mentre nella versione 2008:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_W_Iqke_Yzoc/Tbpxy5Ml8YI/AAAAAAAAA1E/O-ll3gB5lPE/s1600-h/SNAGHTML7d32484.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="SNAGHTML7d3248" border="0" alt="SNAGHTML7d3248" src="http://lh6.ggpht.com/_W_Iqke_Yzoc/TbpxzZAacxI/AAAAAAAAA1I/g6NSQ4h5_jQ/SNAGHTML7d3248_thumb1.png?imgmax=800" width="404" height="222" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;La differenza tra le due maschere è la presenza della proprietà Path (nella 2010) che fa si che, a parità di nome server, l’url sia leggermente diverso ed in particolare:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;http://NomeMioServer:8080/tfs&lt;/strong&gt; nella versione 2010; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;http://NomeMioServer:8080&lt;/strong&gt; nella versione 2008. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Questa osservazione ci permette facilmente di recuperare un istanza di TfsConfigurationServer utilizzando, ad esempio, la factory TfsConfigurationServerFactory:&lt;/p&gt;  &lt;p&gt;   &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:93cd37ba-dfe1-48b2-b948-aaee745bb59c" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 300px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt; GetTFSConfigurationServer(serverName &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;String&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;TfsConfigurationServer&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#2b91af"&gt;Contract&lt;/span&gt;.Requires(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ArgumentNullException&lt;/span&gt;)(serverName &lt;span style="color:#0000ff"&gt;IsNot&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Nothing&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; retval &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;TfsConfigurationServer&lt;/span&gt; = &lt;span style="color:#0000ff"&gt;Nothing&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Try&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        retval = &lt;span style="color:#2b91af"&gt;TfsConfigurationServerFactory&lt;/span&gt;.GetConfigurationServer(GetServerUri(serverName),&lt;/li&gt; &lt;li&gt;                                                                      &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;UICredentialsProvider&lt;/span&gt;())&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Catch&lt;/span&gt; ex &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Exception&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;Throw&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Try&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Return&lt;/span&gt; retval&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/p&gt;  &lt;p&gt;Il metodo GetServerUri non fa altro che generare la classe Uri corrispondente al server TFS 2008 a partire dal nome del server (http://NomeServer:8080/):&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:768bc55b-6f2f-4144-9b95-e9459538bb97" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 300px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt; GetServerUri(serverName &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;String&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Uri&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#2b91af"&gt;Contract&lt;/span&gt;.Requires(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ArgumentNullException&lt;/span&gt;)(serverName &lt;span style="color:#0000ff"&gt;IsNot&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Nothing&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; tfsUrl = &lt;span style="color:#0000ff"&gt;String&lt;/span&gt;.Format(&lt;span style="color:#a31515"&gt;&amp;quot;http://{0}:8080&amp;quot;&lt;/span&gt;, serverName)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Return&lt;/span&gt; &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Uri&lt;/span&gt;(tfsUrl)&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Per quanto riguarda le project collection, TFS 2008 non prevede queste entità. Come è possibile, allora, recuperare un’istanza di TfsTeamProjectCollection? Abbiamo, infatti, bisogno della TfsTeamProjectCollection per poter accedere a servizi come WorkItemStore (gestione dell’item tracking) o VersionControlServer (gestione del version control).&lt;/p&gt;  &lt;p&gt;Nella realtà, proprio la non esistenza dlle collections fa si che l’intero server TFS sia visto come un unica collection il cui Url è, proprio, &lt;a href="http://NomeServer:8080/"&gt;http://NomeServer:8080/&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Per questo motivo possiamo scrivere:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:2c582d1a-8f0f-4b55-ab3c-e2387c60828e" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 300px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt; GetTeamProjectCollection(serverName &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;String&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;TfsTeamProjectCollection&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#2b91af"&gt;Contract&lt;/span&gt;.Requires(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ArgumentNullException&lt;/span&gt;)(serverName &lt;span style="color:#0000ff"&gt;IsNot&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Nothing&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; retval &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;TfsTeamProjectCollection&lt;/span&gt; = &lt;span style="color:#0000ff"&gt;Nothing&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Try&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        retval = &lt;span style="color:#2b91af"&gt;TfsTeamProjectCollectionFactory&lt;/span&gt;.GetTeamProjectCollection(GetServerUri(serverName),&lt;/li&gt; &lt;li&gt;                                                        &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;UICredentialsProvider&lt;/span&gt;())&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        retval.EnsureAuthenticated()&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Catch&lt;/span&gt; ex &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Exception&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;Throw&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Try&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Return&lt;/span&gt; retval&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Una volta recuperata la TfsProjectCollection possiamo accedere ai servizi di work item tracking, version control etc., etc. in maniera analoga a quanto facciamo usualmente con le collection di TFS 2010.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:06bbe601-91ee-46d1-8de8-cf2ce016a601" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/tfs+2008" rel="tag"&gt;tfs 2008&lt;/a&gt;,&lt;a href="http://technorati.com/tags/tfs+2010+object+model" rel="tag"&gt;tfs 2010 object model&lt;/a&gt;,&lt;a href="http://technorati.com/tags/tfs+2008+object+model" rel="tag"&gt;tfs 2008 object model&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-2708072793044325397?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/2708072793044325397/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=2708072793044325397&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/2708072793044325397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/2708072793044325397'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/04/tfs2010-object-model-collegarsi-ad-un.html' title='TFS2010 Object Model: Collegarsi ad un server TFS 2008 tramite l’object model di TFS 2010'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_W_Iqke_Yzoc/TbpxyaTMUiI/AAAAAAAAA1A/yKfLHTyMIdE/s72-c/SNAGHTML7d931d_thumb1.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-1267576274153911951</id><published>2011-04-28T21:10:00.001+02:00</published><updated>2011-04-28T21:10:13.415+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Annunci'/><category scheme='http://www.blogger.com/atom/ns#' term='Varie'/><title type='text'>Rilasciato Microsoft Solver Foundation</title><content type='html'>&lt;p&gt;Vi segnalo che Microsoft DevLabs ha pubblicato, martedì scorso, &lt;a href="http://msdn.microsoft.com/en-us/devlabs/hh145003.aspx" target="_blank"&gt;Microsoft Solver Foundation&lt;/a&gt; un framework per costruire ed ottimizzare modelli matematici.&lt;/p&gt;  &lt;p&gt;Vi segnalo anche il &lt;a href="http://blogs.msdn.com/b/somasegar/archive/2011/04/26/solver-foundation-on-devlabs.aspx" target="_blank"&gt;post&lt;/a&gt; di Somasegar in cui viene annunciato il lancio del framework e riportati un paio di esempi pratici.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:68d264a8-ee6e-4bde-8d8d-1a8f70f26239" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/Microsoft+Solver+Foundation" rel="tag"&gt;Microsoft Solver Foundation&lt;/a&gt;,&lt;a href="http://technorati.com/tags/DevLabs" rel="tag"&gt;DevLabs&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-1267576274153911951?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/1267576274153911951/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=1267576274153911951&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/1267576274153911951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/1267576274153911951'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/04/rilasciato-microsoft-solver-foundation.html' title='Rilasciato Microsoft Solver Foundation'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-4459596339044524881</id><published>2011-04-28T20:57:00.001+02:00</published><updated>2011-04-28T20:57:49.214+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Azure'/><title type='text'>Provate Azure per un mese gratuitamente!!!</title><content type='html'>&lt;p&gt;Vorrei riportarvi il &lt;a href="http://blogs.msdn.com/b/bharry/archive/2011/04/27/free-azure-trial.aspx" target="_blank"&gt;post&lt;/a&gt; di Brian Harry che vi da la possibilità di provare Windows Azure per 30 giorni senza pagare assolutamente nulla.&lt;/p&gt;  &lt;p&gt;Vi basta andare sul sito &lt;a href="http://windowsazurepass.com/"&gt;http://windowsazurepass.com/&lt;/a&gt; ed inserire il codice promozionale CRMIKEA.&lt;/p&gt;  &lt;p&gt;Quello che vi aspetta è il seguente:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_W_Iqke_Yzoc/Tbm4lBP8FQI/AAAAAAAAA00/w-jrKJzmAuo/s1600-h/image%5B6%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_W_Iqke_Yzoc/Tbm4oPuIVhI/AAAAAAAAA04/dD3Q6jYVhNQ/image_thumb%5B4%5D.png?imgmax=800" width="400" height="473" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:9e6f2bd6-cb99-4464-8672-c33a2ae522a6" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/Windows+Azure" rel="tag"&gt;Windows Azure&lt;/a&gt;,&lt;a href="http://technorati.com/tags/promo+code" rel="tag"&gt;promo code&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-4459596339044524881?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/4459596339044524881/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=4459596339044524881&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/4459596339044524881'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/4459596339044524881'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/04/provate-azure-per-un-mese-gratuitamente.html' title='Provate Azure per un mese gratuitamente!!!'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_W_Iqke_Yzoc/Tbm4oPuIVhI/AAAAAAAAA04/dD3Q6jYVhNQ/s72-c/image_thumb%5B4%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-1087908318968466088</id><published>2011-04-22T17:46:00.001+02:00</published><updated>2011-04-22T17:46:05.202+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Code Contracts'/><title type='text'>Definire i contratti su interfacce generiche in VB.NET</title><content type='html'>&lt;p&gt;Uno dei grandi vantaggi dei code contracts di Microsoft (vedere gli articoli sul sito &lt;a href="http://www.domusdotnet.org"&gt;www.domusdotnet.org&lt;/a&gt; per maggiori info) è quello di poter definire i contratti anche sulle interfacce.&lt;/p&gt;  &lt;p&gt;Ad esempio le precondizioni si definiscono attraverso uno dei metodi statici Requires della classe Contracts (System.Diagnostic.Contracts):&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:7942b98f-d54c-4254-9379-4ed7abc7a5a7" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 300px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Imports&lt;/span&gt; System.Diagnostics.Contracts&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Module&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Module1&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt; Main()&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; chr = GetLastChar(&lt;span style="color:#a31515"&gt;&amp;quot;pippo&amp;quot;&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; chr2 = GetLastChar(&lt;span style="color:#a31515"&gt;&amp;quot;&amp;quot;&lt;/span&gt;)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt; GetLastChar(str &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;String&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;String&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#2b91af"&gt;Contract&lt;/span&gt;.Requires(&lt;span style="color:#0000ff"&gt;Not&lt;/span&gt; &lt;span style="color:#0000ff"&gt;String&lt;/span&gt;.IsNullOrEmpty(str))&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;Return&lt;/span&gt; str.Substring(str.Length - 1)&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Module&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Il metodo GetLastChar richiede che l’argomento non sia né Nothing, né “” e, nel caso precedente, in fase di compilazione, si ottiene il seguente warning&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_W_Iqke_Yzoc/TbGitiFpZtI/AAAAAAAAA0k/GcWSCoxqYA8/s1600-h/SNAGHTML43a2f30%5B4%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="SNAGHTML43a2f30" border="0" alt="SNAGHTML43a2f30" src="http://lh6.ggpht.com/_W_Iqke_Yzoc/TbGit0ApynI/AAAAAAAAA0o/_4tUVKZYlO4/SNAGHTML43a2f30_thumb%5B1%5D.png?imgmax=800" width="404" height="114" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;mentre in fase di esecuzione si ottiene la seguente eccezione:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_W_Iqke_Yzoc/TbGiutacQsI/AAAAAAAAA0s/lmcHKIE6VtM/s1600-h/image%5B3%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_W_Iqke_Yzoc/TbGivK62wNI/AAAAAAAAA0w/qTZ4MezSqlc/image_thumb%5B1%5D.png?imgmax=800" width="404" height="196" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Fino a qui tutto bene, ma come facciamo a definire le precondizioni (ma il concetto vale anche per postcondizioni ed invarianti d’oggetto) nel caso di interfacce o di metodi astratti di classi in cui non abbiamo la possibilità di inserire del codice?&lt;/p&gt;  &lt;p&gt;In questo caso abbiamo la possibilità di definire una classe che funge da “contenitore” per le definizioni dei contratti. Ad esempio:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:91774561-7748-43cd-95f9-c2b68471494e" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 300px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;ContractClass&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color:#2b91af"&gt;InterfacciaContract&lt;/span&gt;))&amp;gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Interface&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IInterfaccia&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt; Metodo(arg &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Integer&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Integer&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Interface&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;ContractClassFor&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color:#2b91af"&gt;IInterfaccia&lt;/span&gt;))&amp;gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;MustInherit&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;InterfacciaContract&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Implements&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IInterfaccia&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt; Metodo(arg &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Integer&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Integer&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Implements&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IInterfaccia&lt;/span&gt;.Metodo&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#2b91af"&gt;Contract&lt;/span&gt;.Requires(arg &amp;gt; 0)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;Throw&lt;/span&gt; &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;NotSupportedException&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Class&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;      &lt;p&gt;La classe InterfacciaContract funge da contenitore per i contratti dei metodi esposti dalla Interfaccia.&lt;/p&gt;  &lt;p&gt;Il codice presente nei metodi dell’interfaccia implementati dalla classe contenitore non viene eseguito se non quello relativo alla definizione dei contratti.&lt;/p&gt;  &lt;p&gt;Il problema nasce quando abbiamo una interfaccia generica (ovvero il cui comportamento dipende da uno o più tipi). In questo caso come definiamo la classe “contenitore” dei contratti e come indichiamo il tipo dell’interfaccia nell’attributo ContractClassFor?&lt;/p&gt;  &lt;p&gt;In questo caso si può utilizzare la sintassi NomeTipo(Of ) come mostrato nel seguente esempio:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:41130066-0215-4b66-8178-3e8cf36d46ea" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 300px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;ContractClass&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color:#2b91af"&gt;RepositoryContract&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; )))&amp;gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Interface&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IRepository&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; T)&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt; GetAll() &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IEnumerable&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af"&gt;T&lt;/span&gt;)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt; GetSingle(id &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Integer&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IEnumerable&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af"&gt;T&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Interface&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;ContractClassFor&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color:#2b91af"&gt;IRepository&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; )))&amp;gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;MustInherit&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;RepositoryContract&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; T)&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Implements&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IRepository&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af"&gt;T&lt;/span&gt;)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt; GetSingle(id &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Integer&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; System.Collections.Generic.&lt;span style="color:#2b91af"&gt;IEnumerable&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af"&gt;T&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;Implements&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IRepository&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af"&gt;T&lt;/span&gt;).GetSingle&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#2b91af"&gt;Contract&lt;/span&gt;.Requires(id &amp;gt; 0)&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;Throw&lt;/span&gt; &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#00008b"&gt;NotImplementedException&lt;/span&gt;()&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt; GetAll() &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; System.Collections.Generic.&lt;span style="color:#2b91af"&gt;IEnumerable&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af"&gt;T&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;Implements&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IRepository&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af"&gt;T&lt;/span&gt;).GetAll&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;Throw&lt;/span&gt; &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#00008b"&gt;NotImplementedException&lt;/span&gt;()&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Class&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Nel momento in cui definiamo una classe reale imponendo il tipo T, avremo che il contratto viene “ereditato” automaticamente:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:0fd5ac3e-6442-440e-91f2-c5430c19d8ed" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 300px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Repository&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Implements&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IRepository&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Entity&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt; GetSingle(id &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Integer&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; System.Collections.Generic.&lt;span style="color:#2b91af"&gt;IEnumerable&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Entity&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;Implements&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IRepository&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Entity&lt;/span&gt;).GetSingle&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;Return&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Nothing&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt; GetAll() &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; System.Collections.Generic.&lt;span style="color:#2b91af"&gt;IEnumerable&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Entity&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;Implements&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IRepository&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Entity&lt;/span&gt;).GetAll&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;Return&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Nothing&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Class&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;senza che noi si debba riscriverlo.&lt;/p&gt;  &lt;p&gt;Nel caso in cui l’interfaccia dipenda da più tipi è sufficiente scrivere le opportune virgole:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:06e5ee62-cc1f-43c4-bfee-d0e6111b1527" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 300px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;ContractClass&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color:#2b91af"&gt;RepositoryContract&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; ,)))&amp;gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Interface&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IRepository&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; T1, T2)&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt; GetAll() &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IEnumerable&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af"&gt;T1&lt;/span&gt;)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt; GetSingle(id &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Integer&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IEnumerable&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af"&gt;T1&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Interface&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;ContractClassFor&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color:#2b91af"&gt;IRepository&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; ,)))&amp;gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;MustInherit&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;RepositoryContract&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; T1, T2)&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Implements&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IRepository&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af"&gt;T1&lt;/span&gt;, &lt;span style="color:#2b91af"&gt;T2&lt;/span&gt;)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt; GetAll() &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; System.Collections.Generic.&lt;span style="color:#2b91af"&gt;IEnumerable&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af"&gt;T1&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;Implements&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IRepository&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af"&gt;T1&lt;/span&gt;, &lt;span style="color:#2b91af"&gt;T2&lt;/span&gt;).GetAll&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;Throw&lt;/span&gt; &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#00008b"&gt;NotImplementedException&lt;/span&gt;()&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt; GetSingle(id &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Integer&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; System.Collections.Generic.&lt;span style="color:#2b91af"&gt;IEnumerable&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af"&gt;T1&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;Implements&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IRepository&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af"&gt;T1&lt;/span&gt;, &lt;span style="color:#2b91af"&gt;T2&lt;/span&gt;).GetSingle&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#2b91af"&gt;Contract&lt;/span&gt;.Requires(id &amp;gt; 0)&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;Throw&lt;/span&gt; &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#00008b"&gt;NotImplementedException&lt;/span&gt;()&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Class&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:40c74808-7b2b-4cc2-9554-783cf43ef770" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/code+contracts" rel="tag"&gt;code contracts&lt;/a&gt;,&lt;a href="http://technorati.com/tags/interfacce" rel="tag"&gt;interfacce&lt;/a&gt;,&lt;a href="http://technorati.com/tags/abstract+class" rel="tag"&gt;abstract class&lt;/a&gt;,&lt;a href="http://technorati.com/tags/generics" rel="tag"&gt;generics&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-1087908318968466088?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/1087908318968466088/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=1087908318968466088&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/1087908318968466088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/1087908318968466088'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/04/definire-i-contratti-su-interfacce.html' title='Definire i contratti su interfacce generiche in VB.NET'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_W_Iqke_Yzoc/TbGit0ApynI/AAAAAAAAA0o/_4tUVKZYlO4/s72-c/SNAGHTML43a2f30_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-1080260211439871530</id><published>2011-04-17T20:55:00.001+02:00</published><updated>2011-04-17T20:55:59.060+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Varie'/><title type='text'>Un servizio clienti al servizio del cliente</title><content type='html'>&lt;p&gt;Vorrei spendere questo post per sottolineare l’ottimo servizio fornitomi dal servizio clienti Vodafone.&lt;/p&gt;  &lt;p&gt;In particolare il tutto è nato dalla necessità, all’arrivo del mio nuovo Omnia 7, di attivare una opzione internet sulla mia scheda Vodafone.&lt;/p&gt;  &lt;p&gt;Nell’attivare tale opzione ho attivato inavvertitamente anche l’opzione per la navigazione wap il cui costo è decisamente sproporzionato.&lt;/p&gt;  &lt;p&gt;Dopo un paio di giorni di navigazione wap&amp;#160; e senza riuscire a switchare sulla navigazione web, ho chiamato il servizio clienti e, inaspettatamente, l’operatore mi ha comunicato che avrebbe provato a risolvere il mio errore e, contestualmente, mi avrebbe restituito i soldi spesi per errore.&lt;/p&gt;  &lt;p&gt;E, già, qui sono rimasto sorpreso!&lt;/p&gt;  &lt;p&gt;Dopo l’intervento del servizio clienti, la situazione non è migliorata ed il telefonino continuava ad andare in wap, così ho richiamato, dopo un paio di giorni, di nuovo il servizio clienti.&lt;/p&gt;  &lt;p&gt;L’operatore, lo stesso della precedente volta, a cui, quindi non ho dovuto rispiegare di nuovo la situazione, ha cercato, assieme a me, di configurare lato telefono la connessione e, non riusciendoci, ha disabilitato il wap sulla scheda.&lt;/p&gt;  &lt;p&gt;Ora il telefono è correttamente configurato e, ho pure ricevuto un ulteriore rimborso per gli altri giorni spesi con il wap!!!&lt;/p&gt;  &lt;p&gt;La cosa mi ha piacevolmente sorpreso e ho accantonato l’idea di cambiare operatore!!!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:e468ed6d-de87-47b6-b1f0-9fe9ebde7386" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/vodafone" rel="tag"&gt;vodafone&lt;/a&gt;,&lt;a href="http://technorati.com/tags/190" rel="tag"&gt;190&lt;/a&gt;,&lt;a href="http://technorati.com/tags/servizio+clienti" rel="tag"&gt;servizio clienti&lt;/a&gt;,&lt;a href="http://technorati.com/tags/navigazione+internet" rel="tag"&gt;navigazione internet&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-1080260211439871530?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/1080260211439871530/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=1080260211439871530&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/1080260211439871530'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/1080260211439871530'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/04/un-servizio-clienti-al-servizio-del.html' title='Un servizio clienti al servizio del cliente'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-7549042631447581993</id><published>2011-04-14T12:58:00.001+02:00</published><updated>2011-04-14T12:58:21.507+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wp7'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone 7'/><title type='text'>Async CTP SP1 WP7 – Demo</title><content type='html'>&lt;p&gt;Vi segnalo questo video in cui viene illustrato come utilizzare la nuova SP1 di Visual Studio Async su WP7:&lt;/p&gt;  &lt;div style="text-align: center"&gt;&lt;iframe style="width: 256px; height: 144px" src="http://channel9.msdn.com/posts/Alex-Turner-Visual-Studio-Async-CTP-SP1-Refresh-WP7-Demo/player?w=256&amp;amp;h=144" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:7a4ff824-470f-440e-86a3-fb9937c346ba" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/WP7" rel="tag"&gt;WP7&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Windows+Phone+7" rel="tag"&gt;Windows Phone 7&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Async+CTP+SP1" rel="tag"&gt;Async CTP SP1&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-7549042631447581993?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/7549042631447581993/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=7549042631447581993&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/7549042631447581993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/7549042631447581993'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/04/async-ctp-sp1-wp7-demo.html' title='Async CTP SP1 WP7 – Demo'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-6425005053970231787</id><published>2011-04-13T19:47:00.001+02:00</published><updated>2011-04-13T19:47:03.445+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Annunci'/><category scheme='http://www.blogger.com/atom/ns#' term='wp7'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2010'/><title type='text'>Rilasciata Async CTP SP1</title><content type='html'>&lt;p&gt;E’ stata rilasciata la SP1 di Async CTP.&lt;/p&gt;  &lt;p&gt;Questa versione include:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;compatibilità con Visual Studio 2010 SP1;&lt;/li&gt;    &lt;li&gt;API per Windows Phone 7 &lt;/li&gt;    &lt;li&gt;possibilità di utilizzare Async in produzione.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;La pagina ufficiale di Visual Studio Asynchronous Programming è al seguente &lt;a href="http://msdn.microsoft.com/en-us/vstudio/gg316360" target="_blank"&gt;link&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;E’ possibile scaricare la CTP al seguente &lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=4738205d-5682-47bf-b62e-641f6441735b&amp;amp;displaylang=en" target="_blank"&gt;link&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:7a70ae90-7fa7-446c-ad93-eaa193d8671e" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/Async+CTP+Sp1" rel="tag"&gt;Async CTP Sp1&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Visual+Studio+Asynchronous+Programming" rel="tag"&gt;Visual Studio Asynchronous Programming&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-6425005053970231787?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/6425005053970231787/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=6425005053970231787&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/6425005053970231787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/6425005053970231787'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/04/rilasciata-async-ctp-sp1.html' title='Rilasciata Async CTP SP1'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-2419065786457664364</id><published>2011-04-13T11:05:00.001+02:00</published><updated>2011-04-13T11:05:10.408+02:00</updated><title type='text'>MIX 11 – IE10 Platform Preview</title><content type='html'>&lt;p&gt;Coloro che hanno visto la keynote di ieri del Mix 11 saranno rimasti impressionati dalle potenzialità di IE10.&lt;/p&gt;  &lt;p&gt;Per poter provare le funzionalità di IE10, è stata rilasciata la prima Preview Platform che è scaricabile da:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://ie.microsoft.com/testdrive/Info/Downloads/Default.html" href="http://ie.microsoft.com/testdrive/Info/Downloads/Default.html"&gt;http://ie.microsoft.com/testdrive/Info/Downloads/Default.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Come già avvenuto per IE9, le plattform preview verranno rilasciate in sequenza per permettere agli utenti di scoprire le nuove funzionalità non appena vengono messe a disposizione.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:99c712f2-45f5-4574-914e-a2c6f8a49835" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/ie10" rel="tag"&gt;ie10&lt;/a&gt;,&lt;a href="http://technorati.com/tags/ie10+platform+preview" rel="tag"&gt;ie10 platform preview&lt;/a&gt;,&lt;a href="http://technorati.com/tags/mix11" rel="tag"&gt;mix11&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-2419065786457664364?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/2419065786457664364/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=2419065786457664364&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/2419065786457664364'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/2419065786457664364'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/04/mix-11-ie10-platform-preview.html' title='MIX 11 – IE10 Platform Preview'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-5101178635041136986</id><published>2011-04-13T10:00:00.001+02:00</published><updated>2011-04-13T10:04:21.434+02:00</updated><title type='text'>MIX11–Guarda la keynote</title><content type='html'>&lt;p&gt;Per chi ha perso la diretta della prima keynote di MIX11, può vederla registrata al seguente link&lt;/p&gt;  &lt;p&gt;&lt;a href="http://ispss.istreamplanet.com/mix11/110412/?contentID=" target="_blank"&gt;Key Note iniziale MIX 11&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:0e1c64f7-b6de-4509-bae3-9f13b7e61300" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/mix11" rel="tag"&gt;mix11&lt;/a&gt;,&lt;a href="http://technorati.com/tags/ie10" rel="tag"&gt;ie10&lt;/a&gt;,&lt;a href="http://technorati.com/tags/keynote" rel="tag"&gt;keynote&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-5101178635041136986?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/5101178635041136986/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=5101178635041136986&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/5101178635041136986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/5101178635041136986'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/04/mix11guarda-la-keynote.html' title='MIX11–Guarda la keynote'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-1214976172196044122</id><published>2011-03-14T14:35:00.001+01:00</published><updated>2011-03-14T14:35:39.331+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Tip'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2010'/><title type='text'>Visual Studio 2010 SP1: Addio ByVal!!!</title><content type='html'>&lt;p&gt;Non è il titolo di un film, ma semplicemente una novità introdotta nella SP1 di Visual Studio 2010.&lt;/p&gt;  &lt;p&gt;Gli sviluppatori VB sono abituati al fatto che, quando scrivono gli argomenti dei metodi, in automatico l’IDE inserisce (se già non c’è o non è stata inserita la ByRef) la parola chiave ByVal (il cui significato è riportato &lt;a href="http://msdn.microsoft.com/en-us/library/ddck1z30(v=VS.100).aspx" target="_blank"&gt;qui&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;Con l’istallazione della SP1 di VS2010 ciò non accade più nel senso che se non mettiamo la parola chiave ByVal, l’IDE non la inserisce in automatico.&lt;/p&gt;  &lt;p&gt;Non si tratta di un errore ma semplicemente del fatto che ByVal è di default e, quindi non è necessario inserirla.&lt;/p&gt;  &lt;p&gt;Ovviamente se la mettiamo funziona tutto come prima.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:2a4fd98c-0b58-4a17-a9f5-2f03315b2ea3" class="wlWriterEditableSmartContent"&gt;Tag di Technorati: &lt;a href="http://technorati.com/tags/ByVal" rel="tag"&gt;ByVal&lt;/a&gt;,&lt;a href="http://technorati.com/tags/VS+2010+SP1" rel="tag"&gt;VS 2010 SP1&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Visual+Studio+2010+SP1" rel="tag"&gt;Visual Studio 2010 SP1&lt;/a&gt;,&lt;a href="http://technorati.com/tags/ByRef" rel="tag"&gt;ByRef&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1721873273354099129-1214976172196044122?l=codetailor.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetailor.blogspot.com/feeds/1214976172196044122/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1721873273354099129&amp;postID=1214976172196044122&amp;isPopup=true' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/1214976172196044122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1721873273354099129/posts/default/1214976172196044122'/><link rel='alternate' type='text/html' href='http://codetailor.blogspot.com/2011/03/visual-studio-2010-sp1-addio-byval.html' title='Visual Studio 2010 SP1: Addio ByVal!!!'/><author><name>Max</name><uri>http://www.blogger.com/profile/13415682515700337429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_W_Iqke_Yzoc/TOwJCx-0zOI/AAAAAAAAAwk/GExa2ES2R8w/S220/Massimo%2BCartone.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1721873273354099129.post-4719416532171698930</id><published>2011-03-14T08:44:00.001+01:00</published><updated>2011-03-14T09:58:03.694+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Team Foundation Server'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><title type='text'>TFS2010 Object Model: Scaricare tutti i file sorgente di tutte le project collection in un colpo solo e senza workspace</title><content type='html'>&lt;p&gt;In questo post vorrei mostrarvi come sia possibile scaricare tutti i files presenti nel controllo di codice sorgente di TFS senza utilizzare un workspace.&lt;/p&gt;  &lt;p&gt;Per fare questo utilizzeremo un istanza della classe VersionControlService (namespace Microsoft.TeamFoundation.VersionControl.Client).&lt;/p&gt;  &lt;p&gt;Prima di tutto abbiamo la necessità di referenziare gli assembly: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Microsoft.TeamFoundation.Client.dll; &lt;/li&gt;    &lt;li&gt;Microsoft.TeamFoundation.VersionControl.Client.dll; &lt;/li&gt;    &lt;li&gt;Microsoft.TeamFoundation.Common.dll &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_W_Iqke_Yzoc/TX3HW1iUmPI/AAAAAAAAA0U/DUW-FzoXcww/s1600-h/SNAGHTML5c4377%5B4%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px auto 5px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="SNAGHTML5c4377" border="0" alt="SNAGHTML5c4377" src="http://lh3.ggpht.com/_W_Iqke_Yzoc/TX3HXXtoZ-I/AAAAAAAAA0Y/vP_kM3UxK2U/SNAGHTML5c4377_thumb%5B1%5D.png?imgmax=800" width="404" height="234" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Le dll sono già presenti nelle macchine che hanno installato Team Explorer.&lt;/p&gt;  &lt;p&gt;L’algoritmo che utilizzeremo sarà:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;recuperare l’elenco delle project collection presenti sul server TFS (e a cui abbiamo accesso); &lt;/li&gt;    &lt;li&gt;iterare su ogni collection e recuperare l’elenco di tutti i file sotto controllo di codice sorgente ad una certa data &lt;/li&gt;    &lt;li&gt;salvare i file in una cartella definita dall’utente mantenendo la struttura gerarchica delle cartelle sul server. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Abbiamo già visto in un precedente &lt;a href="http://codetailor.blogspot.com/2011/01/tfs-2010-object-model-recuperare-le.html" target="_blank"&gt;post&lt;/a&gt; come recuperare l’elenco delle collection e, riportiamo, quindi solo il codice necessario:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:31b93d43-42a6-4f37-b5e9-875db276a2b7" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 300px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Private&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt; CreateTFSServer(&lt;span style="color:#0000ff"&gt;ByVal&lt;/span&gt; serverUrl &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;String&lt;/span&gt;)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    Contracts.&lt;span style="color:#2b91af"&gt;Contract&lt;/span&gt;.Requires(&lt;span style="color:#0000ff"&gt;Not&lt;/span&gt; &lt;span style="color:#0000ff"&gt;String&lt;/span&gt;.IsNullOrWhiteSpace(serverUrl), &lt;span style="color:#a31515"&gt;&amp;quot;Url Server non pu? essere vuoto&amp;quot;&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;If&lt;/span&gt; TFSServer &lt;span style="color:#0000ff"&gt;IsNot&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Then&lt;/span&gt; TFSServer.Dispose()&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Try&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        TFSServer = &lt;span style="color:#2b91af"&gt;TfsConfigurationServerFactory&lt;/span&gt;.GetConfigurationServer(&lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Uri&lt;/span&gt;(serverUrl), &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;UICredentialsProvider&lt;/span&gt;())&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Catch&lt;/span&gt; ex &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Exception&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;Throw&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Try&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Sub&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt; GetCollectionUris() &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IEnumerable&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#0000ff"&gt;String&lt;/span&gt;)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    Contracts.&lt;span style="color:#2b91af"&gt;Contract&lt;/span&gt;.Requires(&lt;span style="color:#0000ff"&gt;Me&lt;/span&gt;.TFSServer &lt;span style="color:#0000ff"&gt;IsNot&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Nothing&lt;/span&gt;, &lt;span style="color:#a31515"&gt;&amp;quot;Server non connesso&amp;quot;&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; retList &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IEnumerable&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#0000ff"&gt;String&lt;/span&gt;) = &lt;span style="color:#0000ff"&gt;Nothing&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Try&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; collections = &lt;span style="color:#0000ff"&gt;Me&lt;/span&gt;.TFSServer.CatalogNode().QueryChildren({&lt;span style="color:#2b91af"&gt;CatalogResourceTypes&lt;/span&gt;.ProjectCollection},&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                                                                   &lt;span style="color:#0000ff"&gt;False&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;                                                                   &lt;span style="color:#2b91af"&gt;CatalogQueryOptions&lt;/span&gt;.None)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        retList = &lt;span style="color:#0000ff"&gt;From&lt;/span&gt; o &lt;span style="color:#0000ff"&gt;In&lt;/span&gt; collections&lt;/li&gt; &lt;li&gt;                  &lt;span style="color:#0000ff"&gt;Select&lt;/span&gt; &lt;span style="color:#0000ff"&gt;String&lt;/span&gt;.Format(&lt;span style="color:#a31515"&gt;&amp;quot;{0}/{1}&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000ff"&gt;Me&lt;/span&gt;.TFSServer.Uri.AbsoluteUri, o.Resource.DisplayName)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Catch&lt;/span&gt; ex &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Exception&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;Throw&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Try&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Return&lt;/span&gt; retList&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Il metodo CreateTFSServer istanzia un oggetto di classe TfsConfigurationServer utile per accedere ai dati delle collection che sono, invece, recuperati dal metodo GetCollectionUris. Questo metodo restituisce una collezione di stringhe che rappresentano gli uri delle singole collezioni nella forma:&lt;/p&gt;  &lt;p align="center"&gt;&lt;font face="Consolas"&gt;&lt;strong&gt;http://mioserver:8080/tfs/miacollezione&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Il seguente metodo permette di recuperare l’elenco dei file sotto controllo di codice sorgente per una collezione:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:12a30f79-ef7f-427e-8228-b26e18c6c2f2" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 300px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt; GetVersionedItems(&lt;span style="color:#0000ff"&gt;ByVal&lt;/span&gt; collectionUri &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;String&lt;/span&gt;,&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                                  &lt;span style="color:#0000ff"&gt;ByVal&lt;/span&gt; projectName &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;String&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;                                  &lt;span style="color:#0000ff"&gt;ByVal&lt;/span&gt; filter &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;String&lt;/span&gt;,&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                                  &lt;span style="color:#0000ff"&gt;ByVal&lt;/span&gt; versionDate &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;DateTime&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IEnumerable&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Item&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;    Contracts.&lt;span style="color:#2b91af"&gt;Contract&lt;/span&gt;.Requires(&lt;span style="color:#0000ff"&gt;Not&lt;/span&gt; &lt;span style="color:#0000ff"&gt;String&lt;/span&gt;.IsNullOrWhiteSpace(collectionUri), &lt;span style="color:#a31515"&gt;&amp;quot;CollectionUri non pu? essere nullo&amp;quot;&lt;/span&gt;)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; retList &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IEnumerable&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Item&lt;/span&gt;) = &lt;span style="color:#0000ff"&gt;Nothing&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Try&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; tpc = &lt;span style="color:#2b91af"&gt;TfsTeamProjectCollectionFactory&lt;/span&gt;.GetTeamProjectCollection(&lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Uri&lt;/span&gt;(collectionUri))&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; versionControlServer = &lt;span style="color:#0000ff"&gt;CType&lt;/span&gt;(tpc.GetService(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af"&gt;VersionControlServer&lt;/span&gt;)(), &lt;span style="color:#2b91af"&gt;VersionControlServer&lt;/span&gt;)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; pathStr = &lt;span style="color:#0000ff"&gt;String&lt;/span&gt;.Format(&lt;span style="color:#a31515"&gt;&amp;quot;$/{0}/{1}&amp;quot;&lt;/span&gt;, projectName, filter)&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; dateVerSpec = &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;DateVersionSpec&lt;/span&gt;(versionDate)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        retList = versionControlServer.GetItems(pathStr, dateVerSpec, &lt;span style="color:#2b91af"&gt;RecursionType&lt;/span&gt;.Full).Items&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Catch&lt;/span&gt; ex &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Exception&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;Throw&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Try&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Return&lt;/span&gt; retList&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Per prima cosa otteniamo l’istanza della classe TfsTeamProjectCollection necessaria per ricavare l’oggetto VersionControlServer il quale ci permette, tramite il metodo GetItems, di recuperare l’elenco degli Items sotto controllo di codice sorgente. Da notare che l’argomento stringa filter può servire per recuperare tutti e soli gli item di un certo tipo (ad esempio “*.vb”).&lt;/p&gt;  &lt;p&gt;Ultimo step dell’algoritmo è quello di salvare gli items di tipo file nella cartella decisa dall’utente e per fare ciò ci viene in aiuto il seguente codice:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:49651ce9-c8f9-4194-a81f-76276505d598" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 300px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Private&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt; SaveItems(&lt;span style="color:#0000ff"&gt;ByVal&lt;/span&gt; items &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IEnumerable&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; Microsoft.TeamFoundation.VersionControl.Client.&lt;span style="color:#2b91af"&gt;Item&lt;/span&gt;),&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                           &lt;span style="color:#0000ff"&gt;ByVal&lt;/span&gt; destinationPath &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;String&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IEnumerable&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#0000ff"&gt;String&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; retval = &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;List&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#0000ff"&gt;String&lt;/span&gt;)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;For&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Each&lt;/span&gt; Item &lt;span style="color:#0000ff"&gt;In&lt;/span&gt; items&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;If&lt;/span&gt; Item.ItemType = &lt;span style="color:#2b91af"&gt;ItemType&lt;/span&gt;.File &lt;span style="color:#0000ff"&gt;Then&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; origFileName = Item.ServerItem.Replace(&lt;span style="color:#a31515"&gt;&amp;quot;$/&amp;quot;&lt;/span&gt;, &lt;span style="color:#a31515"&gt;&amp;quot;&amp;quot;&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;            origFileName = origFileName.Replace(&lt;span style="color:#a31515"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;, &lt;span style="color:#a31515"&gt;&amp;quot;&amp;#92;&amp;quot;&lt;/span&gt;)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; fileName = IO.&lt;span style="color:#2b91af"&gt;Path&lt;/span&gt;.Combine(destinationPath, origFileName)&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;Try&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                Item.DownloadFile(fileName)&lt;/li&gt; &lt;li&gt;                retval.Add(fileName)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="color:#0000ff"&gt;Catch&lt;/span&gt; ex &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Exception&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="color:#0000ff"&gt;Throw&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Try&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;If&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Next&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Return&lt;/span&gt; retval&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;In questo caso iteriamo sugli items di tipo ItemType.File, per ognuno di questi creiamo il percorso in cui salvarlo a partire dal percorso originale all’interno della cartella di destinazione e salviamo il file.&lt;/p&gt;  &lt;p&gt;Il metodo che esegue i tre passi precedenti è il seguente:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:e9f1766b-7ee4-4433-a70a-de56095148fd" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #fff; max-height: 300px; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px; white-space: nowrap"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;Private&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt; DownloadAllItems(&lt;span style="color:#0000ff"&gt;ByVal&lt;/span&gt; destinationPath &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#0000ff"&gt;String&lt;/span&gt;, _&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                                  &lt;span style="color:#0000ff"&gt;ByVal&lt;/span&gt; versionDate &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;DateTime&lt;/span&gt;) &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IEnumerable&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#0000ff"&gt;String&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;    Contracts.&lt;span style="color:#2b91af"&gt;Contract&lt;/span&gt;.Requires(&lt;span style="color:#0000ff"&gt;Not&lt;/span&gt; &lt;span style="color:#0000ff"&gt;String&lt;/span&gt;.IsNullOrWhiteSpace(destinationPath), &lt;span style="color:#a31515"&gt;&amp;quot;destinationPath non pu? essere vuota&amp;quot;&lt;/span&gt;)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; retval = &lt;span style="color:#0000ff"&gt;New&lt;/span&gt; &lt;span style="color:#2b91af"&gt;List&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#0000ff"&gt;String&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; colls &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IEnumerable&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#0000ff"&gt;String&lt;/span&gt;) = &lt;span style="color:#0000ff"&gt;Nothing&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Try&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        colls = &lt;span style="color:#0000ff"&gt;Me&lt;/span&gt;.GetCollectionUris()&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Catch&lt;/span&gt; ex &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Exception&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;Throw&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Try&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;If&lt;/span&gt; colls &lt;span style="color:#0000ff"&gt;IsNot&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Then&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;For&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Each&lt;/span&gt; coll &lt;span style="color:#0000ff"&gt;In&lt;/span&gt; colls&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; items &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IEnumerable&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;Of&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Item&lt;/span&gt;) = &lt;span style="color:#0000ff"&gt;Nothing&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="color:#0000ff"&gt;Try&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                items = GetVersionedItems(coll, &lt;span style="color:#0000ff"&gt;Nothing&lt;/span&gt;, &lt;span style="color:#a31515"&gt;&amp;quot;*.*&amp;quot;&lt;/span&gt;, versionDate)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="color:#0000ff"&gt;Catch&lt;/span&gt; ex &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Exception&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="color:#0000ff"&gt;Throw&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Try&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;If&lt;/span&gt; items &lt;span style="color:#0000ff"&gt;IsNot&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Then&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; collName = coll.Substring(coll.LastIndexOf(&lt;span style="color:#a31515"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;) + 1)&lt;/li&gt; &lt;li&gt;                &lt;span style="color:#0000ff"&gt;Dim&lt;/span&gt; destPath = IO.&lt;span style="color:#2b91af"&gt;Path&lt;/span&gt;.Combine(destinationPath, collName)&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="color:#0000ff"&gt;Try&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    retval.AddRange(SaveItems(items, destPath))&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="color:#0000ff"&gt;Catch&lt;/span&gt; ex &lt;span style="color:#0000ff"&gt;As&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Exception&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="color:#0000ff"&gt;Throw&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;                &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Try&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;If&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="color:#0000ff"&gt;Next&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;If&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="color:#0000ff"&gt;Return&lt;/span&gt; retval&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff"&gt;Function&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Nella soluzione che trovate allegata al post, è presente anche una versione asincrona (l’operazione di autenticazione e recupero degli items da TFS può durare anche qualche secondo) che utilizza un algoritmo del tutto analogo.&lt;/p&gt;  &lt;p&gt;La form dell’applicazione è la seguente:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggp
