<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/" version="2.0">
    <channel>
        <title>DarioSantarelli.Blog("UgiDotNet");</title>
        <link>http://blogs.ugidotnet.org/dsantarelli/Default.aspx</link>
        <description>&amp;lt;sharing mode=”On” users=”*” /&amp;gt;</description>
        <language>it-IT</language>
        <copyright>Dario Santarelli</copyright>
        <generator>Subtext Version 2.1.0.3</generator>
        <image>
            <title>DarioSantarelli.Blog("UgiDotNet");</title>
            <url>http://blogs.ugidotnet.org/images/RSS2Image.gif</url>
            <link>http://blogs.ugidotnet.org/dsantarelli/Default.aspx</link>
            <width>77</width>
            <height>60</height>
        </image>
        <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/DarioSantarelliUgiDotNet" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
            <title>[WPF] Un &amp;ldquo;generic&amp;rdquo; command</title>
            <category>WPF</category>
            <link>http://blogs.ugidotnet.org/dsantarelli/archive/2009/10/17/wpf-un-ldquogenericrdquo-command.aspx</link>
            <description>&lt;p&gt;Analizzando diverse soluzioni WPF che sfruttano l’architettura M-V-VM, mi è saltata all’occhio una strategia di implementazione dell’interfaccia &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.input.icommand.aspx" target="_blank"&gt;ICommand&lt;/a&gt; semplice e potente a mio modo di vedere. Andiamo direttamente al codice:&lt;/p&gt;  &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;public&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;GenericCommand&lt;/span&gt;&amp;lt;T&amp;gt; : &lt;span style="color: #2b91af"&gt;ICommand        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;{      &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Predicate&lt;/span&gt;&amp;lt;T&amp;gt; CanExecuteDelegate { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }       &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Action&lt;/span&gt;&amp;lt;T&amp;gt; ExecuteDelegate { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;span style="mso-spacerun: yes"&gt;        &lt;br /&gt;        &lt;br /&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;bool&lt;/span&gt; CanExecute(&lt;span style="color: blue"&gt;object&lt;/span&gt; parameter)       &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;{      &lt;br /&gt;    &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt; (CanExecuteDelegate != &lt;span style="color: blue"&gt;null&lt;/span&gt;) &lt;span style="color: blue"&gt;return&lt;/span&gt; CanExecuteDelegate((T)parameter);       &lt;br /&gt;    &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;true&lt;/span&gt;;       &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;}      &lt;br /&gt;      &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;event&lt;/span&gt; &lt;span style="color: #2b91af"&gt;EventHandler&lt;/span&gt; CanExecuteChanged       &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;{      &lt;br /&gt;    &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;add&lt;/span&gt; { &lt;span style="color: #2b91af"&gt;CommandManager&lt;/span&gt;.RequerySuggested += &lt;span style="color: blue"&gt;value&lt;/span&gt;; }       &lt;br /&gt;    &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;remove&lt;/span&gt; { &lt;span style="color: #2b91af"&gt;CommandManager&lt;/span&gt;.RequerySuggested -= &lt;span style="color: blue"&gt;value&lt;/span&gt;; }       &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;}      &lt;br /&gt;      &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; Execute(&lt;span style="color: blue"&gt;object&lt;/span&gt; parameter)       &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;{      &lt;br /&gt;    &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt; (ExecuteDelegate != &lt;span style="color: blue"&gt;null&lt;/span&gt;) ExecuteDelegate((T)parameter);       &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-no-proof: yes"&gt;}&lt;span style="mso-spacerun: yes"&gt;        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-no-proof: yes"&gt;}&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;Sostanzialmente l’obiettivo di questo &lt;em&gt;GenericCommand&lt;/em&gt; è di permettere una “tipizzazione” dichiarativa del parametro gestito dall’ interfaccia ICommand, in modo tale da poter costruire ViewModel contenenti delegati che gestiscono il pattern &lt;em&gt;CanExecute/Execute&lt;/em&gt; operando a nostro piacimento su parametri tipizzati passati magari direttamente dalla View. Ecco un esempio molto semplice di ViewModel...&lt;/p&gt;  &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;public&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ContactsViewModel        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;{      &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ObservableCollection&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt; Contacts { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }       &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;GenericCommand&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt; AddContact { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }       &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;GenericCommand&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;object&lt;/span&gt;&amp;gt; ClearContacts { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;span style="mso-spacerun: yes"&gt;        &lt;br /&gt;        &lt;br /&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; ContactsViewModel()       &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;{      &lt;br /&gt;    &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;Contacts = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ObservableCollection&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt;();       &lt;br /&gt;    &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;AddContact = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;GenericCommand&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt;();       &lt;br /&gt;    &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;ClearContacts = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;GenericCommand&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;object&lt;/span&gt;&amp;gt;();       &lt;br /&gt;      &lt;br /&gt;    &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;AddContact.CanExecuteDelegate += &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Predicate&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt;(AddContact_CanExecute);       &lt;br /&gt;    &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;AddContact.ExecuteDelegate += &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Action&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt;(AddContact_Execute);       &lt;br /&gt;      &lt;br /&gt;    &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;ClearContacts.CanExecuteDelegate += &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Predicate&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;object&lt;/span&gt;&amp;gt;(ClearContacts_CanExecute);       &lt;br /&gt;    &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;ClearContacts.ExecuteDelegate += &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Action&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;object&lt;/span&gt;&amp;gt;(ClearContacts_Execute);       &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;}  &lt;br /&gt;      &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;bool&lt;/span&gt; AddContact_CanExecute(&lt;span style="color: blue"&gt;string&lt;/span&gt; contactName) { &lt;span style="color: blue"&gt;return&lt;/span&gt; (!&lt;span style="color: blue"&gt;string&lt;/span&gt;.IsNullOrEmpty(contactName)); }  &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;void&lt;/span&gt; AddContact_Execute(&lt;span style="color: blue"&gt;string&lt;/span&gt; contactName) { Contacts.Add(contactName); }  &lt;br /&gt;      &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;bool&lt;/span&gt; ClearContacts_CanExecute(&lt;span style="color: blue"&gt;object&lt;/span&gt; parameter) { &lt;span style="color: blue"&gt;return&lt;/span&gt; (Contacts.Count &amp;gt; 0); }  &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;void&lt;/span&gt; ClearContacts_Execute(&lt;span style="color: blue"&gt;object&lt;/span&gt; parameter) { Contacts.Clear(); }&lt;span style="mso-spacerun: yes"&gt;       &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-no-proof: yes"&gt;}&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;...e per chiudere il cerchio riporto anche lo XAML saliente di una View di esempio.  &lt;/p&gt;  &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;TextBox&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; Name&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;="txtContactName"&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; ...&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; /&amp;gt;      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;Button&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: red"&gt;Command&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding&lt;/span&gt;&lt;span style="color: red"&gt; AddContact&lt;/span&gt;&lt;span style="color: blue"&gt;}"&lt;/span&gt;&lt;span style="color: red"&gt; CommandParameter&lt;/span&gt;&lt;span style="color: blue"&gt;="{&lt;/span&gt;&lt;span style="color: #a31515"&gt;Binding&lt;/span&gt;&lt;span style="color: red"&gt; ElementName&lt;/span&gt;&lt;span style="color: blue"&gt;=txtContactName,&lt;/span&gt;&lt;span style="color: red"&gt; Path&lt;/span&gt;&lt;span style="color: blue"&gt;=Text}" ...&amp;gt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Add Contact&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;Button&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;gt;      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;ListBox&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;ItemsSource&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;="{&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;Binding&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; Contacts&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;}" ... /&amp;gt;      &lt;br /&gt;&lt;/span&gt;&lt;span style="line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;lt;&lt;/span&gt;&lt;span style="line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;Button&lt;/span&gt;&lt;span style="line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; Command&lt;/span&gt;&lt;span style="line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;="{&lt;/span&gt;&lt;span style="line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;Binding&lt;/span&gt;&lt;span style="line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; ClearContacts&lt;/span&gt;&lt;span style="line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;}" ...&lt;/span&gt;&lt;span style="line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;gt;&lt;/span&gt;&lt;span style="line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;Clear Contacts&lt;/span&gt;&lt;span style="line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;Button&lt;/span&gt;&lt;span style="line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;gt;&lt;/span&gt;&lt;span style="mso-ansi-language: en-us" lang="EN-US"&gt; &lt;/span&gt;    &lt;/p&gt;&lt;p /&gt;   &lt;p /&gt;  &lt;p&gt;   &lt;br /&gt;Cosa ne pensate?&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:b710a5df-d461-4331-beff-0d69370a4c09" class="wlWriterEditableSmartContent"&gt;Technorati Tag: &lt;a href="http://technorati.com/tags/WPF" rel="tag"&gt;WPF&lt;/a&gt;,&lt;a href="http://technorati.com/tags/ICommand" rel="tag"&gt;ICommand&lt;/a&gt;,&lt;a href="http://technorati.com/tags/M-V-VM" rel="tag"&gt;M-V-VM&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/dsantarelli/aggbug/97272.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dario Santarelli</dc:creator>
            <guid>http://blogs.ugidotnet.org/dsantarelli/archive/2009/10/17/wpf-un-ldquogenericrdquo-command.aspx</guid>
            <pubDate>Sat, 17 Oct 2009 09:41:24 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/dsantarelli/comments/97272.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/dsantarelli/archive/2009/10/17/wpf-un-ldquogenericrdquo-command.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/dsantarelli/comments/commentRss/97272.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/dsantarelli/services/trackbacks/97272.aspx</trackback:ping>
        </item>
        <item>
            <title>[WPF] Window non rettangolari</title>
            <category>WPF</category>
            <link>http://blogs.ugidotnet.org/dsantarelli/archive/2009/09/26/wpf-window-non-rettangolari.aspx</link>
            <description>&lt;p&gt;La possibilità di creare Window di forma irregolare costituisce a mio modo di vedere uno dei più divertenti nonché semplici vantaggi di WPF.    &lt;br /&gt;In genere, ogni tecnica di realizzazione di Window dalla forma completamente personalizzata si basa sulla valorizzazione preliminare di tre proprietà:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.window.allowstransparency.aspx" target="_blank"&gt;Window.AllowsTransparency&lt;/a&gt; = True &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.window.windowstyle.aspx" target="_blank"&gt;Window.WindowStyle&lt;/a&gt; = None &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.controls.control.background.aspx" target="_blank"&gt;Window.Background&lt;/a&gt; = Transparent &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;In questo modo siamo subito svincolati sia dalla forma rettangolare standard della nostra Window, che dalla barra standard del titolo. Si aprono quindi diverse possibilità di sviluppo. E’ possibile ad esempio sfruttare immagini semitrasparenti come background della Window (scelta semplice e di veloce realizzazione, ma non consigliabile in WPF dal momento che la Window subirebbe un rendering con più pixel in sistemi con maggiori DPIs). Una soluzione sicuramente più potente sfrutta invece il programming model che WPF ci mette a disposizione relativamente alla grafica vettoriale: in altre parole, per creare una Window dai bordi arrotondati basta partire dall’elemento &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.border.aspx" target="_blank"&gt;Border&lt;/a&gt;.     &lt;br /&gt;Vorrei riportare un esempio che mi è rimasto impresso dopo aver letto il libro “&lt;a href="http://www.amazon.com/Pro-WPF-2008-Presentation-Professionals/dp/1590599551" target="_blank"&gt;Pro WPF in C# 2008&lt;/a&gt;” : creare una Window dalla forma irregolare, con bordi arrotondati.    &lt;br /&gt;N.B.: tralascio volutamente ogni questione di carattere architetturale ( es. realizzazione di custom control template per le nostre Window ).     &lt;br /&gt;    &lt;br /&gt;&lt;img src="http://img17.imageshack.us/img17/8228/windowjm.jpg" /&gt;     &lt;br /&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Codice XAML:      &lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;Window&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; x&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;:&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;Class&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;="WPF_Demo.ShapedWindow"&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: red"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue"&gt;="http://schemas.microsoft.com/winfx/2006/xaml/presentation"        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: red"&gt;        xmlns&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;x&lt;/span&gt;&lt;span style="color: blue"&gt;="http://schemas.microsoft.com/winfx/2006/xaml"        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: red"&gt;        ...&lt;/span&gt; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;   &lt;/span&gt;&lt;span style="color: red"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;br /&gt;        &lt;/span&gt;AllowsTransparency&lt;/span&gt;&lt;span style="color: blue"&gt;="True"&lt;/span&gt;&lt;span style="color: red"&gt; WindowStyle&lt;/span&gt;&lt;span style="color: blue"&gt;="None"&lt;/span&gt;&lt;span style="color: red"&gt; Background&lt;/span&gt;&lt;span style="color: blue"&gt;="Transparent"&lt;/span&gt;&lt;span style="color: red"&gt; ResizeMode&lt;/span&gt;&lt;span style="color: blue"&gt;="CanResizeWithGrip"&amp;gt;        &lt;br /&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;Border&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; ...&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; CornerRadius&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;="0,20,30,20"&amp;gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;       &lt;br /&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;Grid&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;gt;      &lt;br /&gt;          &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;Grid.RowDefinitions&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;gt;      &lt;br /&gt;             &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;RowDefinition&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; Height&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;="Auto"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;RowDefinition&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;gt;      &lt;br /&gt;             &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;RowDefinition&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;RowDefinition&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;gt;      &lt;br /&gt;             &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;RowDefinition&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; Height&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;="Auto"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;RowDefinition&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;gt;      &lt;br /&gt;          &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;Grid.RowDefinitions&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;     &lt;br /&gt;         &lt;br /&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;TextBlock&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; Text&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;="Title"&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; ...&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; MouseLeftButtonDown&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;="WindowDragMove"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;TextBlock&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;      &lt;br /&gt;        &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;Button&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; ...&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; Command&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;="Close"&amp;gt;      &lt;br /&gt;           &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;Button.Content&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;gt;      &lt;br /&gt;              &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;Image&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; Source&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;="..."&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; Stretch&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;="Fill"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;Image&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;gt;      &lt;br /&gt;           &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;Button.Content&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;gt;      &lt;br /&gt;        &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;Button&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;gt;      &lt;br /&gt;      &lt;br /&gt;        &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;Grid&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; Grid.Row&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;="1"&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; Background&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;="White"&amp;gt;      &lt;br /&gt;            &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;Rectangle&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; Grid.RowSpan&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;="3"&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; Width&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;="5"&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; VerticalAlignment&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;="Stretch"&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; HorizontalAlignment&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;="Right"      &lt;br /&gt;                       &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: red"&gt;Cursor&lt;/span&gt;&lt;span style="color: blue"&gt;="SizeWE"&lt;/span&gt;&lt;span style="color: red"&gt; Fill&lt;/span&gt;&lt;span style="color: blue"&gt;="Transparent"        &lt;br /&gt;                       &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: red"&gt;MouseLeftButtonDown&lt;/span&gt;&lt;span style="color: blue"&gt;="BeginWindowResize"        &lt;br /&gt;                       &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: red"&gt;MouseLeftButtonUp&lt;/span&gt;&lt;span style="color: blue"&gt;="EndWindowResize"        &lt;br /&gt;                       &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: red"&gt;MouseMove&lt;/span&gt;&lt;span style="color: blue"&gt;="WindowResize"&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="mso-spacerun: yes"&gt;                    &lt;br /&gt;             &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;Rectangle&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;gt;      &lt;br /&gt;             &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;TextBlock&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; VerticalAlignment&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;="Center"&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; HorizontalAlignment&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;="Center"&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;...&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;Body&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;TextBlock&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;gt;      &lt;br /&gt;        &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;Grid&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;gt;      &lt;br /&gt;        &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;TextBlock&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; Grid.Row&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;="2"&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; Text&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;="Footer"&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: red; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; ...&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;TextBlock&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&amp;gt;      &lt;br /&gt;      &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-no-proof: yes"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-no-proof: yes"&gt;Grid&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-no-proof: yes"&gt;&amp;gt;      &lt;br /&gt;    &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-no-proof: yes"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-no-proof: yes"&gt;Border&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-no-proof: yes"&gt;&amp;gt;      &lt;br /&gt;&lt;/span&gt;&lt;span style="line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-no-proof: yes"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: #a31515; font-size: 8pt; mso-no-proof: yes"&gt;Window&lt;/span&gt;&lt;span style="line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-no-proof: yes"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&lt;strong&gt;Code-behind (interaction logic):      &lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="line-height: normal; margin-bottom: 0pt; mso-layout-grid-align: none" class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;public&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; &lt;span style="color: blue"&gt;partial&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ShapedWindow&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;Window        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;{      &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;bool&lt;/span&gt; _isResizing = &lt;span style="color: blue"&gt;false&lt;/span&gt;;       &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; ShapedWindow()       &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;{      &lt;br /&gt;    &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;InitializeComponent();      &lt;br /&gt;    &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: #2b91af"&gt;CommandBinding&lt;/span&gt; binding = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;CommandBinding&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;ApplicationCommands&lt;/span&gt;.Close);       &lt;br /&gt;    &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;binding.Executed += CloseWindow;      &lt;br /&gt;    &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;this&lt;/span&gt;.CommandBindings.Add(binding);       &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;}      &lt;br /&gt;      &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; CloseWindow(&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af"&gt;RoutedEventArgs&lt;/span&gt; e) { &lt;span style="color: blue"&gt;this&lt;/span&gt;.Close(); }       &lt;br /&gt;      &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; BeginWindowResize(&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af"&gt;MouseButtonEventArgs&lt;/span&gt; e) { _isResizing = &lt;span style="color: blue"&gt;true&lt;/span&gt;; }       &lt;br /&gt;      &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; EndWindowResize(&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af"&gt;MouseButtonEventArgs&lt;/span&gt; e)       &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;{      &lt;br /&gt;    &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;_isResizing = &lt;span style="color: blue"&gt;false&lt;/span&gt;;       &lt;br /&gt;    &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: #2b91af"&gt;Rectangle&lt;/span&gt; rectangle = (&lt;span style="color: #2b91af"&gt;Rectangle&lt;/span&gt;)sender;       &lt;br /&gt;    &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;rectangle.ReleaseMouseCapture();      &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;}&lt;span style="mso-spacerun: yes"&gt;        &lt;br /&gt;        &lt;br /&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; WindowResize(&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af"&gt;MouseEventArgs&lt;/span&gt; e)       &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;{      &lt;br /&gt;    &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: #2b91af"&gt;Rectangle&lt;/span&gt; rectangle = (&lt;span style="color: #2b91af"&gt;Rectangle&lt;/span&gt;)sender;       &lt;br /&gt;    &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt; (_isResizing)       &lt;br /&gt;    &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;{      &lt;br /&gt;      &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;rectangle.CaptureMouse();      &lt;br /&gt;      &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;double&lt;/span&gt; newWidth = e.GetPosition(&lt;span style="color: blue"&gt;this&lt;/span&gt;).X + 5;       &lt;br /&gt;      &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt; (newWidth &amp;gt; 0) &lt;span style="color: blue"&gt;this&lt;/span&gt;.Width = newWidth;       &lt;br /&gt;    &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;}      &lt;br /&gt;   &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;}      &lt;br /&gt;      &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; WindowDragMove(&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af"&gt;MouseButtonEventArgs&lt;/span&gt; e)       &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;{&lt;span style="mso-spacerun: yes"&gt;            &lt;br /&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt; (e.ClickCount == 2) &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;this&lt;/span&gt;.WindowState = (&lt;span style="color: blue"&gt;this&lt;/span&gt;.WindowState == &lt;span style="color: #2b91af"&gt;WindowState&lt;/span&gt;.Maximized) ? &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: #2b91af; font-size: 8pt; mso-no-proof: yes"&gt;WindowState&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-no-proof: yes"&gt;.Normal : &lt;span style="color: #2b91af"&gt;WindowState&lt;/span&gt;.Maximized; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-no-proof: yes"&gt;     &lt;br /&gt;    &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;else&lt;/span&gt; &lt;span style="color: blue"&gt;this&lt;/span&gt;.DragMove();&lt;span style="mso-spacerun: yes"&gt;    &lt;br /&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-no-proof: yes"&gt;}&lt;span style="mso-spacerun: yes"&gt;       &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-no-proof: yes"&gt;}&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;Si nota subito che in una soluzione di questo tipo (non poteva essere altrimenti) è compito dello sviluppatore gestire sia il &lt;em&gt;resize&lt;/em&gt; che il &lt;em&gt;move&lt;/em&gt; della Window, dal momento che è assente la barra del titolo standard che l’utente usa comunemente per interagire con la finestra stessa.     &lt;br /&gt;Differentemente dal mondo Windows Forms, in WPF è possibile gestire la modalità di dragging della Window semplicemente invocando il metodo &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.window.dragmove.aspx" target="_blank"&gt;Window.DragMove()&lt;/a&gt; , che in questo caso specifico viene usato in corrispondenza dell’evento &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.uielement.mouseleftbuttondown.aspx" target="_blank"&gt;MouseLeftButtonDown&lt;/a&gt; scatenato sul TextBlock che funge da barra del titolo ( due click consecutivi invece “massimizzano” o “normalizzano” la finestra ;) ).     &lt;br /&gt;Per quanto riguarda invece il resize, la questione diventa un po’ più “complessa”. Anzitutto, impostare la proprietà &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.window.resizemode.aspx" target="_blank"&gt;Window.ResizeMode&lt;/a&gt; a &lt;em&gt;CanResizeWithGrip&lt;/em&gt; significa far apparire il sizing grip nell’angolo in basso a destra assumendo che la window sia comunque rettangolare. Questo significa quindi che esso può apparire o troppo distante o addirittura sopra l’effettivo bordo della Window.  &lt;br /&gt;Se non si vuole scegliere questo tipo di approccio, bensì si desidera poter ridimensionare manualmente la finestra interagendo con i suoi bordi effettivi, esistono due strade: o si utilizzano P/Invoke che inviano messaggi Win32 per ridimensionare la window, oppure più semplicemente (come in questo caso) si gestisce la posizione e l’azione scatenata dal mouse in ogni bordo che si vuole utilizzare per ridimensionare la finestra, andando poi a gestire di conseguenza la proprietà &lt;em&gt;Width&lt;/em&gt;.     &lt;br /&gt;Nell’esempio, si è scelto di posizionare un &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.shapes.rectangle(VS.95).aspx" target="_blank"&gt;Rectangle&lt;/a&gt; trasparente di larghezza 5 in corrsipondenza del lato destro della finestra. In questo modo gli opportuni event handler (&lt;em&gt;MouseLeftButtonDown&lt;/em&gt;, &lt;em&gt;MouseLeftButtonUp&lt;/em&gt;, &lt;em&gt;MouseMove&lt;/em&gt;) ci permettono di gestire il resize manuale della window ogni volta che il mouse interagisce con il bordo destro della stessa. &lt;/p&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:bdf6db91-9774-42c7-9c1d-544351d7abd2" class="wlWriterEditableSmartContent"&gt;Technorati Tag: &lt;a href="http://technorati.com/tags/WPF" rel="tag"&gt;WPF&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/dsantarelli/aggbug/97116.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dario Santarelli</dc:creator>
            <guid>http://blogs.ugidotnet.org/dsantarelli/archive/2009/09/26/wpf-window-non-rettangolari.aspx</guid>
            <pubDate>Sat, 26 Sep 2009 11:23:09 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/dsantarelli/comments/97116.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/dsantarelli/archive/2009/09/26/wpf-window-non-rettangolari.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/dsantarelli/comments/commentRss/97116.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/dsantarelli/services/trackbacks/97116.aspx</trackback:ping>
        </item>
        <item>
            <title>Screenshots di Forms, Windows e schermo</title>
            <category>WPF</category>
            <category>.NET</category>
            <link>http://blogs.ugidotnet.org/dsantarelli/archive/2009/09/08/screenshots-di-forms-windows-e-schermo.aspx</link>
            <description>&lt;p&gt;Spesso in ambiente desktop può essere utile salvare degli screenshot relativi alla UI della nostra applicazione: in alcuni scenari ad esempio, oltre ai soliti log e trace, è molto comodo avere automaticamente lo screenshot dell’UI al momento dell’errore, magari come allegato di una email di report.    &lt;br /&gt;Una comune soluzione in Windows Forms è quella che sfrutta GDI+ tramite il metodo &lt;a href="http://msdn.microsoft.com/it-it/library/system.drawing.graphics.copyfromscreen.aspx" target="_blank"&gt;Graphics.CopyFromScreen(…)&lt;/a&gt; . In questo post vorrei mostrare come anche in WPF è possibile approfittare della stessa tecnica con il minimo sforzo: in particolare, nell’ helper class che segue sono presenti degli overload del metodo &lt;em&gt;SaveScreenShot(…)&lt;/em&gt; per salvare su file system gli screenshot sia di singole Window (WPF) / Form (Windows Forms) che dell’intero schermo.     &lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; color: blue; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;public&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ScreenshotHelper        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;{      &lt;br /&gt;  &lt;span style="font-family: 'Courier New'; color: green; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes; mso-fareast-font-family: calibri; mso-fareast-theme-font: minor-latin; mso-fareast-language: en-us; mso-bidi-language: ar-sa" lang="EN-US"&gt;// Per Windows Forms&lt;/span&gt;...       &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; SaveScreenShot(&lt;span style="color: #2b91af"&gt;Form&lt;/span&gt; form, &lt;span style="color: blue"&gt;string&lt;/span&gt; fileName, &lt;span style="color: #2b91af"&gt;ImageFormat&lt;/span&gt; imageFormat)       &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;{      &lt;br /&gt;    &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;SaveScreenShot(form.Location, form.Size, fileName, imageFormat);      &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;}      &lt;br /&gt;      &lt;br /&gt;&lt;span style="font-family: 'Courier New'; color: green; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes; mso-fareast-font-family: calibri; mso-fareast-theme-font: minor-latin; mso-fareast-language: en-us; mso-bidi-language: ar-sa" lang="EN-US"&gt;  // Per WPF...&lt;/span&gt;  &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; SaveScreenShot(&lt;span style="color: #2b91af"&gt;Window&lt;/span&gt; window, &lt;span style="color: blue"&gt;string&lt;/span&gt; fileName, &lt;span style="color: #2b91af"&gt;ImageFormat&lt;/span&gt; imageFormat)       &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;{      &lt;br /&gt;    &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;SaveScreenShot(&lt;span style="color: blue"&gt;new&lt;/span&gt; System.Drawing.&lt;span style="color: #2b91af"&gt;Point&lt;/span&gt;((&lt;span style="color: blue"&gt;int&lt;/span&gt;)window.Left, (&lt;span style="color: blue"&gt;int&lt;/span&gt;)window.Top),       &lt;br /&gt;                   &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;new&lt;/span&gt; System.Drawing.&lt;span style="color: #2b91af"&gt;Size&lt;/span&gt;((&lt;span style="color: blue"&gt;int&lt;/span&gt;)window.Width, (&lt;span style="color: blue"&gt;int&lt;/span&gt;)window.Height),       &lt;br /&gt;                   &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;fileName, imageFormat);      &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;}      &lt;br /&gt;      &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; SaveScreenShot(System.Drawing.&lt;span style="color: #2b91af"&gt;Point&lt;/span&gt; windowLocation, System.Drawing.&lt;span style="color: #2b91af"&gt;Size&lt;/span&gt; windowSize,       &lt;br /&gt;                                     &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;string&lt;/span&gt; fileName, &lt;span style="color: #2b91af"&gt;ImageFormat&lt;/span&gt; imageFormat)       &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;{&lt;span style="mso-spacerun: yes"&gt;                       &lt;br /&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; (&lt;span style="color: #2b91af"&gt;Bitmap&lt;/span&gt; bitmap = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Bitmap&lt;/span&gt;(windowSize.Width, windowSize.Height))       &lt;br /&gt;    &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;{      &lt;br /&gt;      &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; (&lt;span style="color: #2b91af"&gt;Graphics&lt;/span&gt; graphics = &lt;span style="color: #2b91af"&gt;Graphics&lt;/span&gt;.FromImage(bitmap))       &lt;br /&gt;      &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;{      &lt;br /&gt;        &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;graphics.CopyFromScreen(windowLocation, &lt;span style="color: blue"&gt;new&lt;/span&gt; System.Drawing.&lt;span style="color: #2b91af"&gt;Point&lt;/span&gt;(0, 0), windowSize);       &lt;br /&gt;      &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;}      &lt;br /&gt;      &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;bitmap.Save(fileName, imageFormat);      &lt;br /&gt;    &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;}      &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;}  &lt;br /&gt;      &lt;br /&gt;&lt;/span&gt;&lt;span style="line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; color: green; font-size: 8pt; mso-no-proof: yes"&gt;  // Schermo intero...&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;      &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; SaveScreenShot(&lt;span style="color: blue"&gt;string&lt;/span&gt; fileName, &lt;span style="color: #2b91af"&gt;ImageFormat&lt;/span&gt; imageFormat)       &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;{      &lt;br /&gt;     &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: #2b91af"&gt;Rectangle&lt;/span&gt; bounds = &lt;span style="color: #2b91af"&gt;Screen&lt;/span&gt;.GetBounds(System.Drawing.&lt;span style="color: #2b91af"&gt;Point&lt;/span&gt;.Empty);       &lt;br /&gt;     &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; (&lt;span style="color: #2b91af"&gt;Bitmap&lt;/span&gt; bitmap = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Bitmap&lt;/span&gt;(bounds.Width, bounds.Height))       &lt;br /&gt;     &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;{      &lt;br /&gt;       &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; (&lt;span style="color: #2b91af"&gt;Graphics&lt;/span&gt; graphics = &lt;span style="color: #2b91af"&gt;Graphics&lt;/span&gt;.FromImage(bitmap))       &lt;br /&gt;       &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;{      &lt;br /&gt;         &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-ansi-language: en-us; mso-no-proof: yes" lang="EN-US"&gt;graphics.CopyFromScreen(System.Drawing.&lt;span style="color: #2b91af"&gt;Point&lt;/span&gt;.Empty, System.Drawing.&lt;span style="color: #2b91af"&gt;Point&lt;/span&gt;.Empty, bounds.Size);       &lt;br /&gt;       &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-no-proof: yes"&gt;}      &lt;br /&gt;       &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-no-proof: yes"&gt;bitmap.Save(fileName, imageFormat);      &lt;br /&gt;     &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-no-proof: yes"&gt;}      &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-no-proof: yes"&gt;}      &lt;br /&gt;&lt;/span&gt;&lt;span style="line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; font-size: 8pt; mso-no-proof: yes"&gt;}&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&lt;strong&gt;&lt;em&gt;Nota&lt;/em&gt;&lt;/strong&gt;: Questo metodo non riesce a catturare controlli trasparenti. Per gestirli occorre utilizzare altri metodi, nativi di GDI+, come mostrato in &lt;a href="http://blog.developers.ba/post/2009/09/03/Screenshot-your-WPF-application.aspx" target="_blank"&gt;questo post&lt;/a&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:68d14aa8-6fe4-48f9-8aad-aa6613343f47" class="wlWriterEditableSmartContent"&gt;Technorati Tag: &lt;a href="http://technorati.com/tags/WPF" rel="tag"&gt;WPF&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Windows+Forms" rel="tag"&gt;Windows Forms&lt;/a&gt;,&lt;a href="http://technorati.com/tags/GDI%2b" rel="tag"&gt;GDI+&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/dsantarelli/aggbug/97020.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dario Santarelli</dc:creator>
            <guid>http://blogs.ugidotnet.org/dsantarelli/archive/2009/09/08/screenshots-di-forms-windows-e-schermo.aspx</guid>
            <pubDate>Tue, 08 Sep 2009 21:29:44 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/dsantarelli/comments/97020.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/dsantarelli/archive/2009/09/08/screenshots-di-forms-windows-e-schermo.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/dsantarelli/comments/commentRss/97020.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/dsantarelli/services/trackbacks/97020.aspx</trackback:ping>
        </item>
        <item>
            <title>[WPF] Application Shutdown</title>
            <category>WPF</category>
            <link>http://blogs.ugidotnet.org/dsantarelli/archive/2009/08/26/wpf-application-shutdown.aspx</link>
            <description>&lt;p&gt;In un’ applicazione WPF, per default la classe &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.application.aspx" target="_blank"&gt;Application&lt;/a&gt; mantiene viva l’applicazione stessa finché almeno una finestra è ancora aperta. Se si vuole cambiare questo comportamento, è possibile utilizzare la proprietà &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.application.shutdownmode.aspx" target="_blank"&gt;Application.ShutdownMode&lt;/a&gt; direttamente dal markup XAML:    &lt;br /&gt;( ATTENZIONE: se si istanzia l’oggetto &lt;em&gt;Application&lt;/em&gt; a mano, è obbligatorio impostare la proprietà &lt;em&gt;ShutdownMode&lt;/em&gt; prima di invocare il metodo &lt;em&gt;Run()&lt;/em&gt; )    &lt;br /&gt;    &lt;br /&gt;&lt;img src="http://img15.imageshack.us/img15/661/immaginewyy.jpg" /&gt;    &lt;br /&gt;    &lt;br /&gt;I valori ammissibili per tale proprietà sono:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;OnLastWindowClose (default)&lt;/strong&gt;: l’applicazione WPF rimane in vita fintantoché esiste almeno una Window attiva. Se si chiude la MainWindow, la proprietà &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.application.mainwindow.aspx" target="_blank"&gt;Application.MainWindow&lt;/a&gt; continua a puntare alla MainWindow chiusa. In questo tipo di situazione, si può quindi scegliere di ri-assegnare da codice la proprietà MainWindow in modo tale che essa punti ad una Window differente.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;OnMainWindowClose&lt;/strong&gt;: l’applicazione WPF rimane viva fintantoché la MainWindow è aperta. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;OnExplicitShutdown&lt;/strong&gt;: L’applicazione WPF rimane viva fintantoché non viene chiamato esplicitamente il metodo &lt;a href="http://msdn.microsoft.com/en-us/library/ms597013.aspx" target="_blank"&gt;Application.Shutdown()&lt;/a&gt;, anche se tutte le Window sono chiuse. E’ chiaro che questo approccio ha senso nel caso in cui occorra gestire una logica complessa per stabilire se e quando la nostra applicazione debba chiudersi. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Un paio di note: &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Indipendentemente dal meccanismo di shutdown scelto, il metodo &lt;em&gt;Application.Shutdown()&lt;/em&gt; è sempre valido per iniziare il processo di terminazione dell’applicazione:  dietro le quinte, infatti, il metodo &lt;em&gt;Application.Shutdown()&lt;/em&gt; non fa altro che scatenare l’uscita dal metodo &lt;em&gt;Application.Run()&lt;/em&gt;, il che (occhio!) non preserva dall’esecuzione di eventuale codice aggiuntivo nel &lt;em&gt;Main()&lt;/em&gt; o nel gestore dell’evento &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.application.exit(VS.95).aspx" target="_blank"&gt;Application.Exit&lt;/a&gt;.&lt;/li&gt;    &lt;li&gt;Quando &lt;em&gt;ShutdownMode=”OnMainWindowClose”&lt;/em&gt; e viene chiusa la MainWindow, l’oggetto &lt;em&gt;Application&lt;/em&gt; chiude automaticamente tutte le altre finestre prima che il contesto di esecuzione esca dal metodo Run(), analogamente a quanto avviene invocando il metodo &lt;em&gt;Application.Shutdown()&lt;/em&gt;.&lt;/li&gt; &lt;/ol&gt;  &lt;p&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:715d5cd2-d9ce-436b-aa02-06e256deae84" class="wlWriterEditableSmartContent"&gt;Technorati Tag: &lt;a href="http://technorati.com/tags/WPF" rel="tag"&gt;WPF&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Shutdown" rel="tag"&gt;Shutdown&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/dsantarelli/aggbug/96925.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dario Santarelli</dc:creator>
            <guid>http://blogs.ugidotnet.org/dsantarelli/archive/2009/08/26/wpf-application-shutdown.aspx</guid>
            <pubDate>Wed, 26 Aug 2009 12:08:06 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/dsantarelli/comments/96925.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/dsantarelli/archive/2009/08/26/wpf-application-shutdown.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/dsantarelli/comments/commentRss/96925.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/dsantarelli/services/trackbacks/96925.aspx</trackback:ping>
        </item>
        <item>
            <title>LINQ to CSV</title>
            <category>.NET</category>
            <link>http://blogs.ugidotnet.org/dsantarelli/archive/2009/04/27/linq-to-csv.aspx</link>
            <description>&lt;p&gt;Veramente utile!!! :D&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;&lt;a href="http://www.codeproject.com/KB/linq/LINQtoCSV.aspx"&gt;http://www.codeproject.com/KB/linq/LINQtoCSV.aspx&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;
&lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:29498a2b-252a-48c5-9659-365f84b2e2ea" style="PADDING-RIGHT: 0px; DISPLAY: inline; PADDING-LEFT: 0px; FLOAT: none; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"&gt;Technorati Tag: &lt;a rel="tag" href="http://technorati.com/tags/LINQ"&gt;LINQ&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/CSV"&gt;CSV&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/dsantarelli/aggbug/96054.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dario Santarelli</dc:creator>
            <guid>http://blogs.ugidotnet.org/dsantarelli/archive/2009/04/27/linq-to-csv.aspx</guid>
            <pubDate>Mon, 27 Apr 2009 14:35:37 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/dsantarelli/comments/96054.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/dsantarelli/archive/2009/04/27/linq-to-csv.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/dsantarelli/comments/commentRss/96054.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/dsantarelli/services/trackbacks/96054.aspx</trackback:ping>
        </item>
        <item>
            <title>[WPF] ICommand e CanExecute</title>
            <category>WPF</category>
            <link>http://blogs.ugidotnet.org/dsantarelli/archive/2009/04/02/wpf-icommand-e-canexecute.aspx</link>
            <description>&lt;p&gt;Per chi sviluppa utilizzando il pattern M-V-VM l’interfaccia &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.input.icommand.aspx" target="_blank"&gt;ICommand&lt;/a&gt; costituisce la base per costruire un’infrastruttura che permetta alla View di invocare comandi applicativi direttamente nel ViewModel. L’interfaccia mette a disposizione tre semplici membri: due metodi &lt;em&gt;Execute(...)&lt;/em&gt;, &lt;em&gt;CanExecute(...)&lt;/em&gt; ed un evento &lt;em&gt;CanExecuteChanged&lt;/em&gt;. E’ facile immaginare come in progetti di una certa consistenza sia necessario costruirsi delle implementazioni spesso particolari dell’interfaccia ICommand, cosa che da una parte implica tanta buona volontà, dall’altra ripaga quando si dormono sonni tranquilli pensando ad una View completamente svincolata dalla logica applicativa.    &lt;br /&gt;In genere un’ utile implementazione di ICommand poggia sull’ intercettazione dell’evento &lt;em&gt;CanExecuteChanged&lt;/em&gt; in modo da poter esporre alla View informazioni sul fatto che il nostro command sia o meno eseguibile ( si pensi ad esempio ad un Button enabled o meno ). A mio modo di vedere, una limitazione dell’interfaccia ICommand risiede nel metodo &lt;em&gt;CanExecute(…)&lt;/em&gt; , il quale appunto è un metodo ( con annesso parametro opzionale ) e non una proprietà, cosa che non mette a disposizione il classico pattern &lt;em&gt;Property&lt;/em&gt;/&lt;em&gt;PropertyChanged&lt;/em&gt; sfruttabile nei data binding tra ViewModel e View.  &lt;br /&gt;E’ semplice ovviare a questa situazione: ad esempio si può fare in modo che il nostro ICommand implementi una sorta di proprietà “wrapper” per esporre un sistema binding-friendly &lt;em&gt;CanExecute&lt;/em&gt;/&lt;em&gt;CanExecuteChanged&lt;/em&gt;.    &lt;br /&gt;Vediamo un esempio pratico. In una mia applicazione WPF avevo bisogno di realizzare un VM per una Window di Login e volevo “bindare” la proprietà &lt;em&gt;CanLogin&lt;/em&gt; del VM ( che semplicemente ritorna &lt;em&gt;true&lt;/em&gt; se UserName e Password sono entrambi valorizzati ) direttamente con il metodo &lt;em&gt;CanExecute(…)&lt;/em&gt; del mio ICommand.     &lt;br /&gt;    &lt;br /&gt;Ho quindi realizzato un’implementazione di ICommand (chiamata senza fantasia &lt;em&gt;CanExecuteCommand&lt;/em&gt;) che accetta:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Un Delegate da eseguire all’interno dell’ &lt;em&gt;Execute(…)&lt;/em&gt;&lt;/li&gt;    &lt;li&gt;Un oggetto di tipo &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.data.binding.aspx" target="_blank"&gt;Binding&lt;/a&gt; che rappresenta il binding tra una proprietà “wrapper” per il metodo &lt;em&gt;CanExecute(…)&lt;/em&gt; dell’ ICommand (nello specifico &lt;em&gt;CanExecuteAction)&lt;/em&gt; e una proprietà del ViewModel (nello specifico &lt;em&gt;CanLogin&lt;/em&gt;) in modo da poter scatenare l’evento &lt;em&gt;CanExecuteChanged&lt;/em&gt; proprio al variare della proprietà &lt;em&gt;CanLogin&lt;/em&gt; del ViewModel. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Difficile da spiegare, facile da implementare :D&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Command:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;public&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;CanExecuteCommand&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;DependencyObject&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;ICommand       &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;{     &lt;br /&gt;   &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: #2b91af"&gt;Action&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;object&lt;/span&gt;&amp;gt; _executeDelegate;      &lt;br /&gt;   &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;event&lt;/span&gt; &lt;span style="color: #2b91af"&gt;EventHandler&lt;/span&gt; CanExecuteChanged;      &lt;br /&gt;      &lt;br /&gt;   &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;bool&lt;/span&gt; CanExecuteAction      &lt;br /&gt;   &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;{     &lt;br /&gt;     &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;get&lt;/span&gt; { &lt;span style="color: blue"&gt;return&lt;/span&gt; (&lt;span style="color: blue"&gt;bool&lt;/span&gt;)GetValue(CanExecuteActionProperty); }      &lt;br /&gt;     &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;set&lt;/span&gt; { SetValue(CanExecuteActionProperty, &lt;span style="color: blue"&gt;value&lt;/span&gt;); }      &lt;br /&gt;   &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;}     &lt;br /&gt;      &lt;br /&gt;   &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;readonly&lt;/span&gt; &lt;span style="color: #2b91af"&gt;DependencyProperty&lt;/span&gt; CanExecuteActionProperty =       &lt;br /&gt;          &lt;span style="color: #2b91af"&gt;DependencyProperty&lt;/span&gt;.Register(&lt;span style="color: #a31515"&gt;"CanExecuteAction"&lt;/span&gt;, &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: blue"&gt;bool&lt;/span&gt;), &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;CanExecuteCommand&lt;/span&gt;),       &lt;br /&gt;                                      &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;PropertyMetadata&lt;/span&gt;(OnCanExecuteActionChanged));      &lt;br /&gt;      &lt;br /&gt;   &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; CanExecuteCommand(&lt;span style="color: #2b91af"&gt;Action&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;object&lt;/span&gt;&amp;gt; executeDelegate) : &lt;span style="color: blue"&gt;this&lt;/span&gt;(executeDelegate, &lt;span style="color: blue"&gt;null&lt;/span&gt;) { }      &lt;br /&gt;      &lt;br /&gt;   &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; CanExecuteCommand(&lt;span style="color: #2b91af"&gt;Action&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;object&lt;/span&gt;&amp;gt; executeDelegate, &lt;span style="color: #2b91af"&gt;Binding&lt;/span&gt; canExecuteActionBinding)      &lt;br /&gt;   &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;{     &lt;br /&gt;      &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;_executeDelegate = executeDelegate;     &lt;br /&gt;      &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt; (canExecuteActionBinding != &lt;span style="color: blue"&gt;null&lt;/span&gt;) &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: #2b91af"&gt;BindingOperations&lt;/span&gt;.SetBinding(&lt;span style="color: blue"&gt;this&lt;/span&gt;, CanExecuteActionProperty, canExecuteActionBinding);&lt;span style="mso-spacerun: yes"&gt;            &lt;br /&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;}     &lt;br /&gt;      &lt;br /&gt;   &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;#region&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt; ICommand Members     &lt;br /&gt;      &lt;br /&gt;   &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; Execute(&lt;span style="color: blue"&gt;object&lt;/span&gt; parameter) { _executeDelegate(parameter); }      &lt;br /&gt;      &lt;br /&gt;   &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;bool&lt;/span&gt; CanExecute(&lt;span style="color: blue"&gt;object&lt;/span&gt; parameter) { &lt;span style="color: blue"&gt;return&lt;/span&gt; CanExecuteAction; }      &lt;br /&gt;      &lt;br /&gt;   &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;#endregion     &lt;br /&gt;      &lt;br /&gt;   &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; RaiseCanExecuteActionChanged()      &lt;br /&gt;   &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;{      &lt;br /&gt;     &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt; (CanExecuteChanged != &lt;span style="color: blue"&gt;null&lt;/span&gt;) CanExecuteChanged(&lt;span style="color: blue"&gt;this&lt;/span&gt;, &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;EventArgs&lt;/span&gt;());       &lt;br /&gt;   &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;}     &lt;br /&gt;      &lt;br /&gt;   &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; OnCanExecuteActionChanged(&lt;span style="color: #2b91af"&gt;DependencyObject&lt;/span&gt; dependencyObject, &lt;span style="color: #2b91af"&gt;DependencyPropertyChangedEventArgs&lt;/span&gt; args)      &lt;br /&gt;   &lt;/span&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;{     &lt;br /&gt;    &lt;/span&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;(dependencyObject &lt;span style="color: blue"&gt;as&lt;/span&gt; &lt;span style="color: #2b91af"&gt;CanExecuteCommand&lt;/span&gt;).RaiseCanExecuteActionChanged();      &lt;br /&gt;   &lt;/span&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;}&lt;span style="mso-spacerun: yes"&gt;                       &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;}&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;ViewModel:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;public&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;LoginViewModel&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;ILoginViewModel&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;INotifyPropertyChanged       &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;{     &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; _username;      &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; _password;      &lt;br /&gt;      &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;event&lt;/span&gt; &lt;span style="color: #2b91af"&gt;PropertyChangedEventHandler&lt;/span&gt; PropertyChanged;      &lt;br /&gt;      &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ICommand&lt;/span&gt; ReadyCommand { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;set&lt;/span&gt;; } &lt;/span&gt;&lt;span style="font-size: 8pt; color: green; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;// In Binding con la View     &lt;br /&gt;      &lt;br /&gt; &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;#region&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt; ILoginViewModel Members     &lt;br /&gt;      &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; UserName &lt;span style="font-size: 8pt; color: green; line-height: 115%; font-family: 'Courier New'; mso-no-proof: yes"&gt;// In Binding con la View&lt;/span&gt;      &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;{     &lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;get&lt;/span&gt; { &lt;span style="color: blue"&gt;return&lt;/span&gt; _username; }      &lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;set       &lt;br /&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;{     &lt;br /&gt;      &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt; (_username != &lt;span style="color: blue"&gt;value&lt;/span&gt;)      &lt;br /&gt;      &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;{     &lt;br /&gt;        &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;_username = &lt;span style="color: blue"&gt;value&lt;/span&gt;;      &lt;br /&gt;        &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;RaisePropertyChanged(&lt;span style="color: #a31515"&gt;"UserName"&lt;/span&gt;);      &lt;br /&gt;        &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;RaisePropertyChanged(&lt;span style="color: #a31515"&gt;"CanLogin"&lt;/span&gt;);       &lt;br /&gt;      &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;}     &lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;}     &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;}     &lt;br /&gt;      &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; Password &lt;span style="font-size: 8pt; color: green; line-height: 115%; font-family: 'Courier New'; mso-no-proof: yes"&gt;// In Binding con la View&lt;/span&gt;      &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;{     &lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;get&lt;/span&gt; { &lt;span style="color: blue"&gt;return&lt;/span&gt; _password; }      &lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;set       &lt;br /&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;{     &lt;br /&gt;      &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt; (_password != &lt;span style="color: blue"&gt;value&lt;/span&gt;)      &lt;br /&gt;      &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;{     &lt;br /&gt;        &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;_password = &lt;span style="color: blue"&gt;value&lt;/span&gt;;      &lt;br /&gt;        &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;RaisePropertyChanged(&lt;span style="color: #a31515"&gt;"Password"&lt;/span&gt;);      &lt;br /&gt;        &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;RaisePropertyChanged(&lt;span style="color: #a31515"&gt;"CanLogin"&lt;/span&gt;);&lt;span style="mso-spacerun: yes"&gt;                    &lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;}     &lt;br /&gt;     &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;}     &lt;br /&gt;   &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;}     &lt;br /&gt;      &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;bool&lt;/span&gt; CanLogin      &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;{     &lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;get&lt;/span&gt; { &lt;span style="color: blue"&gt;return&lt;/span&gt; !&lt;span style="color: blue"&gt;string&lt;/span&gt;.IsNullOrEmpty(UserName) &amp;amp;&amp;amp; !&lt;span style="color: blue"&gt;string&lt;/span&gt;.IsNullOrEmpty(Password); }      &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;}     &lt;br /&gt;      &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; Login()      &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;{     &lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: green"&gt;//... Do Login...&lt;span style="mso-spacerun: yes"&gt;            &lt;br /&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;}     &lt;br /&gt;      &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;#endregion     &lt;br /&gt;      &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; LoginViewModel()      &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;{     &lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: #2b91af"&gt;Binding&lt;/span&gt; binding = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Binding&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"CanLogin"&lt;/span&gt;);      &lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;binding.Source = &lt;span style="color: blue"&gt;this&lt;/span&gt;;      &lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;ReadyCommand = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;CanExecuteCommand&lt;/span&gt;((arg) =&amp;gt; Login(), binding);&lt;span style="mso-spacerun: yes"&gt;            &lt;br /&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;}     &lt;br /&gt;      &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; RaisePropertyChanged(&lt;span style="color: blue"&gt;string&lt;/span&gt; propertyName)      &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;{     &lt;br /&gt;   &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt; (PropertyChanged != &lt;span style="color: blue"&gt;null&lt;/span&gt;) PropertyChanged(&lt;span style="color: blue"&gt;this&lt;/span&gt;, &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;PropertyChangedEventArgs&lt;/span&gt;(propertyName));      &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;}&lt;span style="mso-spacerun: yes"&gt;       &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;}&lt;/span&gt;&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:29498a2b-252a-48c5-9659-365f84b2e2ea" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tag: &lt;a href="http://technorati.com/tags/WPF" rel="tag"&gt;WPF&lt;/a&gt;,&lt;a href="http://technorati.com/tags/ICommand" rel="tag"&gt;ICommand&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/dsantarelli/aggbug/95863.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dario Santarelli</dc:creator>
            <guid>http://blogs.ugidotnet.org/dsantarelli/archive/2009/04/02/wpf-icommand-e-canexecute.aspx</guid>
            <pubDate>Thu, 02 Apr 2009 18:18:39 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/dsantarelli/comments/95863.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/dsantarelli/archive/2009/04/02/wpf-icommand-e-canexecute.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/dsantarelli/comments/commentRss/95863.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/dsantarelli/services/trackbacks/95863.aspx</trackback:ping>
        </item>
        <item>
            <title>[Silverlight/WPF] Resource file e Access Modifier</title>
            <category>WPF</category>
            <category>Silverlight</category>
            <link>http://blogs.ugidotnet.org/dsantarelli/archive/2009/03/19/silverlightwpf-resource-file-e-access-modifier.aspx</link>
            <description>&lt;p&gt;Più volte nello sviluppo Silverlight/WPF mi sono imbattuto nella necessità di utilizzare i file di risorsa (.resx) e devo dire che le prime volte mi sono trovato un po’ in difficoltà dal momento che non riuscivo a capire per quale arcano i miei binding dichiarativi nel codice XAML verso le mie risorse non funzionassero affatto. Andiamo per ordine: supponendo di definire un file di risorsa in questo modo ...   &lt;br /&gt;    &lt;br /&gt; &lt;img src="http://www.freeimagehosting.net/uploads/95dd81a145.jpg" border="0" /&gt;    &lt;br /&gt;  &lt;br /&gt;... in fase di design Visual Studio notifica uno “strano” errore, &lt;/p&gt;  &lt;p&gt; &lt;img src="http://www.freeimagehosting.net/uploads/13accfadb5.jpg" border="0" /&gt;&lt;/p&gt;  &lt;p&gt;indipendentemente dal fatto che si utilizzi &lt;em&gt;Public&lt;/em&gt; o &lt;em&gt;Internal&lt;/em&gt; come access modifier (più precisamente se si selezionasse &lt;em&gt;Internal&lt;/em&gt; l’errore diverrebbe &lt;strong&gt;AG_E_PARSER_BAD_TYPE&lt;/strong&gt;). Mantenendo l’access modifier come “Public” ed andando a vedere il codice autogenerato da Visual Studio ci si imbatte in questa piccola “finezza”:&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&lt;img src="http://www.freeimagehosting.net/uploads/6224491ed3.jpg" /&gt;     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Classe &lt;em&gt;public&lt;/em&gt; e costruttore &lt;em&gt;internal&lt;/em&gt;!!!&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;Personalmente ho sempre ovviato al problema nel modo più semplice, impostando il costruttore come &lt;em&gt;public&lt;/em&gt; per ogni file di risorsa. Oggi invece mi imbatto in &lt;a href="http://www.houseofbilz.com/archive/2009/03/15/binding-to-resources-in-silverlightwpf.aspx" target="_blank"&gt;questo post&lt;/a&gt; che propone invece una soluzione più elegante a cui non avevo proprio pensato, ovvero realizzare semplicemente una classe pubblica con una singola proprietà che espone la classe associata al file di risorsa. SEMPLICE MA GENIALE!!!&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:f4dab442-945a-4413-8370-a28580bfa527" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tag: &lt;a href="http://technorati.com/tags/Silverlight+2" rel="tag"&gt;Silverlight 2&lt;/a&gt;,&lt;a href="http://technorati.com/tags/WPF" rel="tag"&gt;WPF&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/dsantarelli/aggbug/95753.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dario Santarelli</dc:creator>
            <guid>http://blogs.ugidotnet.org/dsantarelli/archive/2009/03/19/silverlightwpf-resource-file-e-access-modifier.aspx</guid>
            <pubDate>Thu, 19 Mar 2009 22:02:41 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/dsantarelli/comments/95753.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/dsantarelli/archive/2009/03/19/silverlightwpf-resource-file-e-access-modifier.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/dsantarelli/comments/commentRss/95753.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/dsantarelli/services/trackbacks/95753.aspx</trackback:ping>
        </item>
        <item>
            <title>[Silverlight 2] Visibility e VisualStateManager</title>
            <category>Silverlight</category>
            <link>http://blogs.ugidotnet.org/dsantarelli/archive/2009/03/16/silverlight-2-visibility-e-visualstatemanager.aspx</link>
            <description>&lt;p&gt;Una caratteristica di un controllo visuale che spesso e volentieri risulta gradevole è la possibilità di mostrare/nascondere il contenuto del controllo stesso tramite un effetto FadeIn/FadeOut. In genere, questo effetto è realizzato tramite una semplice animazione che lavora sull’&lt;em&gt;Opacity&lt;/em&gt; del controllo (portandola da 1 a 0 e viceversa) e che magari imposta a &lt;em&gt;Visible&lt;/em&gt;/&lt;em&gt;Collapsed&lt;/em&gt; la proprietà &lt;em&gt;Visibility&lt;/em&gt; subito dopo l’animazione in modo da riempire/liberare istantaneamente un’area specifica dello schermo.  In molti casi risulta dunque utile legare l’ effetto FadeIn/FadeOut proprio alla proprietà &lt;em&gt;Visibility&lt;/em&gt; del controllo, in modo da ottenere automaticamente le animazioni desiderate al momento della valorizzazione della proprietà (che altrimenti non effettuerebbe ovviamente alcun effetto visuale di transizione). Un modo che ritengo molto interessante per ottenere questo tipo di scenario sfrutta il &lt;a target="_blank" href="http://msdn.microsoft.com/it-it/library/system.windows.visualstatemanager(VS.95).aspx"&gt;VisualStateManager&lt;/a&gt; &lt;em&gt;: &lt;/em&gt;nel seguente esempio vediamo come sia possibile effettuare &lt;strong&gt;l’override della proprietà Visibility&lt;/strong&gt; di un UserControl per agganciare gli effetti di FadeIn/FadeOut agli stati &lt;em&gt;Visible/&lt;/em&gt;&lt;em&gt;Collapsed&lt;/em&gt; definiti tramite VisualStateManager&lt;em&gt;.&lt;/em&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;em&gt;MyControl.xaml&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;lt;&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;UserControl&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: red; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt; &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: red; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;xmlns&lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;:&lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: red; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;vsm&lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;="clr-namespace:System.Windows;assembly=System.Windows" &lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: red; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;...&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&lt;span style="COLOR: blue"&gt;&amp;gt; &lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;lt;&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;Grid&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: red; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt; x&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;:&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: red; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;Name&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;="LayoutRoot"&amp;gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt; &lt;br /&gt;
      &lt;br /&gt;
     &lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;lt;&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;vsm&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;:&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;VisualStateManager.VisualStateGroups&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;gt; &lt;br /&gt;
         &lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;lt;&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;vsm&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;:&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;VisualStateGroup&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: red; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt; x&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;:&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: red; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;Name&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;="CommonStates"&amp;gt; &lt;br /&gt;
&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;           &lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;lt;&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;vsm&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;:&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;VisualState&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: red; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt; x&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;:&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: red; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;Name&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;="Visible"&amp;gt; &lt;br /&gt;
             &lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;lt;&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;Storyboard&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;gt; &lt;br /&gt;
               &lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;lt;&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;DoubleAnimation&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: red; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt; Duration&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;="0:0:.5"&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: red; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt; Storyboard.TargetName&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;="LayoutRoot"&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: red; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt; Storyboard.TargetProperty&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;="Opacity"&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt; &lt;br /&gt;
                                &lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&lt;span style="COLOR: red"&gt;From&lt;/span&gt;&lt;span style="COLOR: blue"&gt;="0"&lt;/span&gt;&lt;span style="COLOR: red"&gt; To&lt;/span&gt;&lt;span style="COLOR: blue"&gt;="1"&lt;/span&gt;&lt;span style="COLOR: red"&gt; AutoReverse&lt;/span&gt;&lt;span style="COLOR: blue"&gt;="False" &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: red; LINE-HEIGHT: 115%; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;Completed&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; LINE-HEIGHT: 115%; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;="VisibleCompleted"&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt; &lt;span style="COLOR: blue"&gt;/&amp;gt; &lt;br /&gt;
             &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;Storyboard&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;gt; &lt;br /&gt;
           &lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;vsm&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;:&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;VisualState&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;gt; &lt;br /&gt;
           &lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;lt;&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;vsm&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;:&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;VisualState&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: red; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt; x&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;:&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: red; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;Name&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;="Collapsed"&amp;gt; &lt;br /&gt;
             &lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;lt;&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;Storyboard&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;gt; &lt;br /&gt;
               &lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;lt;&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;DoubleAnimation&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: red; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt; Duration&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;="0:0:.5"&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: red; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt; Storyboard.TargetName&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;="LayoutRoot"&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: red; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt; Storyboard.TargetProperty&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;="Opacity"&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt; &lt;br /&gt;
                                &lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&lt;span style="COLOR: red"&gt;From&lt;/span&gt;&lt;span style="COLOR: blue"&gt;="1"&lt;/span&gt;&lt;span style="COLOR: red"&gt; To&lt;/span&gt;&lt;span style="COLOR: blue"&gt;="0"&lt;/span&gt;&lt;span style="COLOR: red"&gt; AutoReverse&lt;/span&gt;&lt;span style="COLOR: blue"&gt;="False"&lt;/span&gt;&lt;span style="COLOR: red"&gt; Completed&lt;/span&gt;&lt;span style="COLOR: blue"&gt;="CollapsedCompleted" /&amp;gt; &lt;br /&gt;
             &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;Storyboard&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;gt; &lt;br /&gt;
           &lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;vsm&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;:&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;VisualState&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;gt; &lt;br /&gt;
         &lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;vsm&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;:&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;VisualStateGroup&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;gt; &lt;br /&gt;
      &lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;vsm&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;:&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;VisualStateManager.VisualStateGroups&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
      ...  &lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;    &lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;Grid&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;gt; &lt;br /&gt;
&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;UserControl&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;strong&gt;&lt;em&gt;&lt;br /&gt;
MyControl&lt;/em&gt;&lt;/strong&gt;.xaml.cs&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;public&lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt; &lt;span style="COLOR: blue"&gt;partial&lt;/span&gt; &lt;span style="COLOR: blue"&gt;class&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;MyControl&lt;/span&gt; : &lt;span style="COLOR: #2b91af"&gt;UserControl &lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;{ &lt;br /&gt;
  &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="COLOR: blue"&gt;private&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;Visibility&lt;/span&gt; _visibility;&lt;span style="mso-spacerun: yes"&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;br /&gt;
&lt;br /&gt;
  &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;event&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;EventHandler&lt;/span&gt; VisibilityChanged;&lt;span style="mso-spacerun: yes"&gt;         &lt;br /&gt;
  &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;br /&gt;
  &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt; MyControl() { InitializeComponent(); } &lt;br /&gt;
&lt;br /&gt;
  &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;Visibility&lt;/span&gt; Visibility &lt;br /&gt;
  &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;{ &lt;br /&gt;
     &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="COLOR: blue"&gt;get&lt;/span&gt; { &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; _visibility; } &lt;br /&gt;
     &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="COLOR: blue"&gt;set &lt;br /&gt;
     &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;{ &lt;br /&gt;
       &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (_visibility != &lt;span style="COLOR: blue"&gt;value&lt;/span&gt;) &lt;br /&gt;
       &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;{ &lt;br /&gt;
         &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;_visibility = &lt;span style="COLOR: blue"&gt;value&lt;/span&gt;; &lt;br /&gt;
         &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;OnVisibilityChanged(); &lt;br /&gt;
       &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;} &lt;br /&gt;
      &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;} &lt;br /&gt;
  &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;} &lt;br /&gt;
&lt;br /&gt;
  &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="COLOR: blue"&gt;protected&lt;/span&gt; &lt;span style="COLOR: blue"&gt;virtual&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; OnVisibilityChanged() &lt;br /&gt;
  &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;{ &lt;br /&gt;
     &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (&lt;span style="COLOR: blue"&gt;this&lt;/span&gt;.Visibility == &lt;span style="COLOR: #2b91af"&gt;Visibility&lt;/span&gt;.Visible) &lt;br /&gt;
     &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;{ &lt;br /&gt;
       &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="COLOR: blue"&gt;base&lt;/span&gt;.Visibility = &lt;span style="COLOR: blue"&gt;this&lt;/span&gt;.Visibility; &lt;br /&gt;
       &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="COLOR: #2b91af"&gt;VisualStateManager&lt;/span&gt;.GoToState(&lt;span style="COLOR: blue"&gt;this&lt;/span&gt;, &lt;span style="COLOR: #a31515"&gt;"Visible"&lt;/span&gt;, &lt;span style="COLOR: blue"&gt;true&lt;/span&gt;); &lt;br /&gt;
     &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;} &lt;br /&gt;
     &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="COLOR: blue"&gt;else&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;VisualStateManager&lt;/span&gt;.GoToState(&lt;span style="COLOR: blue"&gt;this&lt;/span&gt;, &lt;span style="COLOR: #a31515"&gt;"Collapsed"&lt;/span&gt;, &lt;span style="COLOR: blue"&gt;true&lt;/span&gt;);&lt;span style="mso-spacerun: yes"&gt;             &lt;br /&gt;
  &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;} &lt;br /&gt;
&lt;br /&gt;
  &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="COLOR: blue"&gt;private&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; CollapsedCompleted(&lt;span style="COLOR: blue"&gt;object&lt;/span&gt; sender, &lt;span style="COLOR: #2b91af"&gt;EventArgs&lt;/span&gt; e) &lt;br /&gt;
  &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;{ &lt;br /&gt;
     &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="COLOR: blue"&gt;base&lt;/span&gt;.Visibility = &lt;span style="COLOR: blue"&gt;this&lt;/span&gt;.Visibility; &lt;br /&gt;
     &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;FireVisibilityChanged(); &lt;br /&gt;
  &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;}&lt;span style="mso-spacerun: yes"&gt;        &lt;br /&gt;
&lt;br /&gt;
  &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="COLOR: blue"&gt;private&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; VisibleCompleted(&lt;span style="COLOR: blue"&gt;object&lt;/span&gt; sender, &lt;span style="COLOR: #2b91af"&gt;EventArgs&lt;/span&gt; e) { FireVisibilityChanged(); } &lt;br /&gt;
&lt;br /&gt;
  &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="COLOR: blue"&gt;private&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; FireVisibilityChanged() &lt;br /&gt;
  &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;{ &lt;br /&gt;
     &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (VisibilityChanged != &lt;span style="COLOR: blue"&gt;null&lt;/span&gt;) VisibilityChanged(&lt;span style="COLOR: blue"&gt;this&lt;/span&gt;, &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;EventArgs&lt;/span&gt;());&lt;span style="mso-spacerun: yes"&gt;   &lt;br /&gt;
  &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;} &lt;br /&gt;
&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; LINE-HEIGHT: 115%; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;}&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;Come si può notare, nell’esempio si è voluto implementare anche un evento &lt;em&gt;VisibilityChanged&lt;/em&gt; che viene scatenato ogni volta che l’animazione FadeIn/FadeOut ha terminato la propria esecuzione. Infatti, la transizione visuale da uno stato &lt;em&gt;Visible&lt;/em&gt; ad uno stato &lt;em&gt;Collapsed&lt;/em&gt; può essere relativamente lunga e di conseguenza potrebbe essere utile sapere esattamente quando il nostro controllo è completamente visibile/nascosto.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div&gt;Technorati Tag: &lt;a rel="tag" href="http://technorati.com/tags/Silverlight+2"&gt;Silverlight 2&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/dsantarelli/aggbug/95722.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dario Santarelli</dc:creator>
            <guid>http://blogs.ugidotnet.org/dsantarelli/archive/2009/03/16/silverlight-2-visibility-e-visualstatemanager.aspx</guid>
            <pubDate>Mon, 16 Mar 2009 21:04:58 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/dsantarelli/comments/95722.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/dsantarelli/archive/2009/03/16/silverlight-2-visibility-e-visualstatemanager.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/dsantarelli/comments/commentRss/95722.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/dsantarelli/services/trackbacks/95722.aspx</trackback:ping>
        </item>
        <item>
            <title>jQuery e ASP.NET Ajax: $(document).ready() VS asynchronous postback</title>
            <category>ASP.NET AJAX</category>
            <link>http://blogs.ugidotnet.org/dsantarelli/archive/2009/03/09/jquery-e-asp.net-ajax-document.ready-vs-asynchronous-postback.aspx</link>
            <description>&lt;p&gt;Molto spesso capita di dover integrare, anche solo per semplici miglioramenti grafici, dei plugin jQuery all’interno delle nostre pagine ASP.NET. Gran parte delle volte l’impatto è indolore mentre in alcuni casi specifici occorre far riferimento ad accorgimenti non banali, soprattutto quando c’è di mezzo ASP.NET Ajax.   &lt;br /&gt;Il classico esempio si verifica quando ci si aspetta che la funzione &lt;a href="http://docs.jquery.com/Tutorials:Introducing_$(document).ready()" target="_blank"&gt;$(document).ready()&lt;/a&gt;&lt;strong&gt; &lt;/strong&gt;venga chiamata correttamente anche dopo un asynchronous postback tramite UpdatePanel. Infatti, la funzione $(document).ready() permette di determinare il momento in cui il DOM della pagina è caricato dal browser. Tuttavia, in caso di asynchronous postback il DOM può essere eventualmente modificato e non ricaricato nuovamente. Quindi il nostro codice javascript nella forma:    &lt;br /&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;$(document).ready(&lt;span style="color: blue"&gt;function&lt;/span&gt;()       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;{     &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&lt;span style="color: green"&gt;// codice...       &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;});&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;... non verrà eseguito!    &lt;br /&gt;Un workaround molto semplice per questo tipo di situazione è quello di sfruttare l’evento client-side &lt;a href="http://msdn.microsoft.com/it-it/library/bb383810.aspx" target="_blank"&gt;endRequest&lt;/a&gt; generato dopo un postback asincrono, quando il controllo viene  restituito al browser. Agganciando il nostro codice jQuery che usa $(document).ready() all’interno di un opportuno event Handler per tale evento possiamo risolvere il problema. Ecco un semplice esempio:    &lt;br /&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="font-size: 8pt; background: yellow; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-highlight: yellow; mso-ansi-language: en-us"&gt;&amp;lt;%&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;@&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt; &lt;span style="color: #a31515"&gt;Page&lt;/span&gt; &lt;span style="color: red"&gt;Language&lt;/span&gt;&lt;span style="color: blue"&gt;="C#"&lt;/span&gt; &lt;span style="color: red"&gt;AutoEventWireup&lt;/span&gt;&lt;span style="color: blue"&gt;="true"&lt;/span&gt; &lt;span style="color: red"&gt;CodeFile&lt;/span&gt;&lt;span style="color: blue"&gt;="Default.aspx.cs"&lt;/span&gt; &lt;span style="color: red"&gt;Inherits&lt;/span&gt;&lt;span style="color: blue"&gt;="_Default"&lt;/span&gt; &lt;span style="background: yellow; mso-highlight: yellow"&gt;%&amp;gt;       &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&amp;lt;!&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;DOCTYPE&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt; &lt;span style="color: red"&gt;html&lt;/span&gt; &lt;span style="color: red"&gt;PUBLIC&lt;/span&gt; &lt;span style="color: blue"&gt;"-//W3C//DTD XHTML 1.0 Transitional//EN"&lt;/span&gt; &lt;span style="color: blue"&gt;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;       &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&amp;lt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;html&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt; &lt;span style="color: red"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue"&gt;="http://www.w3.org/1999/xhtml"&amp;gt;       &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&amp;lt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;head&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;="server"&amp;gt;       &lt;br /&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;title&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;jQuery .ready() function and asynchronous postback&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;title&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&amp;lt;/&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;head&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&amp;gt;     &lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&amp;lt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;body&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&amp;gt;     &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;form&lt;/span&gt; &lt;span style="color: red"&gt;id&lt;/span&gt;&lt;span style="color: blue"&gt;="mainForm"&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;="server"&amp;gt;       &lt;br /&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;       &lt;br /&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;ScriptManager&lt;/span&gt; &lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;="scriptManager"&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;="server"&amp;gt;       &lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Scripts&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;       &lt;br /&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;ScriptReference&lt;/span&gt; &lt;span style="color: red"&gt;Path&lt;/span&gt;&lt;span style="color: blue"&gt;="http://code.jquery.com/jquery-latest.js"&lt;/span&gt; &lt;span style="color: blue"&gt;/&amp;gt;       &lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Scripts&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;       &lt;br /&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;ScriptManager&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;       &lt;br /&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;UpdatePanel&lt;/span&gt; &lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;="updatePanel"&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;="server"&amp;gt;       &lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ContentTemplate&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;                 &lt;br /&gt;         &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;Button&lt;/span&gt; &lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;="btnTest"&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;="server"&lt;/span&gt; &lt;span style="color: red"&gt;Text&lt;/span&gt;&lt;span style="color: blue"&gt;="Do Async PostBack"&lt;/span&gt; &lt;span style="color: blue"&gt;/&amp;gt;       &lt;br /&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ContentTemplate&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;       &lt;br /&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;UpdatePanel&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;       &lt;br /&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;       &lt;br /&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;form&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;       &lt;p /&gt;     &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;br /&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;script&lt;/span&gt; &lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;="text/javascript"&amp;gt;       &lt;br /&gt;    &lt;br /&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);     &lt;br /&gt;    &lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="color: blue"&gt;function&lt;/span&gt; EndRequestHandler(sender, args)       &lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;{     &lt;br /&gt;      &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt; (args.get_error() == undefined) Test();&lt;span style="mso-spacerun: yes"&gt;            &lt;br /&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;}     &lt;br /&gt;      &lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="color: blue"&gt;function&lt;/span&gt; Test()       &lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;{     &lt;br /&gt;      &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;$(document).ready(&lt;span style="color: blue"&gt;function&lt;/span&gt;()       &lt;br /&gt;      &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;{     &lt;br /&gt;        &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;alert(&lt;span style="color: #a31515"&gt;'$(document).ready() called!!!'&lt;/span&gt;);       &lt;br /&gt;      &lt;/span&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;});     &lt;br /&gt;    &lt;/span&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;}     &lt;br /&gt;      &lt;br /&gt;    &lt;/span&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;Test();&lt;span style="mso-spacerun: yes"&gt;      &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;             &lt;br /&gt;            &lt;br /&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;script&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;       &lt;br /&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;body&lt;/span&gt;&lt;span style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;gt;     &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;html&lt;/span&gt;&lt;span style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;gt;     &lt;p /&gt;   &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&lt;/p&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:0d2ddb6a-8ca7-4ffc-89d5-18c75e15fbdf" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tag: &lt;a href="http://technorati.com/tags/jQuery" rel="tag"&gt;jQuery&lt;/a&gt;,&lt;a href="http://technorati.com/tags/ASP.NET" rel="tag"&gt;ASP.NET&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Ajax" rel="tag"&gt;Ajax&lt;/a&gt;,&lt;a href="http://technorati.com/tags/DOM" rel="tag"&gt;DOM&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/dsantarelli/aggbug/95644.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dario Santarelli</dc:creator>
            <guid>http://blogs.ugidotnet.org/dsantarelli/archive/2009/03/09/jquery-e-asp.net-ajax-document.ready-vs-asynchronous-postback.aspx</guid>
            <pubDate>Mon, 09 Mar 2009 20:58:18 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/dsantarelli/comments/95644.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/dsantarelli/archive/2009/03/09/jquery-e-asp.net-ajax-document.ready-vs-asynchronous-postback.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/dsantarelli/comments/commentRss/95644.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/dsantarelli/services/trackbacks/95644.aspx</trackback:ping>
        </item>
        <item>
            <title>[Entity Framework] Disabilitare il change tracking dell&amp;rsquo;ObjectStateManager</title>
            <link>http://blogs.ugidotnet.org/dsantarelli/archive/2009/03/03/entity-framework-disabilitare-il-change-tracking-dellrsquoobjectstatemanager.aspx</link>
            <description>&lt;blockquote&gt;(da MSDN)&lt;em&gt; ObjectStateManager tracks query results, and provides logic to merge multiple overlapping query results. It also performs in-memory change tracking when a user inserts, deletes, or modifies objects, and provides the change set for updates. This change set is used by the change processor to persist modifications. &lt;/em&gt;&lt;/blockquote&gt;  &lt;p /&gt;  &lt;p&gt;   &lt;br /&gt;La classe &lt;a href="http://msdn.microsoft.com/en-us/library/system.data.objects.objectstatemanager.aspx"&gt;ObjectStateManager&lt;/a&gt; in generale gestisce lo stato dei nostri &lt;a href="http://msdn.microsoft.com/en-us/library/system.data.objects.dataclasses.entityobject.aspx" target="_blank"&gt;EntityObject&lt;/a&gt;. In quei casi in cui i nostri dati devono essere semplicemente presentati in modalità &lt;strong&gt;read only&lt;/strong&gt; può essere utile disabilitare il change tracking dell’ &lt;a href="http://msdn.microsoft.com/it-it/library/system.data.objects.objectcontext.aspx" target="_blank"&gt;ObjectContext&lt;/a&gt;, ottenendo un incremento di performance talvolta significativo.  &lt;br /&gt;In particolare, per disabilitare il change tracking occorre utilizzare l’opzione &lt;strong&gt;MergeOption.NoTracking &lt;/strong&gt;dell’enumeration &lt;a href="http://msdn.microsoft.com/en-us/library/system.data.objects.mergeoption.aspx" target="_blank"&gt;MergeOption&lt;/a&gt;, che permette di lavorare con Entità aventi &lt;a href="http://msdn.microsoft.com/it-it/library/system.data.entitystate.aspx" target="_blank"&gt;EntityState&lt;/a&gt; ‘&lt;em&gt;Detached’&lt;/em&gt;. Fondamentalmente esistono due modi per disabilitare il change tracking:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Utilizzando l’oggetto &lt;a href="http://msdn.microsoft.com/en-us/library/bb345303.aspx" target="_blank"&gt;ObjectQuery&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt; Esiste infatti un &lt;a href="http://msdn.microsoft.com/en-us/library/bb738896.aspx" target="_blank"&gt;overload del costruttore&lt;/a&gt; che permette di specificare l’opzione &lt;em&gt;MergeOption&lt;/em&gt; desiderata. &lt;/li&gt;    &lt;li&gt;A livello di EntitySet &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Vediamo entrambi gli esempi:&lt;/p&gt;  &lt;p /&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Caso 1&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;using&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt; (&lt;span style="color: #2b91af"&gt;NorthwindObjectContext&lt;/span&gt; context = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;NorthwindObjectContext&lt;/span&gt;())       &lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;{      &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: #2b91af"&gt;ObjectQuery&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Customer&lt;/span&gt;&amp;gt; queryCustomers = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ObjectQuery&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Customer&lt;/span&gt;&amp;gt;(&lt;span style="color: #a31515"&gt;"SELECT VALUE c FROM NorthwindObjectContext.Customers AS c"&lt;/span&gt;, context, &lt;span style="color: #2b91af"&gt;MergeOption&lt;/span&gt;.NoTracking);       &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;foreach&lt;/span&gt; (&lt;span style="color: #2b91af"&gt;Customer&lt;/span&gt; customer &lt;span style="color: blue"&gt;in&lt;/span&gt; queryCustomers)&lt;span style="mso-spacerun: yes"&gt;    &lt;br /&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;{      &lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;"{0} - {1}"&lt;/span&gt;, customer.ContactName, customer.EntityState.ToString());&lt;span style="mso-spacerun: yes"&gt;     &lt;br /&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;}      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;}&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&lt;strong&gt;&lt;em&gt;Caso 2&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;using&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt; (&lt;span style="color: #2b91af"&gt;NorthwindObjectContext&lt;/span&gt; context = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;NorthwindObjectContext&lt;/span&gt;())       &lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;{&lt;span style="mso-spacerun: yes"&gt;    &lt;br /&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;context.Customers.MergeOption = &lt;span style="color: #2b91af"&gt;MergeOption&lt;/span&gt;.NoTracking;&lt;span style="mso-spacerun: yes"&gt;     &lt;br /&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;foreach&lt;/span&gt; (&lt;span style="color: #2b91af"&gt;Customer&lt;/span&gt; customer &lt;span style="color: blue"&gt;in&lt;/span&gt; context.Customers)&lt;span style="mso-spacerun: yes"&gt;    &lt;br /&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;{      &lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;"{0} - {1}"&lt;/span&gt;, customer.ContactName, customer.EntityState.ToString());&lt;span style="mso-spacerun: yes"&gt;     &lt;br /&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;}      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;} &lt;/span&gt;&lt;/p&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p&gt;   &lt;br /&gt;    &lt;/p&gt;&lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:361ba0c7-bb8b-40ab-be38-205b3ba1dc04" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tag: &lt;a href="http://technorati.com/tags/Entity+Framework" rel="tag"&gt;Entity Framework&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/dsantarelli/aggbug/95595.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dario Santarelli</dc:creator>
            <guid>http://blogs.ugidotnet.org/dsantarelli/archive/2009/03/03/entity-framework-disabilitare-il-change-tracking-dellrsquoobjectstatemanager.aspx</guid>
            <pubDate>Tue, 03 Mar 2009 20:31:15 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/dsantarelli/comments/95595.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/dsantarelli/archive/2009/03/03/entity-framework-disabilitare-il-change-tracking-dellrsquoobjectstatemanager.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/dsantarelli/comments/commentRss/95595.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/dsantarelli/services/trackbacks/95595.aspx</trackback:ping>
        </item>
        <item>
            <title>Da WindowsForms a WPF via MVP</title>
            <category>WPF</category>
            <link>http://blogs.ugidotnet.org/dsantarelli/archive/2009/02/27/da-windowsforms-a-wpf-via-mvp.aspx</link>
            <description>&lt;p&gt;Qualche giorno fa mi sono imbattutto in una simpatica applicazione Windows Forms che permette di disegnare su una lavangna virtuale il posizionamento in campo di due squadre di calcio. Un'applicazione per allenatori insomma :D. In breve, il funzionamento è semplicemente basato sull'aggiunta e sullo spostamento di pedine (rosse o blu) su un campo di calcio virtuale con eventuale possibilità di ingrandirne/rimpicciolirne le dimensioni.    &lt;br /&gt;Guardando il sorgente ho osservato come l’intera applicazione fosse stata concepita e sviluppata "alla Windows Forms" con l'intera logica piazzata all'interno di ciascun event handler dei vari elementi dell'UI.     &lt;br /&gt;Ho quindi pensato di esercitarmi nel fare un po' di refactoring, ma soprattutto di analizzare alcuni aspetti prettamente grafici nel porting di una applicazione WindowsForms ad una versione WPF.     &lt;br /&gt;Dal punto di vista architetturale, prima di passare alla versione &lt;strong&gt;MVVM&lt;/strong&gt; ho anzitutto ritenuto opportuno inserire un “passaggio intermedio” nel refactoring, soffermandomi su una versione &lt;strong&gt;MVP&lt;/strong&gt;. Il tutto per mettere sostanzialmente in risalto al mio cervello i principali punti di differenza tra i due pattern. Inoltre, come già accennato, la fase di analisi ha toccato alcune potenzialità grafiche di WPF, come il Drag &amp;amp; Drop/Move e lo Zoom.     &lt;br /&gt;    &lt;br /&gt;In questo post vorrei condividere con voi come mi sono mosso, sperando di ricevere magari qualche utile consiglio ;D    &lt;br /&gt;    &lt;br /&gt;Anzitutto sono partito definendo un mini-core, ovvero un'interfaccia "marker" &lt;em&gt;IView&lt;/em&gt; per le View&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt"&gt;&lt;span style="font-size: 8pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes"&gt;public&lt;/span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; mso-no-proof: yes"&gt; &lt;span style="color: blue"&gt;interface&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IView&lt;/span&gt; { }&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;ed una classe generica astratta per il presenter:&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: 'Courier New'; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;public&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: 'Courier New'; mso-no-proof: yes; mso-ansi-language: en-gb"&gt; &lt;span style="color: blue"&gt;abstract&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;PresenterBase&lt;/span&gt;&amp;lt;T&amp;gt; &lt;span style="color: blue"&gt;where&lt;/span&gt; T : &lt;span style="color: #2b91af"&gt;IView        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: 'Courier New'; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;{      &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: 'Courier New'; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; T View { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; font-family: 'Courier New'; mso-no-proof: yes"&gt;}&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;A questo punto ho iniziato il porting della Form principale dell'applicazione di partenza (che si chiamava &lt;em&gt;SoccerBlackBoardForm&lt;/em&gt;) realizzando la corrispondente Window WPF (&lt;em&gt;SoccerBlackBoardWindow&lt;/em&gt;) che implementa un'interfaccia &lt;em&gt;IBlackboardView&lt;/em&gt; dedotta analizzando il codice dell'applicazione originale. Infine ho realizzato una classe presenter &lt;em&gt;BlackboardPresenter&lt;/em&gt; per le View che implementano &lt;em&gt;IBlackboardView&lt;/em&gt;. Il tutto è rappresentato sinteticamente nel seguente class Diagram:&lt;/p&gt;  &lt;p&gt;&lt;img alt="" src="http://img100.imageshack.us/img100/2479/immagine3a.jpg" /&gt;&lt;/p&gt;  &lt;p&gt;Omettendo per brevità il codice dell'interfaccia &lt;em&gt;IBlackboardView&lt;/em&gt;, riporto direttamente lo &lt;strong&gt;scheletro&lt;/strong&gt; del mio refactoring dal momento che si tratta di codice abbastanza autoesplicativo:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; La costruzione della Window &lt;em&gt;SoccerBlackBoardWindow&lt;/em&gt; ha letteralmente svuotato di logica la corrispondente versione Windows Forms fino ad avere la seguente forma:     &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;SoccerBlackBoardWindow.xaml&lt;/strong&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&amp;lt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;Window&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: red; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt; ...&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;&lt;span style="mso-spacerun: yes"&gt;   &lt;/span&gt;&lt;o:p /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&amp;lt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;Grid&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&amp;gt;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&amp;lt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;Grid.ColumnDefinitions&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&amp;gt;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&amp;lt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;ColumnDefinition&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: red; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt; Width&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;="100"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;ColumnDefinition&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&amp;gt;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&amp;lt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;ColumnDefinition&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: red; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt; Width&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;="*"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;ColumnDefinition&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&amp;gt;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&amp;lt;/&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;Grid.ColumnDefinitions&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&amp;gt;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&amp;lt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;StackPanel&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: red; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt; Grid.Column&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;="0"&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: red; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt; Orientation&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;="Vertical"&amp;gt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;                     &lt;/span&gt;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&amp;lt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;ListBox&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: red; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt; x&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;:&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: red; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;Name&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;="lstImages"&amp;gt;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&amp;lt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;ListBox.ItemTemplate&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&amp;gt;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;                    &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&amp;lt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;DataTemplate&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&amp;gt;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;                        &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&amp;lt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;Image&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: red; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt; ...&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: red; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt; Source&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;="{&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;Binding&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;}"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;Image&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&amp;gt;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;                    &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&amp;lt;/&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;DataTemplate&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&amp;gt;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&amp;lt;/&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;ListBox.ItemTemplate&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&amp;gt;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&amp;lt;/&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;ListBox&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&amp;gt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&amp;lt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;Button&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: red; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt; Content&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;="Add Image &amp;gt;&amp;gt;"&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: red; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt; Click&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;="AddImageClick" ...&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;Button&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&amp;gt;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&amp;lt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;Button&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: red; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt; Content&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;="Clear"&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: red; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt; Click&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;="ClearClick"&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: red; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt; ...&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;Button&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&amp;gt;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&amp;lt;/&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;StackPanel&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&amp;gt;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&amp;lt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;Canvas&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: red; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt; x&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;:&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: red; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;Name&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;="drawingArea"&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: red; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt; Grid.Column&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;="1"&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: red; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt; ...&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&amp;gt;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&amp;lt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;Canvas.Background&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&amp;gt;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&amp;lt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;ImageBrush&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: red; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt; Stretch&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;="Fill"&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: red; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;  &lt;br /&gt;                            ImageSource&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;="Resources/SoccerField.png"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;ImageBrush&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&amp;gt;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;Canvas.Background&lt;/span&gt;&lt;span style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;gt;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;Canvas&lt;/span&gt;&lt;span style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;gt;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;Grid&lt;/span&gt;&lt;span style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;gt;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt"&gt;&lt;span style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 8pt; color: #a31515; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;Window&lt;/span&gt;&lt;span style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;     &lt;br /&gt;SoccerBlackBoardWindow.xaml.cs&lt;/strong&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;public&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt; &lt;span style="color: blue"&gt;partial&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;SoccerBlackBoardWindow&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;Window&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;IBlackboardView        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;{      &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: #2b91af"&gt;BlackboardPresenter&lt;/span&gt; _presenter;       &lt;br /&gt;      &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;#region&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt; IBlackboardView Members      &lt;br /&gt;      &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Panel&lt;/span&gt; DrawingArea       &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;{      &lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="color: blue"&gt;get&lt;/span&gt; { &lt;span style="color: blue"&gt;return&lt;/span&gt; drawingArea; }       &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;}      &lt;br /&gt;      &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Point&lt;/span&gt; MousePosition       &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;{      &lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="color: blue"&gt;get&lt;/span&gt; { &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Mouse&lt;/span&gt;.GetPosition(drawingArea); }&lt;span style="mso-spacerun: yes"&gt;           &lt;br /&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;}      &lt;br /&gt;      &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IList&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;BitmapSource&lt;/span&gt;&amp;gt; AvailableImages       &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;{      &lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="color: blue"&gt;get&lt;/span&gt; { &lt;span style="color: blue"&gt;return&lt;/span&gt; (&lt;span style="color: #2b91af"&gt;IList&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;BitmapSource&lt;/span&gt;&amp;gt;)lstImages.ItemsSource; }       &lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="color: blue"&gt;set&lt;/span&gt; { lstImages.ItemsSource = &lt;span style="color: blue"&gt;value&lt;/span&gt;; }       &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;}      &lt;br /&gt;      &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;BitmapSource&lt;/span&gt; SelectedImage       &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;{      &lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="color: blue"&gt;get&lt;/span&gt; { &lt;span style="color: blue"&gt;return&lt;/span&gt; (&lt;span style="color: #2b91af"&gt;BitmapSource&lt;/span&gt;)lstImages.SelectedItem; }       &lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="color: blue"&gt;set&lt;/span&gt; { lstImages.SelectedItem = &lt;span style="color: blue"&gt;value&lt;/span&gt;; }       &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;}      &lt;br /&gt;      &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; AttachPresenter(&lt;span style="color: #2b91af"&gt;BlackboardPresenter&lt;/span&gt; presenter) { _presenter = presenter; }&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;#endregion&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; SoccerBlackBoardWindow()&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;{&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;InitializeComponent();&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;_presenter = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;BlackboardPresenter&lt;/span&gt;(&lt;span style="color: blue"&gt;this&lt;/span&gt;);&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;_presenter.LoadImages();       &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;}&lt;span style="mso-spacerun: yes"&gt;   &lt;/span&gt;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;     &lt;/span&gt;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;&lt;span style="color: blue"&gt;protected&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; AddImageClick(&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af"&gt;RoutedEventArgs&lt;/span&gt; e) &lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;{ &lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;_presenter.DrawImage(SelectedImage, &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Size&lt;/span&gt;(100, 100), 0, 0, 0); &lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;}      &lt;br /&gt;      &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="color: blue"&gt;protected&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; ClearClick(&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af"&gt;RoutedEventArgs&lt;/span&gt; e) &lt;/span&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;{&lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;_presenter.ClearDrawingArea(); &lt;/span&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;}&lt;span style="mso-spacerun: yes"&gt;      &lt;/span&gt;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt"&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;}&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&lt;strong&gt;2.&lt;/strong&gt; Il presenter &lt;em&gt;BlackboardPresenter&lt;/em&gt; è stato quindi realizzato per aggiornare la View sia in base agli eventi utente e l'interazione con il model, che in questo caso è dato da una banale collezione readonly di immagini che l'utente ha a disposizione per l'inserimento nella area di disegno (DrawingArea)     &lt;br /&gt;Notare come sia semplice realizzare un meccanismo di Drag &amp;amp; Move :D.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;BlackboardPresenter.cs&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span lang="EN-GB" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;public&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;BlackboardPresenter&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;PresenterBase&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;IBlackboardView&lt;/span&gt;&amp;gt;       &lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;{      &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Point&lt;/span&gt; _tmpPosition;       &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;const&lt;/span&gt; &lt;span style="color: blue"&gt;int&lt;/span&gt; ZOOMDELTA = 10;       &lt;br /&gt;      &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; BlackboardPresenter(&lt;span style="color: #2b91af"&gt;IBlackboardView&lt;/span&gt; view) { View = view; }       &lt;br /&gt;      &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; LoadImages()       &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;{&lt;span style="mso-spacerun: yes"&gt;            &lt;br /&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="color: #2b91af"&gt;IList&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;BitmapSource&lt;/span&gt;&amp;gt; availableImages = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;BitmapSource&lt;/span&gt;&amp;gt;();&lt;span style="mso-spacerun: yes"&gt;            &lt;br /&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="color: green"&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span lang="EN-GB"&gt;&lt;font color="#000000"&gt;availableImages.Add(&lt;/font&gt;&lt;span style="color: blue"&gt;new&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: #2b91af"&gt;BitmapImage&lt;/span&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;span style="color: blue"&gt;new&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: #2b91af"&gt;Uri&lt;/span&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;span style="color: #a31515"&gt;"Resources/SoccerBall.png"&lt;/span&gt;&lt;font color="#000000"&gt;, &lt;/font&gt;&lt;span style="color: #2b91af"&gt;UriKind&lt;/span&gt;&lt;font color="#000000"&gt;.Relative)));&lt;o:p /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;      &lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: 'Courier New'; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;font color="#000000"&gt;    availableImages.Add(&lt;/font&gt;&lt;span style="color: blue"&gt;new&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: #2b91af"&gt;BitmapImage&lt;/span&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;span style="color: blue"&gt;new&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: #2b91af"&gt;Uri&lt;/span&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;span style="color: #a31515"&gt;"Resources/blueBall.png"&lt;/span&gt;&lt;font color="#000000"&gt;, &lt;/font&gt;&lt;span style="color: #2b91af"&gt;UriKind&lt;/span&gt;&lt;font color="#000000"&gt;.Relative)));  &lt;br /&gt;    &lt;/font&gt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: 'Courier New'; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;font color="#000000"&gt;availableImages.Add(&lt;/font&gt;&lt;span style="color: blue"&gt;new&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: #2b91af"&gt;BitmapImage&lt;/span&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;span style="color: blue"&gt;new&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: #2b91af"&gt;Uri&lt;/span&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;span style="color: #a31515"&gt;"Resources/redBall.png"&lt;/span&gt;&lt;font color="#000000"&gt;, &lt;/font&gt;&lt;span style="color: #2b91af"&gt;UriKind&lt;/span&gt;&lt;font color="#000000"&gt;.Relative)));       &lt;br /&gt;    &lt;/font&gt;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: 'Courier New'; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;View.AvailableImages = availableImages;&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;      &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;}      &lt;br /&gt;      &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; ClearDrawingArea()&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;{ &lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;View.DrawingArea.Children.Clear(); &lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;}      &lt;br /&gt;      &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Image&lt;/span&gt; DrawImage(&lt;span style="color: #2b91af"&gt;ImageSource&lt;/span&gt; source, &lt;span style="color: #2b91af"&gt;Size&lt;/span&gt; size, &lt;span style="color: blue"&gt;int&lt;/span&gt; canvasLeft, &lt;span style="color: blue"&gt;int&lt;/span&gt; canvasTop,&lt;span style="color: blue"&gt;int&lt;/span&gt; zIndex)&lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;font color="#000000"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;&lt;/font&gt;&lt;/span&gt;    &lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;{&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Image&lt;/span&gt; image = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Image&lt;/span&gt;();&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;image.Source = source;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;image.Height = size.Height;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;image.Width = size.Width;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;image.Cursor = &lt;span style="color: #2b91af"&gt;Cursors&lt;/span&gt;.Hand;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Canvas&lt;/span&gt;.SetLeft(image, canvasLeft);&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Canvas&lt;/span&gt;.SetTop(image, canvasTop);&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Panel&lt;/span&gt;.SetZIndex(image, zIndex);&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;image.MouseMove += &lt;span style="color: blue"&gt;delegate&lt;/span&gt;(&lt;span style="color: blue"&gt;object&lt;/span&gt; o, &lt;span style="color: #2b91af"&gt;MouseEventArgs&lt;/span&gt; args) { MoveImage(image); };&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;image.MouseWheel += &lt;span style="color: blue"&gt;delegate&lt;/span&gt;(&lt;span style="color: blue"&gt;object&lt;/span&gt; o, &lt;span style="color: #2b91af"&gt;MouseWheelEventArgs&lt;/span&gt; args) { ZoomImage(image, args.Delta); };&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;image.MouseDown += &lt;span style="color: blue"&gt;delegate&lt;/span&gt;(&lt;span style="color: blue"&gt;object&lt;/span&gt; o, &lt;span style="color: #2b91af"&gt;MouseButtonEventArgs&lt;/span&gt; args) { CaptureImage(image); };&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;image.MouseUp += &lt;span style="color: blue"&gt;delegate&lt;/span&gt;(&lt;span style="color: blue"&gt;object&lt;/span&gt; o, &lt;span style="color: #2b91af"&gt;MouseButtonEventArgs&lt;/span&gt; args) { ReleaseImage(image); };&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;           &lt;/span&gt;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;View.DrawingArea.Children.Add(image);&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;&lt;span style="color: blue"&gt;return&lt;/span&gt; image;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;}&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;   &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; ReleaseImage(&lt;span style="color: #2b91af"&gt;Image&lt;/span&gt; image) &lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;{ &lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;image.ReleaseMouseCapture(); &lt;/span&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;}&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;   &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; CaptureImage(&lt;span style="color: #2b91af"&gt;Image&lt;/span&gt; image)&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;   &lt;/span&gt;{&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;     &lt;/span&gt;image.CaptureMouse();&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;     &lt;/span&gt;_tmpPosition= View.MousePosition;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;   &lt;/span&gt;}&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;   &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; MoveImage(&lt;span style="color: #2b91af"&gt;Image&lt;/span&gt; image)&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;   &lt;/span&gt;{&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;     &lt;/span&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt; (&lt;span style="color: #2b91af"&gt;Mouse&lt;/span&gt;.LeftButton == &lt;span style="color: #2b91af"&gt;MouseButtonState&lt;/span&gt;.Pressed)&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;     &lt;/span&gt;{&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;       &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Canvas&lt;/span&gt;.SetLeft(image, &lt;span style="color: #2b91af"&gt;Canvas&lt;/span&gt;.GetLeft(image) + (View.MousePosition.X - _tmpPosition.X));&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;       &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Canvas&lt;/span&gt;.SetTop(image, &lt;span style="color: #2b91af"&gt;Canvas&lt;/span&gt;.GetTop(image) + (View.MousePosition.Y - _tmpPosition.Y));&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;     &lt;/span&gt;}&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;     &lt;/span&gt;_tmpPosition= View.MousePosition;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;   &lt;/span&gt;}&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;   &lt;/span&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; ZoomImage(&lt;span style="color: #2b91af"&gt;Image&lt;/span&gt; image, &lt;span style="color: blue"&gt;int&lt;/span&gt; amount)&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;   &lt;/span&gt;{&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;     &lt;/span&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt; (amount &amp;gt; 0)&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;     &lt;/span&gt;{&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;       &lt;/span&gt;image.Height += ZOOMDELTA;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;       &lt;/span&gt;image.Width += ZOOMDELTA;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;     &lt;/span&gt;}&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;     &lt;/span&gt;&lt;span style="color: blue"&gt;else&lt;o:p /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;     &lt;/span&gt;{&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;       &lt;/span&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt; ((image.Height - ZOOMDELTA &amp;gt; ZOOMDELTA) &amp;amp;&amp;amp; (image.Width - ZOOMDELTA &amp;gt; ZOOMDELTA))&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;       &lt;/span&gt;{&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;         &lt;/span&gt;image.Height -= ZOOMDELTA;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;         &lt;/span&gt;image.Width -= ZOOMDELTA;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-gb"&gt;&lt;span style="mso-spacerun: yes"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;}&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;     &lt;/span&gt;}&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;   &lt;/span&gt;}&lt;span style="mso-spacerun: yes"&gt;       &lt;/span&gt;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin: 0cm 0cm 0pt"&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;}&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;Il risultato ottenuto è raffigurato qua sotto: non vi dico quanto è stato divertente usare questa app per spiegare alla mia compagna la tattica del fuorigioco :D.     &lt;br /&gt;    &lt;br /&gt;&lt;a href="http://img9.imageshack.us/img9/971/immagine1nst.jpg" target="_blank"&gt;&lt;img style="width: 218px; height: 113px" height="190" alt="" src="http://img9.imageshack.us/img9/971/immagine1nst.jpg" width="397" /&gt;&lt;/a&gt;   &lt;a href="http://img99.imageshack.us/img99/526/immagine2j.jpg" target="_blank"&gt;&lt;img style="width: 209px; height: 112px" height="172" alt="" src="http://img99.imageshack.us/img99/526/immagine2j.jpg" width="380" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p /&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:9003f381-bdb0-462c-b0cd-b70524b1dcbd" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tag: &lt;a href="http://technorati.com/tags/MVP" rel="tag"&gt;MVP&lt;/a&gt;, &lt;a href="http://technorati.com/tags/WPF" rel="tag"&gt;WPF&lt;/a&gt; &lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/dsantarelli/aggbug/95558.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dario Santarelli</dc:creator>
            <guid>http://blogs.ugidotnet.org/dsantarelli/archive/2009/02/27/da-windowsforms-a-wpf-via-mvp.aspx</guid>
            <pubDate>Fri, 27 Feb 2009 18:43:19 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/dsantarelli/comments/95558.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/dsantarelli/archive/2009/02/27/da-windowsforms-a-wpf-via-mvp.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/dsantarelli/comments/commentRss/95558.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/dsantarelli/services/trackbacks/95558.aspx</trackback:ping>
        </item>
        <item>
            <title>[WCF] IOperationBehavior e IParameterInspector</title>
            <category>WCF</category>
            <link>http://blogs.ugidotnet.org/dsantarelli/archive/2009/02/24/wcf-ioperationbehavior-e-iparameterinspector.aspx</link>
            <description>&lt;p&gt;Dal punto di vista della flessibilità, ritengo che WCF sia una delle tecnologie più potenti attualmente disponibili per lo sviluppo di applicazioni orientate ai servizi. In particolare, una delle caratteristiche che apprezzo maggiormente è la facilità di personalizzazione del comportamento runtime degli OperationContract sia client-side che service-side ( &lt;a target="_blank" href="http://blogs.ugidotnet.org/dsantarelli/archive/2009/01/10/wcf-web-caching-con-wcf-rest-starter-kit.aspx"&gt;pratica&lt;/a&gt; per altro molto usata nel &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/netframework/cc950529.aspx"&gt;WCF REST Starter Kit&lt;/a&gt; :D ). &lt;br /&gt;
In questo post volevo soffermarmi proprio su questo aspetto, mostrando un semplice esempio di implementazione dell’interfaccia &lt;a target="_blank" href="http://msdn.microsoft.com/it-it/library/system.servicemodel.description.ioperationbehavior.aspx"&gt;IOperationBehavior&lt;/a&gt;, che per l'appunto definisce quattro metodi finalizzati all'estensione del runtime behavior di un'operation: &lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/it-it/library/system.servicemodel.description.ioperationbehavior.addbindingparameters.aspx"&gt;AddBindingParameters &lt;/a&gt;: serve per aggiungere nuovi elementi di binding utilizzabili dall'operation in fase di esecuzione.  &lt;/li&gt;
    &lt;li&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/it-it/library/system.servicemodel.description.ioperationbehavior.applyclientbehavior.aspx"&gt;ApplyClientBehavior &lt;/a&gt;: viene chiamato client-side 
    &lt;ul&gt;
        &lt;li&gt;prima che il contenuto della richiesta sia serializzato e inviato al service &lt;/li&gt;
        &lt;li&gt;dopo che la risposta è stata deserializzata ma prima che i valori restituiti vengano forniti al metodo proxy &lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/it-it/library/system.servicemodel.description.ioperationbehavior.applydispatchbehavior.aspx"&gt;&lt;font color="#0033cc"&gt;ApplyDispatchBehavior&lt;/font&gt; &lt;/a&gt;: viene chiamato service-side dopo la deserializzazione dei parametri, ma prima che essi siano forniti all'operation del service. &lt;/li&gt;
    &lt;li&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/it-it/library/system.servicemodel.description.ioperationbehavior.validate.aspx"&gt;&lt;font color="#0033cc"&gt;Validate&lt;/font&gt; &lt;/a&gt;: permette di verificare che l'operation soddisfi dei criteri custom ( es. autorizzazioni ). &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vediamo ora una semplice implementazione che mette in evidenza come sia veramente semplice agganciare un OperationBehavior ad un OperationContract  tramite un attributo. Gli ambiti di applicazione sono veramente tanti: ad esempio potremmo usare questa tecnica service-side per eseguire della logica custom prima e dopo l’invocazione di un’operation da parte di un client. Nello specifico, supponiamo di voler scrivere in un file di log sul server sia i parametri di input passati all'operation che il risultato dell'invocazione. Per ottenere questo scenario necessitiamo anzitutto della definizione di un oggetto che sia in grado di ispezionare i parametri dell'operation sia prima che dopo la chiamata: in altre parole abbiamo bisogno di un &lt;a target="_blank" href="http://msdn.microsoft.com/it-it/library/system.servicemodel.dispatcher.iparameterinspector.aspx"&gt;IParameterInspector&lt;/a&gt;. Questa interfaccia definisce due metodi, &lt;em&gt;BeforeCall(…) &lt;/em&gt;e &lt;em&gt;AfterCall(…)&lt;/em&gt;&lt;em&gt;,&lt;/em&gt; che ci permettono di inserire della logica custom ( sempre sia client-side che service-side ) per accedere alle informazioni inerenti una operation ed i relativi parametri di input/output nelle fasi immediatamente precedenti e successive all’invocazione. &lt;br /&gt;
Partiamo dunque dal nostro IParameterInspector: &lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;public&lt;/span&gt; &lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="COLOR: blue"&gt;class&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;ParameterLogInspector&lt;/span&gt; : &lt;span style="COLOR: #2b91af"&gt;IParameterInspector &lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;{ &lt;br /&gt;
   &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="COLOR: blue"&gt;private&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;FileInfo&lt;/span&gt; _logFileInfo; &lt;br /&gt;
&lt;br /&gt;
   &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt; ParameterLogInspector(&lt;span style="COLOR: blue"&gt;string&lt;/span&gt; fileName) &lt;br /&gt;
   &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;{ &lt;br /&gt;
     &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;_logFileInfo = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;FileInfo&lt;/span&gt;(fileName); &lt;br /&gt;
     &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (!_logFileInfo.Exists) _logFileInfo.Create();&lt;span style="mso-spacerun: yes"&gt;       &lt;br /&gt;
   &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;} &lt;br /&gt;
&lt;br /&gt;
   &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;#region&lt;/span&gt; &lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;IParameterInspector Members &lt;br /&gt;
   &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;br /&gt;
   &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;object&lt;/span&gt; BeforeCall(&lt;span style="COLOR: blue"&gt;string&lt;/span&gt; operationName, &lt;span style="COLOR: blue"&gt;object&lt;/span&gt;[] inputs) &lt;br /&gt;
   &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;{ &lt;br /&gt;
     &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="COLOR: #2b91af"&gt;StringBuilder&lt;/span&gt; sb = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;StringBuilder&lt;/span&gt;(); &lt;br /&gt;
     &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="COLOR: blue"&gt;foreach&lt;/span&gt; (&lt;span style="COLOR: blue"&gt;object&lt;/span&gt; input &lt;span style="COLOR: blue"&gt;in&lt;/span&gt; inputs) sb.AppendFormat(&lt;span style="COLOR: #a31515"&gt;"{0};"&lt;/span&gt;, input.ToString()); &lt;br /&gt;
     &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="COLOR: blue"&gt;this&lt;/span&gt;.Log(&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="COLOR: #a31515"&gt;"Operation \"{0}\" is calling... inputs: {1}"&lt;/span&gt;, operationName, sb.ToString())); &lt;br /&gt;
     &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="COLOR: blue"&gt;return&lt;/span&gt; &lt;span style="COLOR: blue"&gt;null&lt;/span&gt;; &lt;br /&gt;
   &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;}&lt;span style="mso-spacerun: yes"&gt;        &lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="COLOR: blue"&gt;   public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; AfterCall(&lt;span style="COLOR: blue"&gt;string&lt;/span&gt; operationName, &lt;span style="COLOR: blue"&gt;object&lt;/span&gt;[] outputs, &lt;span style="COLOR: blue"&gt;object&lt;/span&gt; returnValue, &lt;span style="COLOR: blue"&gt;object&lt;/span&gt; correlationState) &lt;br /&gt;
   &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;{ &lt;br /&gt;
     &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="COLOR: blue"&gt;this&lt;/span&gt;.Log(&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="COLOR: #a31515"&gt;"Operation \"{0}\" called. returnValue: {1}"&lt;/span&gt;,operationName,returnValue.ToString()));&lt;span style="mso-spacerun: yes"&gt;             &lt;br /&gt;
   &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;} &lt;br /&gt;
&lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;   &lt;br /&gt;
   &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;#endregion &lt;br /&gt;
&lt;br /&gt;
   &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="COLOR: blue"&gt;private&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; Log(&lt;span style="COLOR: blue"&gt;string&lt;/span&gt; message) &lt;br /&gt;
   &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;{ &lt;br /&gt;
     &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="COLOR: blue"&gt;using&lt;/span&gt; (&lt;span style="COLOR: #2b91af"&gt;StreamWriter&lt;/span&gt; sw = _logFileInfo.AppendText()) &lt;br /&gt;
     &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;{ &lt;br /&gt;
       &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;sw.WriteLine(&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="COLOR: #a31515"&gt;"{0}&amp;gt; {1}"&lt;/span&gt;, &lt;span style="COLOR: #2b91af"&gt;DateTime&lt;/span&gt;.Now.ToString(), message)); &lt;br /&gt;
     &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;} &lt;br /&gt;
   &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;} &lt;br /&gt;
&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;}&lt;/span&gt;
&lt;p&gt;&lt;br /&gt;
Quindi, ci posizioniamo all'interno del metodo &lt;em&gt;ApplyDispatchBehavior(...)&lt;/em&gt; semplicemente per aggiungere il nostro &lt;em&gt;IParameterInspector&lt;/em&gt; alla collection &lt;a target="_blank" href="http://msdn.microsoft.com/it-it/library/system.servicemodel.dispatcher.dispatchoperation.parameterinspectors.aspx"&gt;ParameterInspectors&lt;/a&gt; dell'oggetto &lt;a target="_blank" href="http://msdn.microsoft.com/it-it/library/system.servicemodel.dispatcher.dispatchoperation.aspx"&gt;DispatchOperation&lt;/a&gt; (che rappresenta l'operation service-side) : &lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;font face="Trebuchet MS" color="#000000"&gt;&lt;br /&gt;
&lt;/font&gt;&lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="COLOR: blue"&gt;public class&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;ParametersLog&lt;/span&gt; : &lt;span style="COLOR: #2b91af"&gt;Attribute&lt;/span&gt;, &lt;span style="COLOR: #2b91af"&gt;IOperationBehavior &lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;{ &lt;br /&gt;
  &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; FileName { &lt;span style="COLOR: blue"&gt;get&lt;/span&gt;; &lt;span style="COLOR: blue"&gt;set&lt;/span&gt;; } &lt;br /&gt;
&lt;br /&gt;
  &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;#region&lt;/span&gt; &lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;IOperationBehavior Members &lt;br /&gt;
&lt;br /&gt;
  &lt;font color="#0000ff"&gt;... &lt;br /&gt;
&lt;/font&gt;&lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;br /&gt;
  &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; ApplyDispatchBehavior(&lt;span style="COLOR: #2b91af"&gt;OperationDescription&lt;/span&gt; operationDescription, &lt;span style="COLOR: #2b91af"&gt;DispatchOperation&lt;/span&gt; dispatchOperation) &lt;br /&gt;
  &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;{ &lt;br /&gt;
   &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;dispatchOperation.ParameterInspectors.Add(&lt;span style="COLOR: blue"&gt;new&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;ParameterLogInspector&lt;/span&gt;(&lt;span style="COLOR: blue"&gt;this&lt;/span&gt;.FileName)); &lt;br /&gt;
  &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;} &lt;br /&gt;
&lt;br /&gt;
  ... &lt;br /&gt;
  &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;br /&gt;
  &lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;#endregion &lt;br /&gt;
&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;}&lt;/span&gt; &lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
Il gioco è fatto: non rimane che decorare l'OperationContract di interesse con il nostro attributo &lt;em&gt;ParametersLog &lt;/em&gt;per ottenere l' estensione del runtime che ad ogni chiamata scriverà in un file di log i valori dei parametri di input/output .&lt;br /&gt;
&lt;br /&gt;
&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;[&lt;span style="COLOR: #2b91af"&gt;ServiceContract&lt;/span&gt;] &lt;br /&gt;
&lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;interface&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;IAuthentication &lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;{ &lt;br /&gt;
  &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;[&lt;span style="COLOR: #2b91af"&gt;OperationContract&lt;/span&gt;] &lt;br /&gt;
  &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;[&lt;span style="COLOR: #2b91af"&gt;ParametersLog&lt;/span&gt;(FileName=&lt;span style="COLOR: #a31515"&gt;"C:/log.txt"&lt;/span&gt;)] &lt;br /&gt;
  &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="COLOR: #2b91af"&gt;UserInfo&lt;/span&gt; Login(&lt;span style="COLOR: blue"&gt;string&lt;/span&gt; userName, &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; password); &lt;br /&gt;
&lt;br /&gt;
  &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;[&lt;span style="COLOR: #2b91af"&gt;OperationContract&lt;/span&gt;] &lt;br /&gt;
  &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="COLOR: blue"&gt;void&lt;/span&gt; Logout(&lt;span style="COLOR: blue"&gt;string&lt;/span&gt; userName); &lt;br /&gt;
&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;}&lt;/span&gt; &lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:9003f381-bdb0-462c-b0cd-b70524b1dcbd" style="PADDING-RIGHT: 0px; DISPLAY: inline; PADDING-LEFT: 0px; FLOAT: none; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"&gt;Technorati Tag: &lt;a rel="tag" href="http://technorati.com/tags/WCF"&gt;WCF&lt;/a&gt; &lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/dsantarelli/aggbug/95538.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dario Santarelli</dc:creator>
            <guid>http://blogs.ugidotnet.org/dsantarelli/archive/2009/02/24/wcf-ioperationbehavior-e-iparameterinspector.aspx</guid>
            <pubDate>Tue, 24 Feb 2009 14:02:08 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/dsantarelli/comments/95538.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/dsantarelli/archive/2009/02/24/wcf-ioperationbehavior-e-iparameterinspector.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/dsantarelli/comments/commentRss/95538.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/dsantarelli/services/trackbacks/95538.aspx</trackback:ping>
        </item>
        <item>
            <title>Pong con il designer WindowsForms</title>
            <category>About Me... 100% delirio!!!</category>
            <link>http://blogs.ugidotnet.org/dsantarelli/archive/2009/02/21/pong-con-il-designer-windowsforms.aspx</link>
            <description>&lt;p&gt;Clamoroso :D   &lt;br /&gt;    &lt;br /&gt;&lt;a title="http://blogs.msdn.com/mitsu/archive/2009/02/13/coding4fun-understanding-winforms-designmode.aspx" href="http://blogs.msdn.com/mitsu/archive/2009/02/13/coding4fun-understanding-winforms-designmode.aspx"&gt;http://blogs.msdn.com/mitsu/archive/2009/02/13/coding4fun-understanding-winforms-designmode.aspx&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/dsantarelli/aggbug/95526.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dario Santarelli</dc:creator>
            <guid>http://blogs.ugidotnet.org/dsantarelli/archive/2009/02/21/pong-con-il-designer-windowsforms.aspx</guid>
            <pubDate>Sat, 21 Feb 2009 19:27:43 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/dsantarelli/comments/95526.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/dsantarelli/archive/2009/02/21/pong-con-il-designer-windowsforms.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/dsantarelli/comments/commentRss/95526.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/dsantarelli/services/trackbacks/95526.aspx</trackback:ping>
        </item>
        <item>
            <title>EntityObject e DTO: copiare propriet&amp;agrave; comuni via extension method</title>
            <link>http://blogs.ugidotnet.org/dsantarelli/archive/2009/02/21/entityobject-e-dto-copiare-proprietagrave-comuni-via-extension-method.aspx</link>
            <description>&lt;p&gt;Quando si sviluppano architetture N-tier che prevedono uno o più service layer è sempre consigliabile l’utilizzo di &lt;a target="_blank" href="http://en.wikipedia.org/wiki/Data_Transfer_Object"&gt;DTO&lt;/a&gt; per scambiare dati tra livelli, indipendentemente dal (fuorviante) fatto che ogni DataContract esposto da un servizio (es. WCF) possa essere in mapping 1:1 con i business objects (es. &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/system.data.objects.dataclasses.entityobject.aspx"&gt;EntityObject&lt;/a&gt;). Un DTO infatti è solitamente un &lt;a target="_blank" href="http://en.wikipedia.org/wiki/POCO"&gt;POCO&lt;/a&gt; le cui proprietà in molti casi si possono mappare sia nel nome che nel tipo in un sottoinsieme di quelle di uno o più oggetti di business. &lt;br /&gt;
Ad ogni modo, al fine di aumentare la produttività nel valorizzare un DTO che possiede proprietà in comune nel nome e nel tipo con uno o più EntityObject, può avere senso implementare un extension method che via reflection copi il valore delle proprietà di un oggetto sorgente nelle proprietà di un oggetto destinazione appunto qualora tali proprietà abbiano stesso nome e tipo. &lt;br /&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;static&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; CopyProperties&amp;lt;T1, T2&amp;gt;(&lt;span style="COLOR: blue"&gt;this&lt;/span&gt; T1 source, T2 destination) &lt;br /&gt;
&lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;{&lt;span style="mso-spacerun: yes"&gt;            &lt;br /&gt;
   &lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (source == &lt;span style="COLOR: blue"&gt;null&lt;/span&gt;) &lt;span style="COLOR: blue"&gt;throw&lt;/span&gt; &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="COLOR: #a31515"&gt;"Source object can’t be null."&lt;/span&gt;); &lt;/span&gt;&lt;br /&gt;
   &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (destination == &lt;span style="COLOR: blue"&gt;null&lt;/span&gt;) &lt;span style="COLOR: blue"&gt;throw&lt;/span&gt; &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="COLOR: #a31515"&gt;"Destination object can’t be null."&lt;/span&gt;); &lt;br /&gt;
&lt;br /&gt;
   &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="COLOR: #2b91af"&gt;PropertyInfo&lt;/span&gt;[] destinationPropertyInfos = destination.GetType().GetProperties(); &lt;br /&gt;
   &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="COLOR: blue"&gt;foreach&lt;/span&gt; (&lt;span style="COLOR: #2b91af"&gt;PropertyInfo&lt;/span&gt; propertyInfo &lt;span style="COLOR: blue"&gt;in&lt;/span&gt; destinationPropertyInfos) &lt;br /&gt;
   &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;{ &lt;br /&gt;
     &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (propertyInfo.CanWrite) &lt;br /&gt;
     &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;{ &lt;br /&gt;
       &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;source.GetType().GetProperties() &lt;br /&gt;
           &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;.Where(p =&amp;gt; p.CanRead &amp;amp;&amp;amp; (p.Name == propertyInfo.Name &amp;amp;&amp;amp; p.PropertyType == propertyInfo.PropertyType)) &lt;br /&gt;
           &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;.ToList() &lt;br /&gt;
           &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;.ForEach(p =&amp;gt; propertyInfo.SetValue(destination, p.GetValue(source, &lt;span style="COLOR: blue"&gt;null&lt;/span&gt;), &lt;span style="COLOR: blue"&gt;null&lt;/span&gt;)); &lt;br /&gt;
     &lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;} &lt;br /&gt;
   &lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;} &lt;br /&gt;
&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;}&lt;/span&gt; &lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
Quindi, supponendo di avere il seguente object model di partenza... &lt;br /&gt;
&lt;br /&gt;
&lt;img alt="" src="http://img3.imageshack.us/img3/2646/immagineys5.jpg" /&gt;  &lt;br /&gt;
&lt;br /&gt;
...è possibile scrivere qualcosa del genere, al fine di evitare la noiosa scrittura delle solite righe di inizializzazione della classe DTO partendo dall’ Entity Objecy: &lt;br /&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: #2b91af; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;Customer&lt;/span&gt; &lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;customerEntity = &lt;span style="COLOR: blue"&gt;null&lt;/span&gt;; &lt;br /&gt;
&lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="COLOR: blue"&gt;using&lt;/span&gt; (&lt;span style="COLOR: #2b91af"&gt;NorthwindEntities&lt;/span&gt; entities = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;NorthwindEntities&lt;/span&gt;()) &lt;br /&gt;
&lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;{ &lt;br /&gt;
  &lt;/span&gt;&lt;span lang="EN-US" style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: en-us; mso-no-proof: yes"&gt;customerEntity = entities.Customers.First(c =&amp;gt; c.CustomerID == &lt;span style="COLOR: #a31515"&gt;"ALFKI"&lt;/span&gt;);&lt;span style="mso-spacerun: yes"&gt;                 &lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;} &lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="COLOR: #2b91af"&gt;CustomerDTO&lt;/span&gt; customerDTO = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;CustomerDTO&lt;/span&gt;(); &lt;br /&gt;
&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;customerEntity.CopyProperties(customerDTO);&lt;span style="mso-spacerun: yes"&gt;     &lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:86f25882-da86-49e9-b85c-d6e67c1960d9" style="PADDING-RIGHT: 0px; DISPLAY: inline; PADDING-LEFT: 0px; FLOAT: none; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"&gt;Technorati Tag: &lt;a rel="tag" href="http://technorati.com/tags/Reflection"&gt;Reflection&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/Extension+Method"&gt;Extension Method&lt;/a&gt; &lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/dsantarelli/aggbug/95521.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dario Santarelli</dc:creator>
            <guid>http://blogs.ugidotnet.org/dsantarelli/archive/2009/02/21/entityobject-e-dto-copiare-proprietagrave-comuni-via-extension-method.aspx</guid>
            <pubDate>Sat, 21 Feb 2009 00:33:29 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/dsantarelli/comments/95521.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/dsantarelli/archive/2009/02/21/entityobject-e-dto-copiare-proprietagrave-comuni-via-extension-method.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/dsantarelli/comments/commentRss/95521.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/dsantarelli/services/trackbacks/95521.aspx</trackback:ping>
        </item>
        <item>
            <title>[Entity Framework] EntityClient</title>
            <link>http://blogs.ugidotnet.org/dsantarelli/archive/2009/02/16/entity-framework-entityclient.aspx</link>
            <description>&lt;p&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/bb738561.aspx"&gt;EntityClient&lt;/a&gt; (namespace &lt;em&gt;System.Data.EntityClient&lt;/em&gt;) è un provider che l’EntityFramework mette a disposizione per accedere ai dati descritti da unEntity Data Model (EDM), ovvero una sorta di gateway per query&lt;em&gt; &lt;/em&gt;sul modello concettuale e non sulla relativa rappresentazione fisica.  &lt;br /&gt;
Le query invocabili dall’ EntityClient vanno dunque scritte in un dialetto di SQL chiamato “EntitySQL”: a runtime, la pipeline compila il testo EntitySQL in un command tree che viene passato al data provider sottostante per la generazione del comando SQL nativo. Dietro le quinte, infatti, EntityClient utilizza i provider ADO.NET per accedere alle sorgenti dati ( es. SqlClient per SQL Server ).  L’aspetto interessante è che i risultati di una query EntitySQL possono non limitarsi a semplici tabelle, bensì possono contenere anche gerarchie complesse. &lt;br /&gt;
In generale, l’uso di EntityClient è consigliabile in applicazioni model-based che richiedono particolari performance nella misura in cui non si necessita della materializzazione delle Entities a partire da resultset, bensì di un IDataReader consumabile direttamente magari per materializzazioni di oggetti specifici. &lt;br /&gt;
In qualità di provider ADO.NET a tutti gli effetti, EntityClient segue i soliti pattern Connection-Command-Parameter-DataReader, etc. dove le suddette classi sono precedute dal prefisso “Entity”. Ecco un esempio di paginazione dati usando EntityClient: &lt;br /&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN-BOTTOM: 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;public&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt; &lt;span style="COLOR: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&amp;gt; GetProductNames(&lt;span style="COLOR: blue"&gt;int&lt;/span&gt; pageNumber, &lt;span style="COLOR: blue"&gt;int&lt;/span&gt; pageSize) &lt;br /&gt;
&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;{ &lt;br /&gt;
  &lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&lt;span style="COLOR: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&amp;gt; productNames = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;&amp;gt;(); &lt;br /&gt;
  &lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&lt;span style="COLOR: blue"&gt;using&lt;/span&gt; (&lt;span style="COLOR: #2b91af"&gt;EntityConnection&lt;/span&gt; conn = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;EntityConnection&lt;/span&gt;(&lt;span style="COLOR: #a31515"&gt;"name=NorthwindEntities"&lt;/span&gt;)) &lt;br /&gt;
  &lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;{ &lt;br /&gt;
    &lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&lt;span style="COLOR: blue"&gt;string&lt;/span&gt; cmdText = &lt;span style="COLOR: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="COLOR: #a31515"&gt;"SELECT VALUE v FROM NorthwindEntities.Products AS v ORDER BY v.ProductName SKIP {0} LIMIT {1}"&lt;/span&gt;, (pageNumber * pageSize).ToString(), pageSize);&lt;span style="mso-spacerun: yes"&gt;                   &lt;br /&gt;
&lt;br /&gt;
    &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&lt;span style="COLOR: blue"&gt;using&lt;/span&gt; (&lt;span style="COLOR: #2b91af"&gt;EntityCommand&lt;/span&gt; cmd = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; &lt;span style="COLOR: #2b91af"&gt;EntityCommand&lt;/span&gt;(cmdText, conn)) &lt;br /&gt;
    &lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;{ &lt;br /&gt;
      &lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;conn.Open();&lt;span style="mso-spacerun: yes"&gt;     &lt;br /&gt;
      &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&lt;span style="COLOR: blue"&gt;using&lt;/span&gt;(&lt;span style="COLOR: #2b91af"&gt;EntityDataReader&lt;/span&gt; reader = cmd.ExecuteReader(&lt;span style="COLOR: #2b91af"&gt;CommandBehavior&lt;/span&gt;.SequentialAccess))&lt;span style="mso-spacerun: yes"&gt;                &lt;br /&gt;
      &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;{ &lt;br /&gt;
        &lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&lt;span style="COLOR: blue"&gt;while&lt;/span&gt; (reader.Read()) productNames.Add(reader[&lt;span style="COLOR: #a31515"&gt;"ProductName"&lt;/span&gt;].ToString()); &lt;br /&gt;
      &lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;}&lt;span style="mso-spacerun: yes"&gt;                                                 &lt;br /&gt;
    &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;} &lt;br /&gt;
   &lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;} &lt;br /&gt;
   &lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&lt;span style="COLOR: blue"&gt;return&lt;/span&gt; productNames; &lt;br /&gt;
&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; LINE-HEIGHT: 115%; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:e1600ca7-4fa8-4d3a-9aa2-d1c6cbca33cb" style="PADDING-RIGHT: 0px; DISPLAY: inline; PADDING-LEFT: 0px; FLOAT: none; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"&gt;Technorati Tag: &lt;a rel="tag" href="http://technorati.com/tags/Entity+Framework"&gt;Entity Framework&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/dsantarelli/aggbug/95481.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dario Santarelli</dc:creator>
            <guid>http://blogs.ugidotnet.org/dsantarelli/archive/2009/02/16/entity-framework-entityclient.aspx</guid>
            <pubDate>Sun, 15 Feb 2009 23:03:52 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/dsantarelli/comments/95481.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/dsantarelli/archive/2009/02/16/entity-framework-entityclient.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/dsantarelli/comments/commentRss/95481.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/dsantarelli/services/trackbacks/95481.aspx</trackback:ping>
        </item>
        <item>
            <title>Caricamento dinamico di JavaScript con jQuery AJAX</title>
            <link>http://blogs.ugidotnet.org/dsantarelli/archive/2009/02/13/caricamento-dinamico-di-javascript-con-jquery-ajax.aspx</link>
            <description>&lt;p&gt;Una delle tecniche che permettono di aumentare le performance di un' applicazione web si basa sul caricamento "on-demand" di javascript via Ajax. In questo modo si possono ridurre le latenze di precaricamento di troppe librerie javascript alla prima GET di una pagina. Infatti, in alcuni scenari specifici risulta più consigliabile scaricare "pezzi" di script solo quando se ne ha bisogno. Fino a non molto tempo fa ho avuto modo di testare alcune librerie free come &lt;a target="_blank" href="http://javascriptmvc.com/learningcenter/include/index.html"&gt;Include&lt;/a&gt; e &lt;a target="_blank" href="http://ajile.iskitz.com/"&gt;AJILE&lt;/a&gt; che permettono di raggiungere questo obiettivo senza troppi problemi. Ma da quando sono passato a &lt;a target="_blank" href="http://jquery.com/"&gt;jQuery&lt;/a&gt; le cose sono cambiate :D.&lt;br /&gt;
Vorrei semplicemente mostrare un paragone tra l'utilizzo classico di XMLHTTP e l'utilizzo di &lt;a target="_blank" href="http://docs.jquery.com/Ajax/jQuery.getScript"&gt;Ajax/jQuery.getScript&lt;/a&gt;. &lt;br /&gt;
Supponiamo di voler caricare dinamicamente ed eseguire una function javascript "HelloWorld()"che si trova in un file HelloWorld.js &lt;/p&gt;
&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;function&lt;/span&gt; &lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&lt;font color="#000000"&gt;HelloWorld() { alert(&lt;/font&gt; &lt;span style="COLOR: #a31515"&gt;'Hello World!'&lt;/span&gt; &lt;font color="#000000"&gt;); }&lt;/font&gt; &lt;/span&gt;&lt;/p&gt;
&lt;/font&gt;&lt;/font&gt;
&lt;p&gt;&lt;br /&gt;
al click di un button nella nostra pagina.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;1. Esempio con XMLHTTP&lt;/em&gt; &lt;/strong&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&amp;lt;!&lt;/span&gt; &lt;span lang="EN-GB" style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;DOCTYPE&lt;/span&gt; &lt;span lang="EN-GB" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&lt;span style="COLOR: red"&gt;html&lt;/span&gt; &lt;span style="COLOR: red"&gt;PUBLIC&lt;/span&gt; &lt;span style="COLOR: blue"&gt;"-//W3C//DTD XHTML 1.0 Transitional//EN"&lt;/span&gt; &lt;span style="COLOR: blue"&gt;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;o:p /&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&amp;lt;&lt;/span&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;html&lt;/span&gt; &lt;span lang="EN-GB" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&lt;span style="COLOR: red"&gt;xmlns&lt;/span&gt; &lt;span style="COLOR: blue"&gt;="http://www.w3.org/1999/xhtml"&amp;gt;&lt;o:p /&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&amp;lt;&lt;/span&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;head&lt;/span&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&amp;gt;&lt;/span&gt; &lt;span lang="EN-GB" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;script&lt;/span&gt; &lt;span style="COLOR: red"&gt;type&lt;/span&gt; &lt;span style="COLOR: blue"&gt;="text/javascript"&amp;gt;&lt;o:p /&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;&lt;span style="COLOR: blue"&gt;function&lt;/span&gt; CallExternalScriptMethod(scriptUrl, targetCall) &lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;{&lt;o:p /&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt;        &lt;/span&gt;&lt;span style="COLOR: blue"&gt;var&lt;/span&gt; &lt;st1:city w:st="on"&gt;&lt;st1:place w:st="on"&gt;AJAX&lt;/st1:place&gt; &lt;/st1:city&gt;= &lt;span style="COLOR: blue"&gt;null&lt;/span&gt;;&lt;o:p /&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt;        &lt;/span&gt;&lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (window.XMLHttpRequest) &lt;st1:city w:st="on"&gt;&lt;st1:place w:st="on"&gt;AJAX&lt;/st1:place&gt; &lt;/st1:city&gt;= &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; XMLHttpRequest();&lt;o:p /&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt;        &lt;/span&gt;&lt;span style="COLOR: blue"&gt;else&lt;/span&gt; &lt;st1:city w:st="on"&gt;&lt;st1:place w:st="on"&gt;AJAX&lt;/st1:place&gt; &lt;/st1:city&gt;= &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; ActiveXObject(&lt;span style="COLOR: #a31515"&gt;"Microsoft.XMLHTTP"&lt;/span&gt;);&lt;o:p /&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&lt;o:p&gt; &lt;/o:p&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt;       &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;AJAX.onreadystatechange = &lt;span style="COLOR: blue"&gt;function&lt;/span&gt;() {&lt;o:p /&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;&lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (AJAX.readyState == 4 &amp;amp;&amp;amp; AJAX.status == 200) {&lt;o:p /&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt;                &lt;/span&gt;eval(AJAX.responseText);&lt;o:p /&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt;                &lt;/span&gt;eval(targetCall);&lt;o:p /&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;}&lt;o:p /&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt;        &lt;/span&gt;}&lt;o:p /&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt;                   &lt;/span&gt;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt;        &lt;/span&gt;AJAX.open(&lt;span style="COLOR: #a31515"&gt;"GET"&lt;/span&gt;, scriptUrl, &lt;span style="COLOR: blue"&gt;true&lt;/span&gt;);&lt;o:p /&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt;        &lt;/span&gt;AJAX.send(&lt;span style="COLOR: blue"&gt;null&lt;/span&gt;);&lt;o:p /&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;}&lt;span style="mso-spacerun: yes"&gt;                                  &lt;/span&gt;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&amp;lt;/&lt;/span&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;script&lt;/span&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&amp;gt;&lt;o:p /&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&amp;lt;&lt;/span&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;title&lt;/span&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;title&lt;/span&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&amp;gt;&lt;o:p /&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&amp;lt;/&lt;/span&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;head&lt;/span&gt; &lt;span lang="EN-GB" style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&amp;gt;&lt;o:p /&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&amp;lt;&lt;/span&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;body&lt;/span&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&amp;gt;&lt;o:p /&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;div&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;o:p /&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt;       &lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;input&lt;/span&gt; &lt;span style="COLOR: red"&gt;type&lt;/span&gt;&lt;span style="COLOR: blue"&gt;="button"&lt;/span&gt; &lt;span style="COLOR: red"&gt;id&lt;/span&gt;&lt;span style="COLOR: blue"&gt;="btnGO"&lt;/span&gt; &lt;span style="COLOR: red"&gt;value&lt;/span&gt;&lt;span style="COLOR: blue"&gt;="GO!!!"&lt;/span&gt; &lt;br /&gt;
              &lt;span style="COLOR: red"&gt;onclick&lt;/span&gt;&lt;span style="COLOR: blue"&gt;="CallExternalScriptMethod('HelloWorld.js','HelloWorld()')"&lt;/span&gt; &lt;span style="COLOR: blue"&gt;/&amp;gt;&lt;o:p /&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;div&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;gt;&lt;/span&gt; &lt;span style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;&lt;o:p /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;body&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;gt;&lt;o:p /&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;html&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;gt;&lt;o:p /&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;&lt;br /&gt;
2. Esempio con Ajax/jQuery.getScript&lt;/strong&gt; &lt;/em&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&amp;lt;!&lt;/span&gt; &lt;span lang="EN-GB" style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;DOCTYPE&lt;/span&gt; &lt;span lang="EN-GB" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&lt;span style="COLOR: red"&gt;html&lt;/span&gt; &lt;span style="COLOR: red"&gt;PUBLIC&lt;/span&gt; &lt;span style="COLOR: blue"&gt;"-//W3C//DTD XHTML 1.0 Transitional//EN"&lt;/span&gt; &lt;span style="COLOR: blue"&gt;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;o:p /&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&amp;lt;&lt;/span&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;html&lt;/span&gt; &lt;span lang="EN-GB" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&lt;span style="COLOR: red"&gt;xmlns&lt;/span&gt; &lt;span style="COLOR: blue"&gt;="http://www.w3.org/1999/xhtml"&amp;gt;&lt;o:p /&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&amp;lt;&lt;/span&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;head&lt;/span&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&amp;gt;&lt;o:p /&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;script&lt;/span&gt; &lt;span style="COLOR: red"&gt;type&lt;/span&gt; &lt;span style="COLOR: blue"&gt;="text/javascript"&lt;/span&gt; &lt;span style="COLOR: red"&gt;src&lt;/span&gt; &lt;span style="COLOR: blue"&gt;="http://code.jquery.com/jquery-latest.js"&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;script&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;o:p /&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;script&lt;/span&gt; &lt;span style="COLOR: red"&gt;type&lt;/span&gt; &lt;span style="COLOR: blue"&gt;="text/javascript"&amp;gt;&lt;o:p /&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt;        &lt;/span&gt;&lt;span style="COLOR: blue"&gt;function&lt;/span&gt; CallExternalScriptMethod(scriptUrl, targetCall) &lt;br /&gt;
        {&lt;o:p /&gt; &lt;/span&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt;            &lt;/span&gt;$.getScript(scriptUrl, &lt;span style="COLOR: blue"&gt;function&lt;/span&gt;() {&lt;o:p /&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt;                    &lt;/span&gt;eval(targetCall);&lt;o:p /&gt; &lt;br /&gt;
            &lt;/span&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;});&lt;o:p /&gt; &lt;/span&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt;        &lt;/span&gt;}&lt;o:p /&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;script&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;o:p /&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;title&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;title&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;o:p /&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&amp;lt;/&lt;/span&gt; &lt;span lang="EN-GB" style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;head&lt;/span&gt; &lt;span lang="EN-GB" style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&amp;gt;&lt;o:p /&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&amp;lt;&lt;/span&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;body&lt;/span&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&amp;gt;&lt;o:p /&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;div&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;o:p /&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt;        &lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;input&lt;/span&gt; &lt;span style="COLOR: red"&gt;type&lt;/span&gt;&lt;span style="COLOR: blue"&gt;="button"&lt;/span&gt; &lt;span style="COLOR: red"&gt;id&lt;/span&gt;&lt;span style="COLOR: blue"&gt;="btnGO"&lt;/span&gt; &lt;span style="COLOR: red"&gt;value&lt;/span&gt;&lt;span style="COLOR: blue"&gt;="GO!!!"&lt;/span&gt; &lt;br /&gt;
               &lt;span style="COLOR: red"&gt;onclick&lt;/span&gt;&lt;span style="COLOR: blue"&gt;="CallExternalScriptMethod('HelloWorld.js','HelloWorld()')"&lt;/span&gt; &lt;span style="COLOR: blue"&gt;/&amp;gt;&lt;o:p /&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="FONT-SIZE: 8pt; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;div&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;gt;&lt;o:p /&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;body&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;gt;&lt;o:p /&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: #a31515; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;html&lt;/span&gt;&lt;span style="FONT-SIZE: 8pt; COLOR: blue; FONT-FAMILY: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&amp;gt;&lt;o:p /&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
Come si può notare la facilità e l'eleganza di realizzazione con jQuery è disarmante. Inoltre, a partire dalla v1.2 abbiamo gratuitamente un nuovo enanchement riguardante le possibili problematiche relative a richieste cross-domain che limiterebbero l'utilizzo dell'esempio con XMLHTTP sopra riportato:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Before jQuery 1.2, getScript was only able to load scripts from the same domain as the original page. As of 1.2, you can now load JavaScript files from any domain. &lt;/p&gt;
&lt;/blockquote&gt;&lt;br /&gt;
&lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:3e259f3a-8328-438b-9c46-85ad992f22e6" style="PADDING-RIGHT: 0px; DISPLAY: inline; PADDING-LEFT: 0px; FLOAT: none; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"&gt;Technorati Tag: &lt;a rel="tag" href="http://technorati.com/tags/Ajax"&gt;Ajax&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/jQuery"&gt;jQuery&lt;/a&gt; &lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/dsantarelli/aggbug/95467.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dario Santarelli</dc:creator>
            <guid>http://blogs.ugidotnet.org/dsantarelli/archive/2009/02/13/caricamento-dinamico-di-javascript-con-jquery-ajax.aspx</guid>
            <pubDate>Fri, 13 Feb 2009 15:30:28 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/dsantarelli/comments/95467.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/dsantarelli/archive/2009/02/13/caricamento-dinamico-di-javascript-con-jquery-ajax.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/dsantarelli/comments/commentRss/95467.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/dsantarelli/services/trackbacks/95467.aspx</trackback:ping>
        </item>
        <item>
            <title>XPUG Marche.... Chi è interessato?</title>
            <link>http://blogs.ugidotnet.org/dsantarelli/archive/2009/02/10/xpug-marche.-chi-e-interessato.aspx</link>
            <description>&lt;p&gt;Segnalo questa importante iniziativa che sta partendo su &lt;font face="Arial"&gt;&lt;a target="_blank" href="http://www.agilemovement.it"&gt;agilemovement.it&lt;/a&gt; : &lt;strong&gt;XPUG Marche&lt;/strong&gt;.&lt;br /&gt;
Lo scopo è la creazione di una community attenta nel promuovere le metodologie "agili" sul territorio marchigiano.  &lt;br /&gt;
C&lt;/font&gt;hi è interessato a dare il proprio contributo può rispondere a questo appello:&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;&lt;a target="_blank" href="http://www.agilemovement.it/forum/topics/xpug-marche-chi-e-interessato"&gt;http://www.agilemovement.it/forum/topics/xpug-marche-chi-e-interessato&lt;/a&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
Per ora ci stiamo contando in modo da &lt;strong&gt;organizzare un incontro prima possibile&lt;/strong&gt; , per decidere sul da farsi. &lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/dsantarelli/aggbug/95441.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dario Santarelli</dc:creator>
            <guid>http://blogs.ugidotnet.org/dsantarelli/archive/2009/02/10/xpug-marche.-chi-e-interessato.aspx</guid>
            <pubDate>Tue, 10 Feb 2009 15:57:46 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/dsantarelli/comments/95441.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/dsantarelli/archive/2009/02/10/xpug-marche.-chi-e-interessato.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/dsantarelli/comments/commentRss/95441.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/dsantarelli/services/trackbacks/95441.aspx</trackback:ping>
        </item>
        <item>
            <title>[WCF] Operazioni asincrone client-side</title>
            <category>WCF</category>
            <link>http://blogs.ugidotnet.org/dsantarelli/archive/2009/02/09/wcf-operazioni-asincrone-client-side.aspx</link>
            <description>&lt;p&gt;WCF è un framework concepito per sviluppare scenari di comunicazione completamente disaccoppiati sotto ogni punto di vista. In particolare, per quanto riguarda la sincronizzazione dei messaggi, è prevista internamente una rigida implementazione di pattern asincroni per ottenere chiamate non bloccanti tra i vari livelli strutturali. Esternamente, invece, WCF espone possibilità di programmazione asincrona sia client-side che server-side. L'aspetto interessante da approfondire in merito è come il programming model asincrono client-side non abbia nulla a che vedere con quello server-side: ovvero, un client può sostanzialmente invocare in modo asincrono un servizio indipendentemente dal fatto che esso sia implementato con un pattern sincrono piuttosto che asincrono.    &lt;br /&gt;Il disaccoppiamento avviene infatti a livello di trasporto quando i dati vengono serializzati/deserializzati.     &lt;br /&gt;Per capire l’importanza di tale feature pensiamo semplicemente ad un’ architettura N-tier che poggia su WCF: potremmo avere diverse “operation” che a loro volta utilizzano proxy client verso altre operation WCF, rendendo vitale l’utilizzo di pattern di comunicazione asincroni.  &lt;br /&gt;Vediamo un semplice esempio. Supponiamo di avere il seguente ServiceContract:     &lt;br /&gt;    &lt;br /&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;[&lt;span style="color: #2b91af"&gt;ServiceContract&lt;/span&gt;]      &lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;interface&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IAuthentication       &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;{     &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;[&lt;span style="color: #2b91af"&gt;OperationContract&lt;/span&gt;]      &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: #2b91af"&gt;UserInfo&lt;/span&gt; Login(&lt;span style="color: blue"&gt;string&lt;/span&gt; username, &lt;span style="color: blue"&gt;string&lt;/span&gt; password);&lt;span style="mso-spacerun: yes"&gt;        &lt;br /&gt;        &lt;br /&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;[&lt;span style="color: #2b91af"&gt;OperationContract&lt;/span&gt;]      &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;void&lt;/span&gt; Logout(&lt;span style="color: blue"&gt;string&lt;/span&gt; username);      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;}     &lt;br /&gt;&lt;span style="mso-spacerun: yes"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;Se lato client utilizzassimo &lt;a href="http://msdn.microsoft.com/en-us/library/aa347733.aspx" target="_blank"&gt;Svcutil&lt;/a&gt; ( con gli opportuni parametri ) o il solito “Add Service Reference” di VisualStudio, otterremmo la generazione automatica del seguente object model:    &lt;br /&gt;    &lt;br /&gt;&lt;img src="http://img4.imageshack.us/img4/4205/asyncpn6.jpg" /&gt;  &lt;br /&gt;    &lt;br /&gt;Come si può osservare abbiamo una versione asincrona client-side del ServiceContract &lt;em&gt;(IAuthentication)&lt;/em&gt;, un' interfaccia &lt;em&gt;&amp;lt;ServiceContract&amp;gt;Channel&lt;/em&gt; (&lt;em&gt;IAuthenticationChannel&lt;/em&gt;) ed una classe Client (&lt;em&gt;AuthenticationClient&lt;/em&gt;) che espone metodi di invocazione sia asincroni che sincroni. Nello specifico, si prospettano due possibili modalità di invocazione asincrona client-side di un’ operation: &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;1. Invocazione asincrona “event-based” (o “event-driven”)&lt;/em&gt;&lt;/strong&gt;  &lt;br /&gt;E' la modalità più semplice e raccomandata poiché richede solamente l’aggiunta di un EventHandler per ricevere una notifica all’occorrenza di una risposta. Questa modalità ( disponibile solo nel framework 3.5 e comunque solo per questo tipo di invocazione ) permette di sfruttare l’approccio asincrono event-based tramite un metodo nella forma &amp;lt;&lt;i&gt;operationName&lt;/i&gt;&amp;gt;&lt;em&gt;Async &lt;/em&gt;e l’intercettazione di un evento &amp;lt;&lt;i&gt;operationName&lt;/i&gt;&amp;gt;&lt;em&gt;Completed &lt;/em&gt;al cui interno si ha accesso al risultato dell’invocazione &amp;lt;&lt;i&gt;operationName&lt;/i&gt;&amp;gt;&lt;em&gt;CompletedEventArgs.&lt;/em&gt;    &lt;br /&gt;    &lt;br /&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;...     &lt;br /&gt;      &lt;br /&gt;ServiceReference.&lt;span style="color: #2b91af"&gt;AuthenticationClient&lt;/span&gt; client = &lt;span style="color: blue"&gt;new&lt;/span&gt; ServiceReference.&lt;span style="color: #2b91af"&gt;AuthenticationClient&lt;/span&gt;();      &lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;client.&lt;strong&gt;LoginCompleted&lt;/strong&gt; += &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;EventHandler&lt;/span&gt;&amp;lt;ServiceReference.&lt;span style="color: #2b91af"&gt;LoginCompletedEventArgs&lt;/span&gt;&amp;gt;(client_LoginCompleted);      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;client.&lt;strong&gt;LoginAsync&lt;/strong&gt;(&lt;span style="color: #a31515"&gt;"dario.santarelli"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"password"&lt;/span&gt;);      &lt;br /&gt;      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;&lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.ReadLine();      &lt;br /&gt;      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;client.Close();     &lt;br /&gt;      &lt;br /&gt;...&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: blue; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;protected&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; client_LoginCompleted(&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, ServiceReference.&lt;span style="color: #2b91af"&gt;LoginCompletedEventArgs&lt;/span&gt; e)      &lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;{     &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: #2b91af"&gt;UserInfo&lt;/span&gt; info = e.Result &lt;span style="color: blue"&gt;as&lt;/span&gt; &lt;span style="color: #2b91af"&gt;UserInfo&lt;/span&gt;;      &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-size: 8pt; color: #2b91af; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;Console&lt;/span&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;.WriteLine(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;"UserName: {0} - Password: {1}"&lt;/span&gt;,info.UserName,info.Email));      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;}&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us"&gt;     &lt;p /&gt;   &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;   &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;2. Invocazione asincrona via ChannelFactory&lt;/em&gt;&lt;/strong&gt;    &lt;br /&gt;Il pattern asincrono previsto in questa modalità è quello classico previsto a partire dal framework 1.1: tramite lo split di un operation in due metodi ( &lt;em&gt;Begin&amp;lt;operationName&amp;gt;&lt;/em&gt; e &lt;em&gt;End&amp;lt;operationName&amp;gt; ), &lt;/em&gt;si sfruttano oggetti che implementano l’interfaccia &lt;a href="http://msdn.microsoft.com/en-us/library/system.iasyncresult.aspx" target="_blank"&gt;System.IAsyncResult&lt;/a&gt; per rappresentare lo stato di una operazione asincrona.&lt;/p&gt;  &lt;p&gt;...   &lt;br /&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0pt; line-height: normal; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: #2b91af; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;EndpointAddress&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt; endpointAddress = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;EndpointAddress&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"http://.../AuthenticationService.svc"&lt;/span&gt;);      &lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;ServiceReference.&lt;span style="color: #2b91af"&gt;IAuthenticationChannel&lt;/span&gt; channelClient = &lt;span style="color: #2b91af"&gt;ChannelFactory&lt;/span&gt;&amp;lt;ServiceReference.&lt;span style="color: #2b91af"&gt;IAuthenticationChannel&lt;/span&gt;&amp;gt;.CreateChannel(&lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;BasicHttpBinding&lt;/span&gt;(), endpointAddress);      &lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: #2b91af"&gt;IAsyncResult&lt;/span&gt; result = channelClient.&lt;strong&gt;BeginLogin&lt;/strong&gt;(&lt;span style="color: #a31515"&gt;"dario.santarelli"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"password"&lt;/span&gt;, LoginCallBack, channelClient);      &lt;br /&gt;      &lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.ReadLine();      &lt;br /&gt;      &lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;channelClient.Close();     &lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;channelClient.Dispose();     &lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;       &lt;br /&gt;...   &lt;br /&gt;        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: blue"&gt;protected&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; LoginCallBack(&lt;span style="color: #2b91af"&gt;IAsyncResult&lt;/span&gt; ar)      &lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;{     &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: en-us; mso-no-proof: yes"&gt;&lt;span style="color: #2b91af"&gt;UserInfo&lt;/span&gt; result = ((ServiceReference.&lt;span style="color: #2b91af"&gt;IAuthenticationChannel&lt;/span&gt;)ar.AsyncState).&lt;strong&gt;EndLogin&lt;/strong&gt;(ar);      &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-size: 8pt; color: #2b91af; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;Console&lt;/span&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;.WriteLine(&lt;span style="color: #a31515"&gt;"Result: {0}"&lt;/span&gt;, result.UserName);      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;}&lt;/span&gt;&lt;span lang="EN-US" style="mso-ansi-language: en-us"&gt;     &lt;p /&gt;   &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&lt;strong&gt;&lt;em&gt;Conclusioni&lt;/em&gt;&lt;/strong&gt;    &lt;br /&gt;In entrambe le soluzioni presentate, una nostra application può invocare un’operazione in maniera asincrona anche se il servizio è implementato in maniera sincrona, allo stesso modo con cui una applicazione può usare lo stesso pattern per invocare in maniera asincrona un metodo sincrono locale. “Come” è poi implementato l’ OperationContract è assolutamente insignificante per il client.&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;Risorse MSDN:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms734701.aspx" target="_blank"&gt;Synchronous and Asynchronous Operations&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms730059.aspx" target="_blank"&gt;How to: Call WCF Service Operations Asynchronously&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bb885132.aspx" target="_blank"&gt;How to: Call Operations Asynchronously Using a Channel Factory&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt; &lt;/p&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:3e259f3a-8328-438b-9c46-85ad992f22e6" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tag: &lt;a href="http://technorati.com/tags/WCF" rel="tag"&gt;WCF&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Async" rel="tag"&gt;Async&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/dsantarelli/aggbug/95433.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dario Santarelli</dc:creator>
            <guid>http://blogs.ugidotnet.org/dsantarelli/archive/2009/02/09/wcf-operazioni-asincrone-client-side.aspx</guid>
            <pubDate>Mon, 09 Feb 2009 22:24:15 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/dsantarelli/comments/95433.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/dsantarelli/archive/2009/02/09/wcf-operazioni-asincrone-client-side.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/dsantarelli/comments/commentRss/95433.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/dsantarelli/services/trackbacks/95433.aspx</trackback:ping>
        </item>
        <item>
            <title>Visual Studio Testing Extensions</title>
            <link>http://blogs.ugidotnet.org/dsantarelli/archive/2009/02/03/visual-studio-testing-extensions.aspx</link>
            <description>&lt;p&gt;Segnalo il progetto “&lt;a href="http://www.codeplex.com/vstestingextensions" target="_blank"&gt;Visual Studio Testing Extensions&lt;/a&gt;” su CodePlex. Si tratta di una library concepita principalmente per migliorare la creazione di UnitTest nell’ambiente di Testing di Visual Studio. In breve, la library introduce due feature:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;La possibilità di &lt;strong&gt;migliorare sensibilmente la&lt;/strong&gt; &lt;strong&gt;leggibilità&lt;/strong&gt; di uno unit test grazie all’introduzione di opportuni extension methods ( es. &lt;em&gt;myInt.ShouldEqual(5);&lt;/em&gt;   invece di  &lt;em&gt;Assert.AreEqual(&lt;em&gt;myInt&lt;/em&gt;, 5);&lt;/em&gt; )&lt;/li&gt;    &lt;li&gt;La possibilità di &lt;strong&gt;asserire&lt;/strong&gt; &lt;strong&gt;exception multiple&lt;/strong&gt; nei risultati attesi di un singolo TestMethod. Il tutto sfruttando un delegate Action(). Ad esempio:&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;&lt;em&gt;Testing.ShouldThrowException&amp;lt;ArgumentNullException&amp;gt;(() =&amp;gt; { … something throws ArgumentNullException … });&lt;/em&gt;&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;p&gt;   &lt;br /&gt;&lt;/p&gt;  &lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:6c1bae6d-15b1-41a8-ab4e-cc5e7cb68c39" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tag: &lt;a href="http://technorati.com/tags/UnitTest" rel="tag"&gt;UnitTest&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/dsantarelli/aggbug/95378.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dario Santarelli</dc:creator>
            <guid>http://blogs.ugidotnet.org/dsantarelli/archive/2009/02/03/visual-studio-testing-extensions.aspx</guid>
            <pubDate>Tue, 03 Feb 2009 19:22:57 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/dsantarelli/comments/95378.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/dsantarelli/archive/2009/02/03/visual-studio-testing-extensions.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/dsantarelli/comments/commentRss/95378.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/dsantarelli/services/trackbacks/95378.aspx</trackback:ping>
        </item>
        <item>
            <title>[WCF] Esempio di Integration Test</title>
            <category>WCF</category>
            <link>http://blogs.ugidotnet.org/dsantarelli/archive/2009/01/31/wcf-esempio-di-integration-test.aspx</link>
            <description>&lt;p&gt;Esistono molti strumenti e tecniche per effettuare un &lt;a href="http://en.wikipedia.org/wiki/Integration_testing" target="_blank"&gt;integration test&lt;/a&gt; di servizi WCF. Un modo che ho trovato molto semplice ed utile si ottiene sruttando il framework di unit testing di Visual Studio: infatti, utilizzando due metodi decorati rispettivamente con &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.classinitializeattribute(VS.80).aspx" target="_blank"&gt;ClassInitialize&lt;/a&gt; e &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.classcleanupattribute(VS.80).aspx" target="_blank"&gt;ClassCleanup&lt;/a&gt; possiamo gestire il ciclo di vita di un ServiceHost, evitando così il deploy preventivo (es. Cassini, IIS etc.) del servizio.     &lt;br /&gt;Nel seguente esempio viene mostrata questa tecnica supponendo di voler testare un servizio di autenticazione &lt;em&gt;AuthenticationService&lt;/em&gt; che implementa un service contract &lt;em&gt;IAuthentication,&lt;/em&gt; il quale definisce due metodi: Login(…) e Logout().     &lt;br /&gt;&lt;span style="font-size: 8pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;     &lt;br /&gt;      &lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;[&lt;span style="color: #2b91af"&gt;TestClass&lt;/span&gt;]       &lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;AuthenticationUnitTest        &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;{      &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ServiceHost&lt;/span&gt; _serviceHost;       &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; _address = &lt;span style="color: #a31515"&gt;"AuthenticationService"&lt;/span&gt;;       &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; _baseAddress = &lt;span style="color: #a31515"&gt;"http://127.0.0.1:5656/"&lt;/span&gt;;       &lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;     &lt;br /&gt;  [&lt;span style="color: #2b91af"&gt;ClassInitialize&lt;/span&gt;]       &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; ServiceHostInitialize(&lt;span style="color: #2b91af"&gt;TestContext&lt;/span&gt; testContext)       &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;{      &lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;_serviceHost = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ServiceHost&lt;/span&gt;(&lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;AuthenticationService&lt;/span&gt;), &lt;span style="color: blue"&gt;new&lt;/span&gt;[] { &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Uri&lt;/span&gt;(_baseAddress) });       &lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;_serviceHost.AddServiceEndpoint(&lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;IAuthentication&lt;/span&gt;), &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;WSHttpBinding&lt;/span&gt;(), _address);       &lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;_serviceHost.Open();      &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;}      &lt;br /&gt;      &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;[&lt;span style="color: #2b91af"&gt;ClassCleanup&lt;/span&gt;]       &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; ServiceHostCleanup() { _serviceHost.Close(); }       &lt;br /&gt;      &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;[&lt;span style="color: #2b91af"&gt;TestMethod&lt;/span&gt;]       &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; AuthenticateUser()       &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;{      &lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="color: blue"&gt;string&lt;/span&gt; userName = &lt;span style="color: #a31515"&gt;"dario.santarelli"&lt;/span&gt;;       &lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="color: blue"&gt;string&lt;/span&gt; password = &lt;span style="color: #a31515"&gt;"password"&lt;/span&gt;;       &lt;br /&gt;      &lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="color: #2b91af"&gt;EndpointAddress&lt;/span&gt; endpointAddress = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;EndpointAddress&lt;/span&gt;(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;"{0}{1}"&lt;/span&gt;, _baseAddress,_address));       &lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="color: #2b91af"&gt;IAuthentication&lt;/span&gt; proxy = &lt;span style="color: #2b91af"&gt;ChannelFactory&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;IAuthentication&lt;/span&gt;&amp;gt;.CreateChannel(&lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;WSHttpBinding&lt;/span&gt;(), endpointAddress);       &lt;br /&gt;      &lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="color: #2b91af"&gt;UserInfo&lt;/span&gt; userInfo = proxy.Login(userName, password);       &lt;br /&gt;      &lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="color: #2b91af"&gt;Assert&lt;/span&gt;.IsNotNull(userInfo);       &lt;br /&gt;    &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes; mso-ansi-language: en-us"&gt;&lt;span style="color: #2b91af"&gt;Assert&lt;/span&gt;.AreEqual(userInfo.Username, userName);       &lt;br /&gt;      &lt;br /&gt;    &lt;/span&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;proxy.Logout(userName);&lt;span style="mso-spacerun: yes"&gt;            &lt;br /&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;}      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; line-height: 115%; font-family: &amp;quot;Courier New&amp;quot;; mso-no-proof: yes"&gt;}&lt;/span&gt;&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;strong&gt;Update&lt;/strong&gt;: con questa tecnica non si intende sostituire il test in ambiente di produzione, bensì fornire un modo “base” per verificare il funzionamento di una WCF Service Library. Infatti, come si può notare, in questo caso sia lo UnitTest che il ServiceHost girano nello stesso AppDomain, il che NON garantisce by design il corretto comportamento del test come se fosse in produzione. Per avere test maggiormente efficaci, si consiglia l’utilizzo di soluzioni più “evolute” come &lt;a href="http://msdn.microsoft.com/en-us/library/bb552363.aspx" target="_blank"&gt;WcfSvcHost&lt;/a&gt; o, meglio, direttamente un ambiente di test dedicato su IIS :D.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;    &lt;/p&gt;&lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:8c99e46d-5b0e-4b82-a844-c7763f7d5abe" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tag: &lt;a href="http://technorati.com/tags/WCF" rel="tag"&gt;WCF&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Testing" rel="tag"&gt;Testing&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/dsantarelli/aggbug/95355.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dario Santarelli</dc:creator>
            <guid>http://blogs.ugidotnet.org/dsantarelli/archive/2009/01/31/wcf-esempio-di-integration-test.aspx</guid>
            <pubDate>Sat, 31 Jan 2009 15:22:29 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/dsantarelli/comments/95355.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/dsantarelli/archive/2009/01/31/wcf-esempio-di-integration-test.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/dsantarelli/comments/commentRss/95355.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/dsantarelli/services/trackbacks/95355.aspx</trackback:ping>
        </item>
    </channel>
</rss>
