<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>WPF</title>
        <link>http://blogs.ugidotnet.org/dsantarelli/category/2852.aspx</link>
        <description>WPF</description>
        <language>it-IT</language>
        <copyright>Dario Santarelli</copyright>
        <generator>Subtext Version 2.1.0.3</generator>
        <item>
            <title>[WPF] Un &amp;ldquo;generic&amp;rdquo; command</title>
            <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>
            <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>
            <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>
            <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>[WPF] ICommand e CanExecute</title>
            <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>
            <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>Da WindowsForms a WPF via MVP</title>
            <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>[WPF] Creare un ColorPicker</title>
            <link>http://blogs.ugidotnet.org/dsantarelli/archive/2008/12/05/wpf-creare-un-colorpicker.aspx</link>
            <description>&lt;p&gt;In generale, una semplice soluzione per realizzare un ColorPicker si basa sull'utilizzo di un' immagine che rappresenta lo spettro dei colori, come la seguente:    &lt;br /&gt;    &lt;br /&gt;&lt;img height="49" alt="" src="http://img222.imageshack.us/img222/7294/spectrumrb4.jpg" width="74" /&gt; &lt;/p&gt;  &lt;p&gt;Dopodiché, per rilevare il colore selezionato al passaggio del Mouse abbiamo ovviamente bisogno di conoscere le coordinate del cursore su tale immagine. &lt;/p&gt;  &lt;p&gt;In WPF questa operazione è veramente molto semplice sfruttando la classe &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.croppedbitmap.aspx" target="_blank"&gt;CroppedBitmap&lt;/a&gt;.     &lt;br /&gt;Se definissimo una &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.bitmapsource.aspx" target="_blank"&gt;BitmapSource&lt;/a&gt; come Source della nostra Image WPF, ecco come potremmo implementare un semplice metodo per individuare il colore RGB corrispondente alle coordinate del cursore (MouseX,MouseY) su tale immagine-spettro:  &lt;br /&gt;    &lt;br /&gt;&lt;span lang="EN-US" style="font-size: 8pt; color: blue; line-height: 115%; font-family: " courier="courier"&gt;using&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; line-height: 115%; font-family: " courier="courier"&gt; System.Windows.Media.Imaging;      &lt;br /&gt;      &lt;br /&gt;...       &lt;br /&gt;      &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; font-family: " courier="courier"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; System.Windows.Media.&lt;span style="color: #2b91af"&gt;Color&lt;/span&gt; GetSelectedColor(&lt;span style="color: #2b91af"&gt;BitmapSource&lt;/span&gt; bitmapSource, &lt;span style="color: blue"&gt;int&lt;/span&gt; MouseX, &lt;span style="color: blue"&gt;int&lt;/span&gt; MouseY)       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; font-family: " courier="courier"&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="courier"&gt;&lt;span style="color: #2b91af"&gt;CroppedBitmap&lt;/span&gt; cb = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;CroppedBitmap&lt;/span&gt;(bitmapSource, &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Int32Rect&lt;/span&gt;(MouseX, MouseY, 1, 1)); &lt;span style="font-size: 8pt; color: green; line-height: 115%; font-family: " courier="courier"&gt;// CroppedBitmap di 1px X 1px&lt;/span&gt;       &lt;br /&gt;  rgbChannels&lt;/span&gt;&lt;span style="font-size: 8pt; font-family: " courier="courier"&gt; = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: blue"&gt;byte&lt;/span&gt;[4];       &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-size: 8pt; font-family: " courier="courier"&gt;cb.CopyPixels(rgbChannels, 4, 0); &lt;/span&gt;&lt;span style="font-size: 8pt; color: green; line-height: 115%; font-family: " courier="courier"&gt;// 4 è la dimensione minima specificabile per individuare il colore RGB      &lt;br /&gt;  &lt;/span&gt;&lt;span style="font-size: 8pt; font-family: " courier="courier"&gt;&lt;span style="color: blue"&gt;return &lt;/span&gt;System.Windows.Media.&lt;span style="color: #2b91af"&gt;Color&lt;/span&gt;.FromRgb(rgbChannels[2], rgbChannels[1], rgbChannels[0]);&lt;span style="mso-spacerun: yes"&gt;  &lt;span style="font-size: 8pt; color: green; line-height: 115%; font-family: " courier="courier"&gt;// R,G,B &lt;/span&gt;                         &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; line-height: 115%; font-family: " courier="courier"&gt;}&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;Un esempio di Colorpicker WPF stupidissimo sviluppato con questa tecnica potebbe essere il seguente:    &lt;br /&gt;    &lt;br /&gt;&lt;img alt="" src="http://img177.imageshack.us/img177/2912/colorpickerpt9.jpg" /&gt;     &lt;br /&gt;    &lt;br /&gt;P.S.: Se la nostra Bitmap provenisse dal mondo GDI+ ( &lt;a href="http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.aspx" target="_blank"&gt;System.Drawing.Bitmap&lt;/a&gt; ), avremmo bisogno di una conversione in BitmapSource (WPF). A riguardo, riporto un metodo che effettua tale conversione tramite il BREVISSIMO metodo &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.interop.imaging.createbitmapsourcefromhbitmap.aspx" target="_blank"&gt;CreateBitmapSourceFromHBitmap&lt;/a&gt; di System.Windows.Interop.Imaging:&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="courier"&gt;private&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: " courier="courier"&gt; &lt;span style="color: #2b91af"&gt;BitmapSource&lt;/span&gt; GetBitmapSource(System.Drawing.&lt;span style="color: #2b91af"&gt;Bitmap&lt;/span&gt; source)       &lt;br /&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: " courier="courier"&gt;{      &lt;br /&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: " courier="courier"&gt;&lt;span style="color: blue"&gt;return&lt;/span&gt; System.Windows.Interop.&lt;span style="color: #2b91af"&gt;Imaging&lt;/span&gt;.CreateBitmapSourceFromHBitmap(source.GetHbitmap(),&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: " courier="courier"&gt;&lt;span style="color: #2b91af"&gt;IntPtr&lt;/span&gt;.Zero,&lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: " courier="courier"&gt;&lt;span style="color: #2b91af"&gt;Int32Rect&lt;/span&gt;.Empty,  &lt;br /&gt;                                                                                                                                 &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 8pt; font-family: " courier="courier"&gt;System.Windows.Media.Imaging.&lt;span style="color: #2b91af"&gt;BitmapSizeOptions&lt;/span&gt;.FromEmptyOptions());       &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 8pt; line-height: 115%; font-family: " courier="courier"&gt;}      &lt;br /&gt;      &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:06851330-1113-4607-8df8-843b4c1d48e1" style="padding-right: 0px; display: inline; padding-left: 0px; 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;/div&gt;&lt;img src="http://blogs.ugidotnet.org/dsantarelli/aggbug/94866.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dario Santarelli</dc:creator>
            <guid>http://blogs.ugidotnet.org/dsantarelli/archive/2008/12/05/wpf-creare-un-colorpicker.aspx</guid>
            <pubDate>Fri, 05 Dec 2008 18:59:32 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/dsantarelli/comments/94866.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/dsantarelli/archive/2008/12/05/wpf-creare-un-colorpicker.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/dsantarelli/comments/commentRss/94866.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/dsantarelli/services/trackbacks/94866.aspx</trackback:ping>
        </item>
        <item>
            <title>[WPF] PropertyGrid su CodePlex</title>
            <link>http://blogs.ugidotnet.org/dsantarelli/archive/2008/12/03/wpf-propertygrid-su-codeplex.aspx</link>
            <description>Stavo cercando un controllo PropertyGrid per WPF ed in men che non si dica ecco che esce fuori su codeplex:&lt;br /&gt;
&lt;br /&gt;
&lt;a target="_blank" href="http://www.codeplex.com/wpfpropertygrid"&gt;&lt;strong&gt;WPF PropertyGrid Control&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;img alt="" src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=wpfpropertygrid&amp;amp;DownloadId=38005" /&gt;&lt;br /&gt;
&lt;br /&gt;
Forte!!! &lt;br /&gt;
&lt;/strong&gt;Come si può notare è molto simile al property editor di Expression Blend, anche se lo scopo del progetto è:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;em&gt;The purpose of this project not to clone existing Microsoft Expression Blend property editor or Visual Studio 2008 property pad for "Cider" WPF designer but rather introducing a scalable and comprehensive control ready to be used in different types of applications&lt;/em&gt; &lt;/blockquote&gt;Credo sarà interessante dare un'occhiata al &lt;a target="_blank" href="http://www.codeplex.com/wpfpropertygrid/SourceControl/ListDownloadableCommits.aspx"&gt;sorgente&lt;/a&gt; :D&lt;br /&gt;
&lt;br /&gt;
P.S.: Se qualcuno di voi già lo conosce/utilizza mi piacerebbe avere qualche feedback giusto per valutarne le potenzialità.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:95082ac0-f77e-4b15-97e3-79583e107d1f" style="PADDING-RIGHT: 0px; DISPLAY: inline; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"&gt;Technorati Tag: &lt;a rel="tag" href="http://technorati.com/tags/WPF"&gt;WPF&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/PropertyGrid"&gt;PropertyGrid&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/dsantarelli/aggbug/94840.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dario Santarelli</dc:creator>
            <guid>http://blogs.ugidotnet.org/dsantarelli/archive/2008/12/03/wpf-propertygrid-su-codeplex.aspx</guid>
            <pubDate>Wed, 03 Dec 2008 08:37:38 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/dsantarelli/comments/94840.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/dsantarelli/archive/2008/12/03/wpf-propertygrid-su-codeplex.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/dsantarelli/comments/commentRss/94840.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/dsantarelli/services/trackbacks/94840.aspx</trackback:ping>
        </item>
        <item>
            <title>[WPF] Considerazioni su M-V-VM</title>
            <link>http://blogs.ugidotnet.org/dsantarelli/archive/2008/11/30/wpf-considerazioni-su-m-v-vm.aspx</link>
            <description>&lt;p&gt;In questi giorni sto studiando a fondo il pattern M-V-VM ((Data)Model-View-ViewModel), visto che quando fu introdotto per la prima volta (ormai 3 anni fa) non lo valutai affatto positivamente poiché ero convinto che avrebbe "sporcato" troppo il pattern MVC, creando confusione sia tra gli sviluppatori che tra gli architects.   &lt;br /&gt;Questo pattern fu coniato nel 2005 da &lt;a href="http://blogs.msdn.com/johngossman" target="_blank"&gt;John Gossman&lt;/a&gt; mentre WPF vedeva la luce (Avalon). In &lt;a href="http://blogs.msdn.com/johngossman/archive/2005/10/08/478683.aspx" target="_blank"&gt;uno dei suoi post&lt;/a&gt; a riguardo, Gossman lo definì nella seguente maniera:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;Model/View/ViewModel is a variation of Model/View/Controller (MVC) that is tailored for modern UI development platforms where the View is the responsibility of a designer rather than a classic developer....&lt;strong&gt;The Model is defined as in MVC...The View consists of the visual elements...&lt;/strong&gt; &lt;strong&gt;The ViewModel can be thought of as abstraction of the view, but it also provides a specialization of the Model that the View can use for data-binding&lt;/strong&gt;.  In this latter role the ViewModel contains data-transformers that convert Model types into View types, and it contains Commands the View can use to interact with the Model.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;   &lt;br /&gt;A seguito di un'analisi più attenta, devo dire che ho modificato la mia posizione iniziale, soprattutto considerando che in linea teorica il pattern M-V-VM può essere utilizzato congiuntamente al pattern MVC ( MVC + VM ). D'altronde, il fatto che si possieda o meno un ViewModel è ortogonale al fatto che si possieda o meno un Controller.     &lt;br /&gt;Il ViewModel infatti può assumere due ruoli:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;un livello di astrazione per la View&lt;/li&gt;    &lt;li&gt;una specializzazione del (Data)Model che la View utilizza per il DataBinding (tramite una trasformazione dei tipi del Model nei tipi della View) e che contiene i Commands che la View può usare per interagire con il Model&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Da una parte, gli aspetti che mi piacciono di questo pattern architetturale sono quelli che lo rendono più vicino ad un "WPF-friendly wrapper" del pattern MVC: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;supporto totale al two-way databinding offerto da WPF (dati da-verso la View) &lt;/li&gt;    &lt;li&gt;maggiore semplificazione/flessibilità dello sviluppo di un' applicazione WPF di qualità (&lt;a title="SoC" href="http://en.wikipedia.org/wiki/Separation_of_concerns"&gt;SoC&lt;/a&gt;) rispetto a soluzioni &lt;a href="http://en.wikipedia.org/wiki/Model-view-presenter" target="_blank"&gt;MVP&lt;/a&gt; (già affermate in particolar modo su Windows Forms e ASP.NET) o &lt;a href="http://it.wikipedia.org/wiki/Model-View-Controller" target="_blank"&gt;MVC&lt;/a&gt; (ragazzi ASP.NET MVC è perennemente in Beta :D !!!). &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;...Dall'altra mi ritrovo a riflettere su alcuni punti critici di tale pattern che potrebbero minacciare seriamente lo sviluppo di applicazioni enterprise:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;In scenari complessi potrebbe essere estremamente difficile progettare un ViewModel che risponda al giusto livello di generalità (ricordiamoci che il ViewModel ingloba Proprietà, Astrazioni del DataModel (&lt;a href="http://msdn.microsoft.com/en-us/library/ms668604.aspx" target="_blank"&gt;ObservableCollection&lt;/a&gt;), una sfilza di &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.input.icommand.aspx" target="_blank"&gt;ICommand&lt;/a&gt;, Change Notification via &lt;a href="http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx" target="_blank"&gt;INotifyPropertyChanged&lt;/a&gt; etc..)&lt;/li&gt;    &lt;li&gt;Il miracoloso meccanismo dichiarativo di DataBinding non è facile da debuggare quanto il classico approccio imperativo. E' anche vero che una semplice scappatoia per difficoltà di questo tipo rimane pur sempre l'intercettazione degli eventi che ci servono sia lato View che lato ViewModel.&lt;/li&gt;    &lt;li&gt;Poiché un DataBinding dietro le quinte alloca delle risorse di "book-keeping" (contabilità :D), se si implementano pesanti scenari di MultiBinding (in cui uno stesso oggetto è associato a più componenti dell'UI) si possono ottenere situazioni in cui i Binding sono addirittura più pesanti degli oggetti bindati!!! E' sicuramente difficile che si presenti un caso di questo tipo in un' applicazione reale, ciò non toglie che un occhio alle performance dovremmo sempre darglielo.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;In &lt;a href="http://karlshifflett.wordpress.com/2008/11/08/learning-wpf-m-v-vm/" target="_blank"&gt;questo post&lt;/a&gt; di &lt;a href="http://karlshifflett.wordpress.com"&gt;Karl Shifflett&lt;/a&gt; ho trovato interessante questa immagine che evidenzia tutte le caratteristiche di un' architettura M-V-VM in un contesto LOB. I concetti ci sono praticamente tutti... ora sta a noi portarli in vita :D&lt;/p&gt;  &lt;p&gt;&lt;img src="http://img171.imageshack.us/img171/1476/21260326pe6.png" /&gt; &lt;/p&gt;  &lt;br /&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:95082ac0-f77e-4b15-97e3-79583e107d1f" style="padding-right: 0px; display: inline; padding-left: 0px; 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/M-V-VM" rel="tag"&gt;M-V-VM&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/dsantarelli/aggbug/94806.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dario Santarelli</dc:creator>
            <guid>http://blogs.ugidotnet.org/dsantarelli/archive/2008/11/30/wpf-considerazioni-su-m-v-vm.aspx</guid>
            <pubDate>Sun, 30 Nov 2008 15:22:13 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/dsantarelli/comments/94806.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/dsantarelli/archive/2008/11/30/wpf-considerazioni-su-m-v-vm.aspx#feedback</comments>
            <slash:comments>5</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/dsantarelli/comments/commentRss/94806.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/dsantarelli/services/trackbacks/94806.aspx</trackback:ping>
        </item>
    </channel>
</rss>