<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.microsoft.co.il/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Maxim</title><link>http://blogs.microsoft.co.il/blogs/maxim/</link><description>&lt;br /&gt;Design Sales!
&lt;br /&gt;&lt;p dir="rtl"&gt;עיצוב מוכר!&lt;/p&gt;</description><dc:language>en</dc:language><generator>CommunityServer 2007.1 (Build: 20917.1142)</generator><item><title>Single Instance Application Manager</title><link>http://blogs.microsoft.co.il/blogs/maxim/archive/2010/02/13/single-instance-application-manager.aspx</link><pubDate>Sat, 13 Feb 2010 20:00:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:517934</guid><dc:creator>Maxim</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/maxim/rsscomments.aspx?PostID=517934</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/maxim/commentapi.aspx?PostID=517934</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/maxim/archive/2010/02/13/single-instance-application-manager.aspx#comments</comments><description>&lt;p&gt;Some .Net applications are required to run as single instance process (at startup, each process “ensures” that he’s unique). This requirement may come from licensing issues, technical and/or other reasons. Quick search in Google will provide a &lt;a title="Google Search Results" href="http://www.google.com/search?hl=en&amp;amp;source=hp&amp;amp;q=single+instance+application+.net&amp;amp;aq=f&amp;amp;aqi=g1&amp;amp;oq=" target="_blank"&gt;variety of solutions&lt;/a&gt;, most of them are based on &lt;a title="My.Application from VB.Net" href="http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.applicationservices.windowsformsapplicationbase.aspx" target="_blank"&gt;WindowsFormsApplicationBase object&lt;/a&gt; from VB.Net, usage of &lt;a title="Mutex from .Net Threading" href="http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx" target="_blank"&gt;Mutex object&lt;/a&gt; and other techniques. I don’t like mixing VB with C#, and also Win-Forms solution isn’t “pure” enough for WPF applications. So I wrote my version of “Single Instance Manager”…&lt;/p&gt;  &lt;p&gt;This post will provide short description about this small project and links to download the sources.&lt;/p&gt;  &lt;h3&gt;How to Create Single Instance Application for WPF, Win-Forms and Console Applications&lt;/h3&gt;  &lt;p&gt;The manager uses well-known &lt;a title="Thread Pool in .Net" href="http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx" target="_blank"&gt;ThreadPool&lt;/a&gt; object with &lt;a title="Event Wait Handle Class" href="http://msdn.microsoft.com/en-us/library/system.threading.eventwaithandle.aspx" target="_blank"&gt;WaitEventHandle&lt;/a&gt; object and &lt;a title="Transport messages between application domains on the same computer..." href="http://msdn.microsoft.com/en-us/library/system.runtime.remoting.channels.ipc.ipcclientchannel.aspx" target="_blank"&gt;IpcClientChannel&lt;/a&gt; to pass messages (objects) between processes (&lt;a title="Info" href="http://msdn.microsoft.com/en-us/library/kwdt6w2k(VS.71).aspx" target="_blank"&gt;.Net Remoting&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/maxim/image_7A081D36.png" target="_blank"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Diagram: Pass object cross processes" border="0" alt="Diagram: Pass object cross processes" src="http://blogs.microsoft.co.il/blogs/maxim/image_thumb_2F512F9C.png" width="640" height="170" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;font color="#c0c0c0"&gt;[In Diagram: Instance A passes Console Arguments to Process B, before it closes it self] &lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Each application will use “ApplicationInstanceManager.CreateSingleInstance(…)” to register it self as single instance application.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/maxim/image_2B17320A.png" target="_blank"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/maxim/image_thumb_29C2735E.png" width="594" height="480" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;font color="#c0c0c0"&gt;[In Diagram: Description of “CreateSingleInstance(…)” Function] &lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;The manager ensures that application has only one instance and also passes console arguments from new instances to running process, before “killing” them.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="width:734px;height:380px;overflow:scroll;"&gt;   &lt;div class="csharpcode"&gt;     &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Diagnostics;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Runtime.Remoting;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Runtime.Remoting.Channels;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Runtime.Remoting.Channels.Ipc;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Threading;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; SingleInstanceApplication&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;{&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;    &lt;span class="rem"&gt;/// Application Instance Manager&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; ApplicationInstanceManager&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;    {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;        &lt;span class="rem"&gt;/// Creates the single instance.&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;name&amp;quot;&amp;gt;The name.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;callback&amp;quot;&amp;gt;The callback.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; CreateSingleInstance(&lt;span class="kwrd"&gt;string&lt;/span&gt; name, EventHandler&amp;lt;InstanceCallbackEventArgs&amp;gt; callback)&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;        {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;            EventWaitHandle eventWaitHandle = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;            &lt;span class="kwrd"&gt;string&lt;/span&gt; eventName = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;&amp;quot;{0}-{1}&amp;quot;&lt;/span&gt;, Environment.MachineName, name);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;            InstanceProxy.IsFirstInstance = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;            InstanceProxy.CommandLineArgs = Environment.GetCommandLineArgs();&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;            &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;            {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;                &lt;span class="rem"&gt;// try opening existing wait handle&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;                eventWaitHandle = EventWaitHandle.OpenExisting(eventName);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;            }&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;            &lt;span class="kwrd"&gt;catch&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt;            {&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  36:  &lt;/span&gt;                &lt;span class="rem"&gt;// got exception = handle wasn&amp;#39;t created yet&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  37:  &lt;/span&gt;                InstanceProxy.IsFirstInstance = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  38:  &lt;/span&gt;            }&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  39:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  40:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (InstanceProxy.IsFirstInstance)&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  41:  &lt;/span&gt;            {&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  42:  &lt;/span&gt;                &lt;span class="rem"&gt;// init handle&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  43:  &lt;/span&gt;                eventWaitHandle = &lt;span class="kwrd"&gt;new&lt;/span&gt; EventWaitHandle(&lt;span class="kwrd"&gt;false&lt;/span&gt;, EventResetMode.AutoReset, eventName);&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  44:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  45:  &lt;/span&gt;                &lt;span class="rem"&gt;// register wait handle for this instance (process)&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  46:  &lt;/span&gt;                ThreadPool.RegisterWaitForSingleObject(eventWaitHandle, WaitOrTimerCallback, callback, Timeout.Infinite, &lt;span class="kwrd"&gt;false&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  47:  &lt;/span&gt;                eventWaitHandle.Close();&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  48:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  49:  &lt;/span&gt;                &lt;span class="rem"&gt;// register shared type (used to pass data between processes)&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  50:  &lt;/span&gt;                RegisterRemoteType(name);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  51:  &lt;/span&gt;            }&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  52:  &lt;/span&gt;            &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  53:  &lt;/span&gt;            {&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  54:  &lt;/span&gt;                &lt;span class="rem"&gt;// pass console arguments to shared object&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  55:  &lt;/span&gt;                UpdateRemoteObject(name);&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  56:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  57:  &lt;/span&gt;                &lt;span class="rem"&gt;// invoke (signal) wait handle on other process&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  58:  &lt;/span&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; (eventWaitHandle != &lt;span class="kwrd"&gt;null&lt;/span&gt;) eventWaitHandle.Set();&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  59:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  60:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  61:  &lt;/span&gt;                &lt;span class="rem"&gt;// kill current process&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  62:  &lt;/span&gt;                Environment.Exit(0);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  63:  &lt;/span&gt;            }&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  64:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  65:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; InstanceProxy.IsFirstInstance;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  66:  &lt;/span&gt;        }&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  67:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  68:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  69:  &lt;/span&gt;        &lt;span class="rem"&gt;/// Updates the remote object.&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  70:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  71:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;uri&amp;quot;&amp;gt;The remote URI.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  72:  &lt;/span&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; UpdateRemoteObject(&lt;span class="kwrd"&gt;string&lt;/span&gt; uri)&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  73:  &lt;/span&gt;        {&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  74:  &lt;/span&gt;            &lt;span class="rem"&gt;// register net-pipe channel&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  75:  &lt;/span&gt;            var clientChannel = &lt;span class="kwrd"&gt;new&lt;/span&gt; IpcClientChannel();&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  76:  &lt;/span&gt;            ChannelServices.RegisterChannel(clientChannel, &lt;span class="kwrd"&gt;true&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  77:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  78:  &lt;/span&gt;            &lt;span class="rem"&gt;// get shared object from other process&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  79:  &lt;/span&gt;            var proxy =&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  80:  &lt;/span&gt;                Activator.GetObject(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(InstanceProxy), &lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  81:  &lt;/span&gt;                &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;&amp;quot;ipc://{0}{1}/{1}&amp;quot;&lt;/span&gt;, Environment.MachineName, uri)) &lt;span class="kwrd"&gt;as&lt;/span&gt; InstanceProxy;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  82:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  83:  &lt;/span&gt;            &lt;span class="rem"&gt;// pass current command line args to proxy&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  84:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (proxy != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  85:  &lt;/span&gt;                proxy.SetCommandLineArgs(InstanceProxy.IsFirstInstance, InstanceProxy.CommandLineArgs);&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  86:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  87:  &lt;/span&gt;            &lt;span class="rem"&gt;// close current client channel&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  88:  &lt;/span&gt;            ChannelServices.UnregisterChannel(clientChannel);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  89:  &lt;/span&gt;        }&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  90:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  91:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  92:  &lt;/span&gt;        &lt;span class="rem"&gt;/// Registers the remote type.&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  93:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  94:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;uri&amp;quot;&amp;gt;The URI.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  95:  &lt;/span&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; RegisterRemoteType(&lt;span class="kwrd"&gt;string&lt;/span&gt; uri)&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  96:  &lt;/span&gt;        {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  97:  &lt;/span&gt;            &lt;span class="rem"&gt;// register remote channel (net-pipes)&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  98:  &lt;/span&gt;            var serverChannel = &lt;span class="kwrd"&gt;new&lt;/span&gt; IpcServerChannel(Environment.MachineName + uri);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  99:  &lt;/span&gt;            ChannelServices.RegisterChannel(serverChannel, &lt;span class="kwrd"&gt;true&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt; 100:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 101:  &lt;/span&gt;            &lt;span class="rem"&gt;// register shared type&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt; 102:  &lt;/span&gt;            RemotingConfiguration.RegisterWellKnownServiceType(&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 103:  &lt;/span&gt;                &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(InstanceProxy), uri, WellKnownObjectMode.Singleton);&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt; 104:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 105:  &lt;/span&gt;            &lt;span class="rem"&gt;// close channel, on process exit&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt; 106:  &lt;/span&gt;            Process process = Process.GetCurrentProcess();&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 107:  &lt;/span&gt;            process.Exited += &lt;span class="kwrd"&gt;delegate&lt;/span&gt; { ChannelServices.UnregisterChannel(serverChannel); };&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt; 108:  &lt;/span&gt;        }&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 109:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt; 110:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 111:  &lt;/span&gt;        &lt;span class="rem"&gt;/// Wait Or Timer Callback Handler&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt; 112:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 113:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;state&amp;quot;&amp;gt;The state.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt; 114:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;timedOut&amp;quot;&amp;gt;if set to &amp;lt;c&amp;gt;true&amp;lt;/c&amp;gt; [timed out].&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 115:  &lt;/span&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; WaitOrTimerCallback(&lt;span class="kwrd"&gt;object&lt;/span&gt; state, &lt;span class="kwrd"&gt;bool&lt;/span&gt; timedOut)&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt; 116:  &lt;/span&gt;        {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 117:  &lt;/span&gt;            &lt;span class="rem"&gt;// cast to event handler&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt; 118:  &lt;/span&gt;            var callback = state &lt;span class="kwrd"&gt;as&lt;/span&gt; EventHandler&amp;lt;InstanceCallbackEventArgs&amp;gt;;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 119:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (callback == &lt;span class="kwrd"&gt;null&lt;/span&gt;) &lt;span class="kwrd"&gt;return&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt; 120:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 121:  &lt;/span&gt;            &lt;span class="rem"&gt;// invoke event handler on other process&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt; 122:  &lt;/span&gt;            callback(state,&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 123:  &lt;/span&gt;                     &lt;span class="kwrd"&gt;new&lt;/span&gt; InstanceCallbackEventArgs(InstanceProxy.IsFirstInstance,&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt; 124:  &lt;/span&gt;                                                   InstanceProxy.CommandLineArgs));&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 125:  &lt;/span&gt;        }&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt; 126:  &lt;/span&gt;    }&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 127:  &lt;/span&gt;}&lt;/pre&gt;
  &lt;/div&gt;
  











.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, &amp;quot;Courier New&amp;quot;, courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/div&gt;

&lt;p&gt;For testing purposes I added form with grid that allows starting processes with console arguments:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/maxim/image_25E482F4.png" target="_blank"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="single instance manager" border="0" alt="single instance manager" src="http://blogs.microsoft.co.il/blogs/maxim/image_thumb_5392001F.png" width="704" height="664" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;How can we use this manager (for example in WPF app):&lt;/p&gt;

&lt;div style="width:702px;height:297px;overflow:scroll;"&gt;
  &lt;div class="csharpcode"&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Reflection;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Windows;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; SingleInstanceApplication.WpfApp&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;{&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    &lt;span class="rem"&gt;/// Interaction logic for App.xaml&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; App&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;    {&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;        &lt;span class="rem"&gt;/// Raises the &amp;lt;see cref=&amp;quot;E:System.Windows.Application.Startup&amp;quot;/&amp;gt; event.&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;e&amp;quot;&amp;gt;A &amp;lt;see cref=&amp;quot;T:System.Windows.StartupEventArgs&amp;quot;/&amp;gt; that contains the event data.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnStartup(StartupEventArgs e)&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;        {&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;            &lt;span class="rem"&gt;// register single instance app. and check for existence of other process&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (!ApplicationInstanceManager.CreateSingleInstance(&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;                    Assembly.GetExecutingAssembly().GetName().Name,&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;                    SingleInstanceCallback)) &lt;span class="kwrd"&gt;return&lt;/span&gt;; &lt;span class="rem"&gt;// exit, if same app. is running&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;            &lt;span class="kwrd"&gt;base&lt;/span&gt;.OnStartup(e);&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;        }&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;        &lt;span class="rem"&gt;/// Raises the &amp;lt;see cref=&amp;quot;E:System.Windows.Application.Activated&amp;quot;/&amp;gt; event.&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;e&amp;quot;&amp;gt;An &amp;lt;see cref=&amp;quot;T:System.EventArgs&amp;quot;/&amp;gt; that contains the event data.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnActivated(EventArgs e)&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;        {&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;            &lt;span class="kwrd"&gt;base&lt;/span&gt;.OnActivated(e);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;            var win = MainWindow &lt;span class="kwrd"&gt;as&lt;/span&gt; MainWindow;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (win == &lt;span class="kwrd"&gt;null&lt;/span&gt;) &lt;span class="kwrd"&gt;return&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  36:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  37:  &lt;/span&gt;            &lt;span class="rem"&gt;// add 1st args&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  38:  &lt;/span&gt;            win.ApendArgs(Environment.GetCommandLineArgs());&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  39:  &lt;/span&gt;        }&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  40:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  41:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  42:  &lt;/span&gt;        &lt;span class="rem"&gt;/// Single instance callback handler.&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  43:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  44:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;sender&amp;quot;&amp;gt;The sender.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  45:  &lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;args&amp;quot;&amp;gt;The &amp;lt;see cref=&amp;quot;SingleInstanceApplication.InstanceCallbackEventArgs&amp;quot;/&amp;gt; instance containing the event data.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  46:  &lt;/span&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; SingleInstanceCallback(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, InstanceCallbackEventArgs args)&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  47:  &lt;/span&gt;        {&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  48:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (args == &lt;span class="kwrd"&gt;null&lt;/span&gt; || Dispatcher == &lt;span class="kwrd"&gt;null&lt;/span&gt;) &lt;span class="kwrd"&gt;return&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  49:  &lt;/span&gt;            Action&amp;lt;&lt;span class="kwrd"&gt;bool&lt;/span&gt;&amp;gt; d = (&lt;span class="kwrd"&gt;bool&lt;/span&gt; x) =&amp;gt; &lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  50:  &lt;/span&gt;            {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  51:  &lt;/span&gt;                var win = MainWindow &lt;span class="kwrd"&gt;as&lt;/span&gt; MainWindow;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  52:  &lt;/span&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; (win == &lt;span class="kwrd"&gt;null&lt;/span&gt;) &lt;span class="kwrd"&gt;return&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  53:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  54:  &lt;/span&gt;                win.ApendArgs(args.CommandLineArgs);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  55:  &lt;/span&gt;                win.Activate(x);&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  56:  &lt;/span&gt;            };&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  57:  &lt;/span&gt;            Dispatcher.Invoke(d, &lt;span class="kwrd"&gt;true&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  58:  &lt;/span&gt;        }&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  59:  &lt;/span&gt;    }&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  60:  &lt;/span&gt;}&lt;/pre&gt;
  &lt;/div&gt;
  








.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, &amp;quot;Courier New&amp;quot;, courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/div&gt;

&lt;p&gt;&lt;em&gt;&lt;font color="#c0c0c0"&gt;[As you can see “App” has “SingleInstanceCallback” that is fired by manager, also you can see function overload for “Window.Actvate” (see &lt;/font&gt;&lt;/em&gt;&lt;a title="How to activate minimized window" href="http://blogs.microsoft.co.il/blogs/maxim/archive/2009/12/24/daily-tip-how-to-activate-minimized-window-form.aspx" target="_blank"&gt;&lt;em&gt;&lt;strong&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;this post&lt;/font&gt;&lt;/u&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt;&lt;em&gt;&lt;font color="#c0c0c0"&gt;&lt;u&gt; &lt;/u&gt;about this extention)]&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;

&lt;table cellspacing="0" cellpadding="0"&gt;
    &lt;tr&gt;
      &lt;td align="center"&gt;&lt;font size="2"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="VS2010" border="0" alt="VS2010" src="http://blogs.microsoft.co.il/blogs/maxim/image_1B7FE66F.png" width="34" height="17" /&gt;&lt;/font&gt;&lt;/td&gt;

      &lt;td&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;Sources for this project can be downloaded from &lt;/font&gt;&lt;a title="Right Click (Save As...)" href="http://blogs.microsoft.co.il/files/folders/517916/download.aspx" target="_blank"&gt;&lt;font size="2"&gt;here (blog)&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt; or here (codeplex).&lt;/font&gt;&lt;/font&gt;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td align="center"&gt;&lt;font size="2"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="DLL + PDB" border="0" alt="DLL + PDB" src="http://blogs.microsoft.co.il/blogs/maxim/image_013F7D4B.png" width="30" height="28" /&gt; &lt;/font&gt;&lt;/td&gt;

      &lt;td&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;Assembly with Library can be downloaded from &lt;/font&gt;&lt;a title="Right Click (Save As...)" href="http://blogs.microsoft.co.il/files/folders/517920/download.aspx" target="_blank"&gt;&lt;font size="2"&gt;here (blog)&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt; or here (codeplex).&lt;/font&gt;&lt;/font&gt;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td align="center"&gt;&lt;font size="2"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/maxim/image_4E0343E1.png" width="103" height="39" /&gt; &lt;/font&gt;&lt;/td&gt;

      &lt;td&gt;&lt;font color="#000000" size="2"&gt;Project’s site at Codeplex: …&lt;/font&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/table&gt;

&lt;p&gt;&amp;#160;&lt;em&gt;&lt;font color="#808080"&gt;Remarks: Any comments/improvements will be accepted with pleasure. Of course, you must understand that this code is a contribution and I’m not responsible for any damage that may be caused by using it. All rights reserved ®.&lt;/font&gt;&lt;/em&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:4444deed-5eea-4b59-b497-8619d5eea478" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Daily+Tip" rel="tag"&gt;Daily Tip&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Code+Example" rel="tag"&gt;Code Example&lt;/a&gt;,&lt;a href="http://technorati.com/tags/C%23" rel="tag"&gt;C#&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Single+Instance+Application" rel="tag"&gt;Single Instance Application&lt;/a&gt;,&lt;a href="http://technorati.com/tags/.Net+Framework" rel="tag"&gt;.Net Framework&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Winforms" rel="tag"&gt;Winforms&lt;/a&gt;,&lt;a href="http://technorati.com/tags/WPF" rel="tag"&gt;WPF&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Console+Application" rel="tag"&gt;Console Application&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Codeplex" rel="tag"&gt;Codeplex&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=517934" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/.Net/default.aspx">.Net</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Example/default.aspx">Example</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Reusable+Components/default.aspx">Reusable Components</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Code+Example/default.aspx">Code Example</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Daily+Tip/default.aspx">Daily Tip</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Winforms+2.0/default.aspx">Winforms 2.0</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Codeplex/default.aspx">Codeplex</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/MS+Visual+Studio+2010/default.aspx">MS Visual Studio 2010</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Single+Instace+Manager/default.aspx">Single Instace Manager</category></item><item><title>Daily Tip: How to Activate Minimized Window (Form)</title><link>http://blogs.microsoft.co.il/blogs/maxim/archive/2009/12/24/daily-tip-how-to-activate-minimized-window-form.aspx</link><pubDate>Thu, 24 Dec 2009 18:00:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:475691</guid><dc:creator>Maxim</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/maxim/rsscomments.aspx?PostID=475691</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/maxim/commentapi.aspx?PostID=475691</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/maxim/archive/2009/12/24/daily-tip-how-to-activate-minimized-window-form.aspx#comments</comments><description>&lt;h3&gt;This solution can be used in WPF and in WinForms (with some improvements).&lt;/h3&gt;  &lt;p&gt;Many times UI programmer needs to activate window, the activation can be done by using “Activate()” function in window. The problem is that this function will not show window if it is minimized. In that case you can use this workaround:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p style="text-align:left;line-height:normal;unicode-bidi:embed;direction:ltr;margin-bottom:0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:9.5pt;"&gt;using&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:9.5pt;"&gt;System&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;;        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:9.5pt;"&gt;using&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:9.5pt;"&gt;System.Windows&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p style="text-align:left;line-height:normal;unicode-bidi:embed;direction:ltr;margin-bottom:0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:9.5pt;"&gt;namespace&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:9.5pt;"&gt;Test        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;{        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:9.5pt;"&gt;public&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:9.5pt;"&gt;partial&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:9.5pt;"&gt;class&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#2b91af;font-size:9.5pt;"&gt;MyWindow        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:gray;font-size:9.5pt;"&gt;///&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:green;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:gray;font-size:9.5pt;"&gt;&amp;lt;summary&amp;gt;        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:gray;font-size:9.5pt;"&gt;///&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:green;font-size:9.5pt;"&gt; Gets Previouse Window State        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:gray;font-size:9.5pt;"&gt;///&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:green;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:gray;font-size:9.5pt;"&gt;&amp;lt;/summary&amp;gt;        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:9.5pt;"&gt;public&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:9.5pt;"&gt;WindowState&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:9.5pt;"&gt;PreviouseWindowState&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt; { &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:9.5pt;"&gt;get&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:9.5pt;"&gt;private&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:9.5pt;"&gt;set&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;; } &lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p style="text-align:left;line-height:normal;unicode-bidi:embed;direction:ltr;margin-bottom:0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:gray;font-size:9.5pt;"&gt;///&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:green;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:gray;font-size:9.5pt;"&gt;&amp;lt;summary&amp;gt;        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:gray;font-size:9.5pt;"&gt;///&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:green;font-size:9.5pt;"&gt; Constructor        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:gray;font-size:9.5pt;"&gt;///&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:green;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:gray;font-size:9.5pt;"&gt;&amp;lt;/summary&amp;gt;        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:9.5pt;"&gt;public&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:9.5pt;"&gt;MyWindow&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;()        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:9.5pt;"&gt;InitializeComponent&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;();        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;/span&gt;      &lt;p&gt;&amp;#160;&lt;/p&gt;   &lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p style="text-align:left;line-height:normal;unicode-bidi:embed;direction:ltr;margin-bottom:0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:green;font-size:9.5pt;"&gt;// store 1st value        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:9.5pt;"&gt;PreviouseWindowState&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:9.5pt;"&gt;=&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:9.5pt;"&gt;WindowState&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;;        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;/span&gt;      &lt;p&gt;&amp;#160;&lt;/p&gt;   &lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p style="text-align:left;line-height:normal;unicode-bidi:embed;direction:ltr;margin-bottom:0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:green;font-size:9.5pt;"&gt;// attach to event (used to store prev. win. state)        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:9.5pt;"&gt;LayoutUpdated&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:9.5pt;"&gt;+=&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:9.5pt;"&gt;Window_LayoutUpdated&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;;        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;} &lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p style="text-align:left;line-height:normal;unicode-bidi:embed;direction:ltr;margin-bottom:0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:gray;font-size:9.5pt;"&gt;///&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:green;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:gray;font-size:9.5pt;"&gt;&amp;lt;summary&amp;gt;        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:gray;font-size:9.5pt;"&gt;///&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:green;font-size:9.5pt;"&gt; Occures on layout change        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:gray;font-size:9.5pt;"&gt;///&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:green;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:gray;font-size:9.5pt;"&gt;&amp;lt;/summary&amp;gt;        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:gray;font-size:9.5pt;"&gt;///&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:green;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:gray;font-size:9.5pt;"&gt;&amp;lt;param name=&amp;quot;sender&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:gray;font-size:9.5pt;"&gt;///&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:green;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:gray;font-size:9.5pt;"&gt;&amp;lt;param name=&amp;quot;e&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:9.5pt;"&gt;private&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:9.5pt;"&gt;void&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:9.5pt;"&gt;Window_LayoutUpdated&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;(&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:9.5pt;"&gt;object&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:9.5pt;"&gt;sender&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;, &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#2b91af;font-size:9.5pt;"&gt;EventArgs&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:9.5pt;"&gt;e&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;)        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:9.5pt;"&gt;PreviouseWindowState&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:9.5pt;"&gt;=&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:9.5pt;"&gt;WindowState&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;;        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;} &lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p style="text-align:left;line-height:normal;unicode-bidi:embed;direction:ltr;margin-bottom:0pt;mso-layout-grid-align:none;" class="MsoNormal"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:gray;font-size:9.5pt;"&gt;///&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:green;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:gray;font-size:9.5pt;"&gt;&amp;lt;summary&amp;gt;        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:gray;font-size:9.5pt;"&gt;///&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:green;font-size:9.5pt;"&gt; Activates Window        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:gray;font-size:9.5pt;"&gt;///&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:green;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:gray;font-size:9.5pt;"&gt;&amp;lt;/summary&amp;gt;        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:gray;font-size:9.5pt;"&gt;///&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:green;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:gray;font-size:9.5pt;"&gt;&amp;lt;param name=&amp;quot;restoreIfMinimized&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:green;font-size:9.5pt;"&gt;if [true] restore prev. win. state&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:gray;font-size:9.5pt;"&gt;&amp;lt;/param&amp;gt;        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:gray;font-size:9.5pt;"&gt;///&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:green;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:gray;font-size:9.5pt;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:9.5pt;"&gt;public&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:9.5pt;"&gt;bool&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:9.5pt;"&gt;Activate&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;(&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:9.5pt;"&gt;bool&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:9.5pt;"&gt;restoreIfMinimized&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;)        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:9.5pt;"&gt;if&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt; (&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:9.5pt;"&gt;restoreIfMinimized&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:9.5pt;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:9.5pt;"&gt;WindowState&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:9.5pt;"&gt;==&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:9.5pt;"&gt;WindowState.Minimized&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;)        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;span style="mso-tab-count:4;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:9.5pt;"&gt;WindowState&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:9.5pt;"&gt;=&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:9.5pt;"&gt;PreviouseWindowState&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:9.5pt;"&gt;==&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:9.5pt;"&gt;WindowState.Normal        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;span style="mso-tab-count:10;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:9.5pt;"&gt;?&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:9.5pt;"&gt;WindowState.Normal&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt; : &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:9.5pt;"&gt;WindowState.Maximized&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;;        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:blue;font-size:9.5pt;"&gt;return&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt; &lt;/span&gt;&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:9.5pt;"&gt;Activate&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;();        &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}         &lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;"&gt;}&lt;/span&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;mso-ascii-font-family:calibri;mso-ascii-theme-font:minor-latin;mso-hansi-font-family:calibri;mso-hansi-theme-font:minor-latin;mso-bidi-font-family:arial;mso-bidi-theme-font:minor-bidi;"&gt;&amp;#160; &lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;As you can see I added new overloaded function “Activate(bool)” that allows activation of minimized window, thanks to new property “PreviouseWindowState” that stores previous value of “WindowState” when “Window_LayoutUpdated” in called.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Source Code: &lt;/strong&gt;&lt;a href="http://blogs.microsoft.co.il/files/folders/475689/download.aspx" target="_blank"&gt;&lt;strong&gt;Window.cs&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#408080"&gt;&lt;em&gt;Remarks: Any comments/improvements will be accepted with pleasure. Of course, you must understand that this code is a contribution and I’m not responsible for any damage that may be caused by using it. All rights reserved ®.&lt;/em&gt;&lt;/font&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:16fbffbc-59ce-488e-a2ec-619545fff5a5" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/DEV" rel="tag"&gt;DEV&lt;/a&gt;,&lt;a href="http://technorati.com/tags/C%23" rel="tag"&gt;C#&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Daily+Tip" rel="tag"&gt;Daily Tip&lt;/a&gt;,&lt;a href="http://technorati.com/tags/WPF" rel="tag"&gt;WPF&lt;/a&gt;,&lt;a href="http://technorati.com/tags/WinForms" rel="tag"&gt;WinForms&lt;/a&gt;,&lt;a href="http://technorati.com/tags/UI" rel="tag"&gt;UI&lt;/a&gt;,&lt;a href="http://technorati.com/tags/GUI" rel="tag"&gt;GUI&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Code+Example" rel="tag"&gt;Code Example&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=475691" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Win-Forms/default.aspx">Win-Forms</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/GUI/default.aspx">GUI</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/.Net/default.aspx">.Net</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/UI/default.aspx">UI</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Code+Example/default.aspx">Code Example</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Daily+Tip/default.aspx">Daily Tip</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Display+Technologies/default.aspx">Display Technologies</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/DEV/default.aspx">DEV</category></item><item><title>פוסט 17: מסמך סטנדרטים לעיצוב ופיתוח של ממשק משתמש</title><link>http://blogs.microsoft.co.il/blogs/maxim/archive/2009/11/28/ui-17-gui-standards-document.aspx</link><pubDate>Sat, 28 Nov 2009 21:30:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:454479</guid><dc:creator>Maxim</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/maxim/rsscomments.aspx?PostID=454479</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/maxim/commentapi.aspx?PostID=454479</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/maxim/archive/2009/11/28/ui-17-gui-standards-document.aspx#comments</comments><description>&lt;div dir="rtl" align="justify"&gt;
&lt;p dir="rtl" align="justify"&gt;&lt;span style="FONT-FAMILY:tahoma;FONT-SIZE:10pt;"&gt;&lt;em&gt;&lt;span style="COLOR:#333333;"&gt;זהו פוסט המשך &lt;/span&gt;&lt;span style="COLOR:#0066aa;"&gt;&lt;a title="Post 16" href="http://blogs.microsoft.co.il/blogs/maxim/archive/2008/05/28/ui-16-ms-expression-studio.aspx"&gt;לפוסט הקודם&lt;/a&gt;&lt;/span&gt;&lt;span style="COLOR:#333333;"&gt;, אשר שייך &lt;/span&gt;&lt;span style="COLOR:#0066aa;"&gt;&lt;a title="UI Series" href="http://blogs.microsoft.co.il/blogs/maxim/archive/2007/12/08/ui.aspx"&gt;לסדרת הפוסטים בנושא UI&lt;/a&gt;&lt;/span&gt;&lt;/em&gt;&lt;span style="COLOR:#333333;"&gt;&lt;em&gt; .&lt;/em&gt;&amp;nbsp;&lt;em&gt;בפוסט זה אפרט שלבים וטיפים שיעזרו בבניה של מסמך סטנדרטים של ממשק משתמש. &lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr /&gt;

&lt;h1 align="justify"&gt;GUI Standards Document &lt;/h1&gt;
&lt;p dir="rtl" align="justify"&gt;בפרויקטים גדולים של מערכות תוכנה עם ממשקי משתמש רבים קיים צורך בכתיבת מסמך סטנדרטים בתחילת הפרויקט. מסמך זה משמש את כל הגורמים המעורבים בעיצוב-פיתוח GUI: מנתחי מערכות (&lt;a title="wiki" href="http://en.wikipedia.org/wiki/Systems_analyst"&gt;System Analysts&lt;/a&gt;), מעצבי מודולים (&lt;a title="wiki" href="http://en.wikipedia.org/wiki/Software_design"&gt;SW Designers&lt;/a&gt;) ומתכנתים (האנשים שבפועל בונים GUI ומקודדים לוגיקת קליינט). &lt;/p&gt;
&lt;p dir="rtl" align="justify"&gt;מסמך סטנדרטים הנו מרכיב הכרחי בכל שלבי הפרויקט. לרוב עיצוב ראשוני (ובחלק מהמקרים סופי) של מסכי המערכת נעשה ע&amp;quot;י מנתחים. מכוון שהם נמצאים בחזית, ז&amp;quot;א מול לקוח. חלק מתהליך הניתוח והאפיון של הפרויקט הנו עיצוב UI שנעשה בשיתוף עם לקוח (ישנם מקרים חריגים שלקוח לא מעורב בתהליך הנ&amp;quot;ל). בפרויקטים גדולים מעורב מספר גדול של עובדים הקשורים לעיצוב ופיתוח UI. על מנת לקבוע סדר עבודה ותקנות ברורות שיעזרו לתהליך גם מבחינת צמצום זמני האפיון-פיתוח וגם מבחינת השמישות ה- GUI. &lt;/p&gt;
&lt;p dir="rtl" align="justify"&gt;תרשים עם פעולות שיכולות לעזור בכתיבת המסמך והטמעתו: &lt;/p&gt;
&lt;p dir="rtl" align="justify"&gt;&lt;img alt="" src="http://blogs.microsoft.co.il/blogs/maxim/112809_1845_172.png" /&gt; &lt;/p&gt;
&lt;div dir="rtl" align="justify"&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;קבל את התחייבות הארגון לעבור דרך תהליך הסטנדרטיזציה&lt;/strong&gt;: במילים אחרות קבל OK של הממונים שלך. חשוב שגם האנשים שיהיו צרכני המסמך יבינו את חשיבותו (אף אחד לא אוהב לבזבז זמן על משהו שלא ישמש אף אחד); &lt;br /&gt;&lt;span style="COLOR:white;"&gt;-&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;גייס תומכים לתהליך הסטנדרטיזציה&lt;/strong&gt;: גייס את דעת הקהל. יתכן מצב שמספר עובדים לא יקבלו בהבנה את המסמך, יהיו אמירות כמו: &amp;quot;למה אנו צריכים את הדברים האלה?&amp;quot;, &amp;quot;אנו יודעים לעבוד גם ללא המסמך!&amp;quot;, &amp;quot;עד עכשיו הסתדרנו ללא המסמך!&amp;quot; וכו&amp;#39;. – לא אציג כאן את דרכי השכנוע, מאמין שמי שלוקח על עצמו את התפקיד של מהנדס UI/UX ומוכן לכתוב את המסמך יידע לשכנע בצורה טובה. &lt;br /&gt;&lt;span style="COLOR:white;"&gt;-&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;אסוף מידע&lt;/strong&gt;: בצע איסוף מידע ממשתמשי הקצה (לקוח), על סביבת העבודה (באתר לקוח), תהליכים עסקיים, זרימת עבודה ומשימות, אסטרטגיה ארגונית וכו&amp;#39;.&lt;span style="COLOR:#984806;"&gt;&lt;em&gt; [זמנים: 2-3 ימים בממוצע]&lt;/em&gt;&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;הגדר סוגי הסטנדרטים הנחוצים&lt;/strong&gt;: בד&amp;quot;כ קובעם סטנדרטים עבור: מודל ארכיטקטוני של קליינט (&lt;a title="wiki" href="http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller"&gt;MVC&lt;/a&gt;, &lt;a title="wiki" href="http://en.wikipedia.org/wiki/Model_View_Presenter"&gt;MVP&lt;/a&gt; OR &lt;a title="wiki" href="http://en.wikipedia.org/wiki/MVVM"&gt;MVVM&lt;/a&gt;), סוגי הפקדים עבור סוגים שונים של מידע (Data Models, Data Sources), תקן של תבניות מידע קבועות בפרויקט (&lt;a title="wiki" href="http://en.wikipedia.org/wiki/Windows_Presentation_Foundation"&gt;Data Templates&lt;/a&gt;), כללי נווט בין מסכים (מפת המסכים), מבנה של מסך ראשי, הכוונה למבנה כללי של טפסים, סוג ה- GUI (Tabular, Single Window, MDI Window, Multiple Window). לווה כל בדוגמאות. &lt;em&gt;&lt;span style="COLOR:#984806;"&gt;[זמנים: 5-10 ימים בממוצע] &lt;br /&gt;&lt;/span&gt;&lt;span style="COLOR:white;"&gt;-&lt;/span&gt;&lt;/em&gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;הגדר מספר מסכים שיעוצבו בהתאם לסטנדרטים&lt;/strong&gt;: בד&amp;quot;כ לא ניתן להחיל עיצוב לפי סטנדרטים על כל המסכים במערכות גדולות, השתדל לתכנן לפחות 85% מהמסכים בהתאם לסטנדרט שקבעת. הדבר יאפשר שמירה על &amp;quot;&lt;span style="TEXT-DECORATION:underline;"&gt;עקרון העקביות&lt;/span&gt;&amp;quot; שמאוד חשוב. &lt;br /&gt;&lt;span style="COLOR:white;"&gt;-&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;לווה מסמך בדוגמאות&lt;/strong&gt;: השתדל לתת כמה שיותר דוגמאות לעיצוב המסכים, כסה מספר מקסימאלי של סוגי הפקדים נתמכים בהתאם למקרי השימוש. ספק דוגמאות מסוג &amp;quot;עיצוב מומלץ&amp;quot; ו&amp;quot;עיצוב &lt;span style="TEXT-DECORATION:underline;"&gt;לא&lt;/span&gt; מומלץ&amp;quot;. אנשים שיעצבו מסכים בהתאם למסמך יפנו יותר לדוגמאות מאשר לטקסט יבש. &lt;br /&gt;&lt;span style="COLOR:white;"&gt;-&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;בנה תבניות כלליות&lt;/strong&gt;: בנה מספר תבניות מוכנות של מסכים, טפסים, פאנלים, מסגרות, סטים של פקדים וכו&amp;#39;.ברוב מערכות מידע יש דמיון בין טפסי המידע (Win-Forms), השוני הוא בכמות, סוג ומיקום הפקדים (כמובן יש גם שוני בהתנהגות המסכים). תבנית מוכנה יכולה לצמצם זמני עבודה, מעצב המסך יוכל להשמיש תבנית לצרכיו (לרוב ייעשה Drag-and-Drop וישנה את הפקדים, סגנון וסטנדרט יישמרו). &lt;br /&gt;&lt;span style="COLOR:white;"&gt;-&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;שתף ועדה טכנולוגית בהחלטות עיצוביות והצג בפניה את המסמך&lt;/strong&gt;: הצג מסמך בפני פורום מקצועי-טכנולוגי. שתף פורום בהחלטות עיצוביות שנתקבלו בעת כתיבת המסמך. במידע ויהיו הערות לשינוי/תיקון דברים במסמך – עדיף שיהיו בשלב זה ולא בשלב שלאחר ההפצה של המסמך. &lt;em&gt;&lt;span style="COLOR:#984806;"&gt;[זמנים: 3-4 ימים בממוצע כולל DR] &lt;br /&gt;&lt;/span&gt;&lt;span style="COLOR:white;"&gt;-&lt;/span&gt;&lt;/em&gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;הפץ מסמך בין גורמים רלוונטיים ובצע הדרכות&lt;/strong&gt;: לאחר אישור הגורמים הרלוונטיים (אחרי שמסמך אושר בוועדה טכנולוגית) הפץ מסמך בין אנשים שיעצבו ויפתחו מסכים. מכוון שאנשים לא אוהבים לקרוא מסמכים עדיף לבצע הדרכה במקביל להפצה. ההדרכה לא יכולה לכסות את כל הנושאים ולא יכולה לתת תשובות לכל הבעיות שיצוצו, היא תאפשר הכנסה של אנשים לעניין המסמך והם ייחשפו לדברים עיקריים במסמך. &lt;em&gt;&lt;span style="COLOR:#984806;"&gt;[זמנים: כתיבה של מסמך: 1-3 שבועות בממוצע, הדרכות: 2-7 ימים בממוצע] &lt;br /&gt;&lt;/span&gt;&lt;span style="COLOR:white;"&gt;-&lt;/span&gt;&lt;/em&gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;יישם והטמע סטנדרטים&lt;/strong&gt;: זוהי מהות המסמך, אחרת זה יהיה עוד נייר מיותם בסדרה אינסופית של מסמכים שאף אחד לא מתייחס אליהם. החל מרגע ההפצה של המסמך כל מי שמעורב בעיצוב-פיתוח המסכים &amp;quot;אמור&amp;quot; להיצמד אליו, ז&amp;quot;א להשתמש באותו סט פקדים, באותן טכניקות, באותו סגנון (Look-and-Feel), באותם כללים של שמישות וכו&amp;#39;. &lt;em&gt;&lt;span style="COLOR:#984806;"&gt;[זמנים: 2-4 שבועות בממוצע] &lt;br /&gt;&lt;/span&gt;&lt;span style="COLOR:white;"&gt;-&lt;/span&gt;&lt;/em&gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;וודא הטמעה של סטנדרטים&lt;/strong&gt;: בצע ביקורות תוצרים (Design and Code Review). וודא שמסכים מעוצבים בהתאם לסטנדרט שנקבע. זה מתקשר לסעיף הקודם – תן משמעות לתקנים שאליהם התחייבת. &lt;em&gt;&lt;span style="COLOR:#984806;"&gt;[זמנים: אין הגבלה, מתבצע לאורך כל הפרויקט] &lt;br /&gt;&lt;/span&gt;&lt;span style="COLOR:white;"&gt;-&lt;/span&gt;&lt;/em&gt; &lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;strong&gt;עדכן מסמך בהתאם לשינויים המתבקשים&lt;/strong&gt;: מסמך סטנדרטים הנו ייצור חי. מפעם לפעם יתכנו שינויים בעיצוב המסכים שיידרשו שינוי בסטנדרט מסוים. במקרים מסוימים נגלה שמשהו מהמסך לא מתאים או לא עומד במבחן הזמן. לאחר שינוי המסמך דאג להפיצו בין גורמים רלוונטיים ובצע הדרכות (חזרה לסעיף 9 ולרוב גם ל- 8). &lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;
&lt;p&gt;&lt;img style="MARGIN:0px 10px 10px 5px;" alt="" align="left" src="http://blogs.microsoft.co.il/blogs/maxim/112809_1845_173.png" /&gt; &lt;/p&gt;
&lt;h2&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2&gt;קווים מנחים בכתיבת המסמך &lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;זכור למי מיועד המסמך&lt;/strong&gt;: רמת הפירוט הטכני וכלל התכנים צריכים להיות מותאמים לאנשים בעלי רמה טכנית שונה. במידה ומסמך מיועד למנתחי מערכות וגם למפתחים, התאם לרמה למנתחים אשר לא בקיעים בפרטים הטכניים ספציפיים של פיתוח. אם מסמך מיועד למפתחי התוכנה אפשר לספק פירוט טכנולוגי יותר מורחב. &lt;br /&gt;&lt;span style="COLOR:white;"&gt;-&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;&lt;span style="FONT-FAMILY:arial;COLOR:black;"&gt;&lt;span style="FONT-SIZE:14pt;"&gt;&lt;strong&gt;עקביות&lt;/strong&gt;&lt;/span&gt;: &lt;span style="TEXT-DECORATION:underline;"&gt;אחד העקרונות החשובים בעיצוב UI&lt;/span&gt;. ממשק התוכנה חייב להיות עקבי. המשתמש המודרני מצפה &amp;quot;להיכנס לעניינים&amp;quot; תוך זמן קצר. אם נשמור על עקרון העקביות בכל מסכי המערכת המשתמש יוכל לבצע פעולות בצורה אינטואיטיבית, על סמך הניסיון מתוכנות קודמות ו/או על סמך מה שהוא למד לעשות במסכים ראשונים במערכת החדשה. למשל: המשתמש התרגל לפתוח חלון מודאלי (Dialog-Window) עם פרטים&lt;/span&gt; מורחבים של רשומה ע&amp;quot;י לחיצה כפולה על שורה בטבלה (Data-Grid), אם מסך מסוים יאפשר פתיחת טופס בלחיצה אחת – לרוב זה יעצבן את המשתמש ופעולה שלעצמה אינה בטיחותית. המסמך חייב לכלול הסבר כיצד לשמור על עקביות, עקביות בכמה רבדים: מיקום כפתורי פעולה, יישור שדות הזנה, סוגי פקדים (בהתאם לסוגי מידע שהם מקבלים), מתי עושים קליק-כפול ומתי קליק-אחד, כיצד להציג הודעות שגיאה, כיצד להתריע על שגיאות וולידציה וכו&amp;#39;. תאר עקביות בסגנון (Styling) או בעיצוב הטפסים: שימוש בצבעים לרקעים, צבעי אזהרה/שגיאה, צבעי הפונטים, גדלים של פונטים ואייקונים. תאר כיצד לקבוע את פריסת הפקדים בטופס, תן המלצות לגבי החלוקה (טאבולארית – Tabular GUI, דף נגלל, אזורים מתקפלים וכו&amp;#39;). במידה ושפת הממשק הנה עברית התייחס לזרימת הטקסט הנכונה (Right-to-Left Flow Direction) – מאוד חשוב שמפתחים ידעו לקבוע מראש את זרימת המסך מימין לשמאל בשלבים מוקדים של פיתוח, אם יתחילו פיתוח הטפסים עם כוון LTR יהיה מאוד קשה לשנות את הזרימה אח&amp;quot;כ. זכור לבצע שלב 11 (וודא הטמעה של סטנדרטים) מפרק קודם – בצע DR-ים (Design Review) לתוצרים של אנשים, וודא שעקרון העקביות נשמר. &lt;br /&gt;&lt;span style="COLOR:white;"&gt;-&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;קבע סטנדרטים והצמד אליהם&lt;/strong&gt;: בהמשך לסעיף הקודם, לרוב צריך לקבוע סטנדרט של סוגי הפקדים (ספק דוגמאות לשימוש בסט הפקדים של הפרויקט – Controls&amp;#39; Toolbox), סטנדרט של סגנון (פורט בסעיף הקודם). סטנדרט של איכות (מאוד חשוב) – כיצד לוודא עיצוב ופיתוח המסכים מתבצע בהתאם לסטנדרטים שקבענו, ספק To-do List לביצוע בדיקות הנ&amp;quot;ל. קבע מודל עבודה – מיהם האנשים שיהיו מעורבים בעיצוב ופיתוח מסכים, מי האנשים שיעשו ביקורת לתוצרים, מיהם אנשי הקשר שלך (אתה לא יכול להתפצל לכמה אנשים כדי לתמוך בכולם). &lt;br /&gt;&lt;span style="COLOR:white;"&gt;-&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;על תמציא גלגל מחדש&lt;/strong&gt;: למד מניסיונם של אחרים, השתמש בסטנדרטים המקובלים בשוק התוכנה או במערכות דומות. ראה דוגמאות של מסמכי סטנדרטים ברגונך (במידה וקיימים), השתמש בדוגמאות ממקורות אחרים. אם מפתחים יישום לשימוש בסביבת המשרד – ניתן לחכות יישומי אופיס או יישומים אחרים המוכרים למשתמש שלך (רבים מכירים ממשקים של MS Office, רבים משתמשים בקיצורי סטנדרטיים, זכור לא לדרוס קיצורי דרך של מערכת הפעלה). &lt;br /&gt;&lt;span style="COLOR:white;"&gt;-&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;דוגמאות&lt;/strong&gt;: לווה מסמך בכמה שיותר דוגמאות מוחשיות. השתמש בצילומי מסך, מבנה טפסים, תבניות, שימוש בסגנונות. ספק דוגמאות מסוג &amp;quot;תעשה&amp;quot; ו&amp;quot;אל תעשה&amp;quot;. לפי ניסיוני, רוב האנשים פשוט לא קוראים מלל (מתכנתים אף שונאים מלל, לעומתם מנתחי מערכות יעדיפו משהו כתוב), לכן דוגמאות גראפיות תהיינה מאוד יעילות. &lt;br /&gt;&lt;span style="COLOR:white;"&gt;-&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;כללי נווט&lt;/strong&gt;: הגדר כללי נווט ברורים בתוך המסכים והחוצה. באילו מקרים ייפתח חלון מודאלי ובאילו מקרים נעדיף למקם תוכן הטופס בתוך המסך. כיצד מנווטים בתוך המסך, קיצורי דרך של מקלדת, זרימת העבודה בתוך המסך, שימוש ב- Wizards. ספק מפת מסכים לדוגמא, המפה תכלול דוגמאות של &amp;quot;הכלה&amp;quot; (Screen Composition) ודוגמאות של נווט (Screen Navigation). &lt;br /&gt;&lt;img alt="" src="http://blogs.microsoft.co.il/blogs/maxim/112809_1845_174.png" /&gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;שפת הממשק&lt;/strong&gt;: הכוון משתמשים לשפה משותפת, בנה מילון עסקי עבור UI, עדכן מילון מפעם לפעם. חשוב שכל מי שמעורב בעיצוב ופיתוח המסכים ישמור על עקביות גם בתגיות (Labels), בהודעות (Error/Info/Warning Messages). הנחה משתמשים להשתמש באותו סגנון בהודעות, כפתורי פעולה אחידים (האם להשתמש במילים כמו &amp;quot;שמור&amp;quot; או &amp;quot;שמירה&amp;quot;, &amp;quot;פתח&amp;quot; או &amp;quot;פתיחה&amp;quot;, &amp;quot;חפש&amp;quot; או &amp;quot;חיפוש&amp;quot;). מילון עסקי זוהי שפה ייחודית של ארגון, אבל גם כאן אני לא ממליץ להמציא גלגל מחדש, מילות צווי ברוב התוכנות הנן זהות. דאג להדריך &amp;quot;עורכי דין&amp;quot; להשתמש במלל קצר, אפקטיבי ופרודוקטיבי (&amp;quot;עורכי דין&amp;quot; או &amp;quot;בלשנים&amp;quot; – אנשים שמכניסים טקסטים ארוכים ומסורבלים בממשקי משתמש, בד&amp;quot;כ מנסחים הודעות בשפה גבוהה שלא באה מעולם המחשבים). &lt;br /&gt;&lt;span style="COLOR:white;"&gt;-&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;סט פקדים (&lt;a title="wiki" href="http://en.wikipedia.org/wiki/GUI_widget"&gt;UI Widgets&lt;/a&gt;)&lt;/strong&gt;: הכן רשימת פקדים ופרט מקרים בהם יש להשתמש בפקד מסוג מסוים. סט יכול להכיל פקדים מיוחדים (Customized Controls), ייחודיים לפרויקט, אשר נבנו לפונקציונאליות עסקית ספציפית (למשל: גרפים מיוחדים, שעוני דשבורד, פאנלים עם תבניות מוכנות, Grid Tables מיוחדים, סיירי מדיה וכו&amp;#39;). ספק דוגמאות ויזואליות (Screen Snapshots) למקרי שימוש ולאופני שימושי. אין צורך לפרט על פקדים סטנדרטיים כגון: תוויות, תיבות טקסט, תיבות בחירה (קומבו), רשימות תקניות (List Box) ועוד פקדים שלרוב ידוע כיצד להשתמש בהם. &lt;br /&gt;&lt;span style="COLOR:white;"&gt;-&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;סגנון של טפסים (&lt;a title="wiki" href="http://en.wikipedia.org/wiki/Look-and-feel"&gt;Look-and-Feel&lt;/a&gt;)&lt;/strong&gt;: כפי שהסברתי בסעיפים קודמים, חושב להנחות מהו הסגנון של הממשק, מהם צבעי אזהרה, ידיעה, שגיאות. אם יש תקציב לגרפיקאי שיעשה את עיצוב הממשק, חושב להראות לאנשים מהו העיצוב הסופי המצופה. במקרה שמודל העבודה על המסכים &amp;quot;מעצב UI&amp;quot; + &amp;quot;מתכנת קליינט&amp;quot; (לרוב מקובל ב&lt;a title="Post 10" href="http://blogs.microsoft.co.il/blogs/maxim/archive/2008/03/03/ui-10-designer-vs-developer.aspx"&gt;עבודה עם WPF&lt;/a&gt;), יש לקבוע תחומי אחראיות לתוצרים ותחומי החפיפה; לרוב גרפיקאי יעצב תבניות, סגנונות, אייקונים ולוגואים (בהתאם למבנה המסך הראשי), המתכנת חייב לדעת לא &amp;quot;לפלוש&amp;quot; לאזורים של מעצב (למודל הנ&amp;quot;ל אקדיש פוסט נפרד). לרוב אנשים שמעורבים בעיצוב-פיתוח UI ירצו לדעת כיצד התוצרים שלהם ייראו בעיצוב הסופי, במקרים אלה אפשר לספק להם תבנית גרפית שאותה &amp;quot;ילבישו&amp;quot; על המסכים שלהם. ללא קשר לתוצרים של גרפיקה, חושב להסביר לאנשים כיצד לשמור על אחידות עיצובית כדי לתת Look-and-Feel אחידים לאורך כל המסכים. &lt;br /&gt;&lt;span style="COLOR:white;"&gt;-&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;נגישות ושמישות (&lt;a title="wiki" href="http://en.wikipedia.org/wiki/Computer_accessibility"&gt;Accessibility&lt;/a&gt; and &lt;a title="wiki" href="http://en.wikipedia.org/wiki/Usability"&gt;Usability&lt;/a&gt;)&lt;/strong&gt;: קבע כללים עבור נגישות ה- GUI בטפסים של הפרויקט. הסתמך על סביבת העבודה אצל לקוח: קהל היעד (האם יש מוגבלות פיזיות כלשהן אצל משתמשי הקצה), תצורת המחשב (גודל המסך, סוג המסך, איכות המסך, מערכת הפעלה, כוננים וכו&amp;#39;). קבעי כללים עבור שמישות. ציין כיצד לוודא שטופס שמיש וחסכוני מבחינת הפעולות (כיום מושג &amp;quot;&lt;a href="http://blogs.microsoft.co.il/blogs/maxim/archive/2007/12/10/ui-3-ui.aspx"&gt;GUI ארגונומי&lt;/a&gt;&amp;quot; מאוד נפוץ). &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;הדרכה&lt;/strong&gt;: (סעיף 9 בתרשים) במהלך ההדרכה של צרכני המסמך מומלץ להראות כיצד בונים מסך. הסבר כיצד לחסוך פעולות מיותרות, הראה כיצד להשתמש בתבניות מוכנות, הראה כיצד ייראו למקם פקדים בהתאם לזרימת המסך/שפה. ציין נקודות חשובות במסמך שעליהם לא ניתן לדלג. &lt;br /&gt;&lt;span style="COLOR:white;"&gt;-&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;בצע DR (Design Review)&lt;/strong&gt;: חשוב לקבל חוות דעת מגורמים מוסמכים לגבי המסמך לפני ביצוע הדרכות והפצה. בצע DR לעיצוב של מסכים של צרכני המסמך (סעיף 11 בתרשים עליון). &lt;br /&gt;&lt;span style="COLOR:white;"&gt;-&lt;img style="MARGIN:5px 10px 10px 5px;" alt="" align="left" src="http://blogs.microsoft.co.il/blogs/maxim/112809_1845_175.jpg" /&gt;&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;עקרונות וקווים מנחים לעיצוב&lt;/strong&gt;: &lt;span style="COLOR:white;"&gt;-&lt;/span&gt; &lt;/li&gt;&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;מבנה&lt;/strong&gt;: הצע מבנה היררכי, קבץ פקדים לתוך מסגרות בהתאם פונקציונאליות משותפת, הוצא פקדים משותפים למסגרות שחופפות למסגרות נושאים. אסור שלמשתמש תהיה צריכה להיות תחושה שממשק מאיים ועמוס. &lt;br /&gt;&lt;span style="COLOR:white;"&gt;-&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;פשטות&lt;/strong&gt;:&lt;strong&gt; &lt;/strong&gt;זהה תהליכים כללים וראשיים, הגדר אזורי הפעלה לתהליכים אלה, השתמש במודל מופשט, סדר פקדים והיררכיה בצורה נוחה, הגדר קיצורי דרך של מקלדת לפעולות נפוצות. &lt;br /&gt;&lt;span style="COLOR:white;"&gt;-&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;שקיפות&lt;/strong&gt;: הצג את מירב האופציות הזמינות באותו המסך (ללא עומס חזותי), אם עמוס - חלק למספר חוצצים/אזורים. אל תציע מיליון דרכים לביצוע של אותה פעולה, תרגיל משתמש שפעולה כלשהי מתבצעת במקום מסוים (שים לב שב- &lt;a title="wiki" href="http://en.wikipedia.org/wiki/Microsoft_Office_2007"&gt;MS Word 2007&lt;/a&gt; כל הפעולות מתבצעות רק דרך &lt;a title="wiki" href="http://en.wikipedia.org/wiki/Ribbon_(computing)"&gt;Ribbon&lt;/a&gt; ולא כמו ב- &lt;a title="wiki" href="http://en.wikipedia.org/wiki/Microsoft_Office_2003"&gt;MS Word 2003&lt;/a&gt; ניתן היה לבצע פעולה גם דרך סרגל כלים וגם דרך תפריטים). &lt;br /&gt;&lt;span style="COLOR:white;"&gt;-&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;משוב&lt;/strong&gt;: למשתמש צריכה להיות תחושה שבכל שלב הוא יודע מה אמור לקרות, הוא מצפה לתגובות מסוימות של הממשק. ספק משוב רלוונטי כתוצאה מפעולת המשתמש, אל תציג הודעה עם תוכל מבלבל או לא קשור לפעולה שבעקבותיה הוצגה ההודעה. ספק חיווי ברור למרחש, גם אם זה מוריד מ&amp;quot;סקסיות המסך&amp;quot;. &lt;br /&gt;&lt;span style="COLOR:white;"&gt;-&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;גמישות&lt;/strong&gt;: בנה ממשק גמיש וסלחני. אל תטריח משתמש בפעולות מיותרות. השתדל לספק לו שירות מודרני שיקל על עבודתו (כמו למשל השלמות אוטומטיות של טקסטים וגיבוי אוטומטי). תאפשר לבצע שגיאות בלי להציג הודעות אימה (כמה דוגמאות לכותרות של שגיאות מפחידות ומיותרות: Fatal Error, Unrecoverable Error, Unknown Error). למרות שזה לא תמיד קל מבחינה תכנותית, השתדל לתת אופציה של Undo-Redo (תבנית &lt;a href="http://en.wikipedia.org/wiki/Memento_pattern"&gt;Memento&lt;/a&gt;). &lt;br /&gt;&lt;span style="COLOR:white;"&gt;-&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;שימוש חוזר&lt;/strong&gt;: עשה שימוש חוזר ברכיבי ממשק (גם פנימיים וגם חיצוניים). הדבר יאפשר תחזוקה קלה ומשתמש יתרגל לאותו סגנון העבודה, יכיר מסכים חדשים ביתר קלות. &lt;/li&gt;&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;קבע קווים מנחים לעיצוב אינטואיטיבי, נקי, שתף אנשים בדוגמאות ובקש מהם לשתף פעולה ביניהם. הגדר מהו עיצוב אינטואיטיבי (כיצד לגרום למשתמש ללא הדרכה מעמיקה להפעיל מסך על סמך ניסיונו הקודם ועל סמך ניסיונות מהפעלת מסכים אחרים במערכת). הנחה לגבי עיצוב חסכוני, אסור לעצב מסכים עמוסים. קבע חלוקה לרמות ולחוצצים (Tabs) בהתאם לעומס של פקדים.&lt;/em&gt; &lt;br /&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;img style="MARGIN:5px 10px 10px 5px;" alt="" align="left" src="http://blogs.microsoft.co.il/blogs/maxim/112809_1845_176.png" /&gt; &lt;/p&gt;
&lt;h2&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2&gt;דוגמא למבנה של מסמך &lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;תוכן עניינים &lt;/li&gt;
&lt;li&gt;הסבר על מסמך (כולל מדריך לשימוש נכון במסמך - אופציונאלי) &lt;/li&gt;
&lt;li&gt;מילון מונחים (מושגים טכניים שנפגשים במסמך - אופציונאלי) &lt;/li&gt;
&lt;li&gt;מבנה של חלון ראשי (תשתית) &lt;/li&gt;
&lt;li&gt;שירותי תשתית UI (השירותים ברמת GUI שכל מודול יכול לצרוך מתשתית, כמו: שירותי הדפסה, איות, עזרה, חיפוש, סרגלי כלים, תפריטים וכו&amp;#39;) &lt;/li&gt;
&lt;li&gt;מפת מסכים (לרוב בתחילת הפרויקט לא ידוע אילו מסכים יהיו, המפה תכלול מסכי תשתית וחלק מהמסכים הראשיים, עיקרה לתת הנחייה כיצד לבנות מפות פר מודול) &lt;/li&gt;
&lt;li&gt;רשימת סטנדרטים (פירוט מלא + דוגמאות) &lt;/li&gt;
&lt;li&gt;רשימת GUI Widgets (סט פקדים של הפרויקט + דוגמאות שימוש) &lt;/li&gt;
&lt;li&gt;סגנון גראפי (ראה הסבר למעלה לגבי Look-and-Feel) &lt;/li&gt;
&lt;li&gt;רשימת תבניות מוכנות (כמובן מלווה בדוגמאות) &lt;/li&gt;
&lt;li&gt;מילון עסקי עבור UI (רשימה עם טקסטים עבור כפתורים, תוויות והודעות) &lt;/li&gt;
&lt;li&gt;מדריך לבניה נכונה של מסך (עם דוגמא ממשית מתוך הפרויקט) &lt;/li&gt;
&lt;li&gt;משאבים משותפים (מקשי קיצורי דרך גלובאליים, טבלאות מערכת, גלריית אייקונים/תמונות, מילוני לוקליזציה, הודעות שגיאה, לוגרים ועוד) &lt;/li&gt;
&lt;li&gt;דוגמאות &amp;quot;עשה&amp;quot; ו&amp;quot;לא עשה&amp;quot; (צילומי מסך עם הסברים) &lt;/li&gt;
&lt;li&gt;רשימת טיפים ועקרונות מנחים &lt;/li&gt;
&lt;li&gt;רשימה של אנשי קשר ואחראים (לפני סגירת המסמך קבע מיהם האנשים שירכזו את נושא ה- UI ויהיה בקשר איתך) &lt;/li&gt;
&lt;li&gt;מקורות &lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;מקווה שדברים אלה יעזרו לכם בתכנון וכתיבה של מסמך סטנדרטים ובכלל בתפיסה של UI נכון. המון אנשים חושבים שהם &amp;quot;יודעים&amp;quot; איך לעצב/לפתח מסכי GUI על מסך תחושה אישית ועל סמך ניסיונם בהפעלה של תוכנות אחרות, אין זה אומר שהם באמת יודעים כיצד לעשות זאת. מסמך זה ייתן להם קו מנחה ברור כיצד להתקדם בעיצוב המסכים בפרויקט תוכנה, הוא ישמש גם צוות אפיון וגם צוות פיתוח, יהווה הסכם כתוב לגבי תקן איכות (סטנדרט) בעיצוב UI. &lt;/p&gt;
&lt;p&gt;&lt;span style="COLOR:red;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="COLOR:red;"&gt;&lt;font size="4"&gt;&lt;strong&gt;&lt;br /&gt;בהצלחה ;-)&lt;/strong&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;strong&gt;
&lt;hr /&gt;

&lt;p&gt;מקורות מידע נוספים: &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.ambysoft.com/essays/userInterfaceDesign.html"&gt;http://www.ambysoft.com/essays/userInterfaceDesign.html&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.fltk.org/hig.php"&gt;http://www.fltk.org/hig.php&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.humanfactors.com/downloads/aug04.asp"&gt;http://www.humanfactors.com/downloads/aug04.asp&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa217660(office.11).aspx"&gt;http://msdn.microsoft.com/en-us/library/aa217660(office.11).aspx&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.pbdr.com/guistd/index.htm"&gt;http://www.pbdr.com/guistd/index.htm&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href="http://mip-site.lsec.dnd.ca/qsd_current_version/sw_eng/di/ui_guidance.htm"&gt;http://mip-site.lsec.dnd.ca/qsd_current_version/sw_eng/di/ui_guidance.htm&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.classicsys.com/css06/cfm/article.cfm?articleid=20"&gt;http://www.classicsys.com/css06/cfm/article.cfm?articleid=20&lt;/a&gt; &lt;/p&gt;&lt;span style="FONT-FAMILY:tahoma;COLOR:#333333;FONT-SIZE:10pt;"&gt;
&lt;hr /&gt;

&lt;p&gt;&lt;span style="FONT-FAMILY:tahoma;FONT-SIZE:10pt;"&gt;&lt;span style="COLOR:#333333;"&gt;ראו בהמשך פוסט על &amp;quot;עיצוב ממשק משתמש מודרני&amp;quot;, אשמח לקבל הערות/תיקונים לגבי הפוסט. לרשימת הפוסטים של הסדרה &lt;/span&gt;&lt;span style="COLOR:#0066aa;"&gt;&lt;a title="Post Series" href="http://blogs.microsoft.co.il/blogs/maxim/archive/2007/12/08/ui.aspx"&gt;לחצו כאן&lt;/a&gt;&lt;/span&gt;&lt;span style="COLOR:#333333;"&gt;. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=454479" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Win-Forms/default.aspx">Win-Forms</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/GUI/default.aspx">GUI</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/UI/default.aspx">UI</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Education/default.aspx">Education</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/SDM/default.aspx">SDM</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Software+Developement+Methods/default.aspx">Software Developement Methods</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/UX/default.aspx">UX</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Display+Technologies/default.aspx">Display Technologies</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/_E205D105E805D905EA05_/default.aspx">עברית</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/TECH/default.aspx">TECH</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/GUI+Standard/default.aspx">GUI Standard</category></item><item><title>“Class2Table” Exporter</title><link>http://blogs.microsoft.co.il/blogs/maxim/archive/2009/09/30/class2table-entity2sql-exporter.aspx</link><pubDate>Wed, 30 Sep 2009 00:00:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:414466</guid><dc:creator>Maxim</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/maxim/rsscomments.aspx?PostID=414466</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/maxim/commentapi.aspx?PostID=414466</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/maxim/archive/2009/09/30/class2table-entity2sql-exporter.aspx#comments</comments><description>&lt;h1&gt;&lt;strong&gt;“Class to Table”&amp;nbsp;= “Entity to SQL”&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;Recently, I deal with UML design in &lt;a title="info" href="http://www.sparxsystems.com/" target="_blank"&gt;EA&lt;/a&gt;, also I design DB Entities for DBML (&lt;a title="info" href="http://msdn.microsoft.com/en-us/library/bb399400.aspx" target="_blank"&gt;Linq2Sql&lt;/a&gt;). In regular way, programmer creates DB table and imports it into VS solution as entity class for DBML. But, sometimes we need to create DB table from existing class. I’m pretty sure that there are some free tools that can do this job, but as many code freaks I prefer to develop my own tools (mostly without looking for existing solutions).&lt;/p&gt;
&lt;p&gt;I want to share my community contribution at &lt;a title="http://class2table.codeplex.com/" href="http://class2table.codeplex.com/"&gt;http://class2table.codeplex.com/&lt;/a&gt; with small application that allows generation/creation of DB tables from any .Net type. User loads assembly file, selects reflected type in combo, picks desired properties, then he can generate SQL script or to create table directly in SQL DB.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/maxim/image_3548BA68.png" target="_blank"&gt;&lt;img style="BORDER-RIGHT-WIDTH:0px;DISPLAY:inline;BORDER-TOP-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-LEFT-WIDTH:0px;" title="Class2Table" border="0" alt="Class2Table" src="http://blogs.microsoft.co.il/blogs/maxim/image_thumb_5D4B43BA.png" width="643" height="484" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Remarks: This is “Quick &amp;amp; Dirty” application, I’ve made it as temp. solution. Any comments/improvements will be accepted with pleasure. Of course, you should understand that it is a free-beta-version and I’m not responsible for any damage that may be caused by using this application. All rights reserved ®.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Application" align="middle" src="http://i3.codeplex.com/Images/v15760/RuntimeBinary.gif" /&gt;&amp;nbsp;&amp;nbsp; &lt;a title="EXE" href="http://class2table.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=33744" target="_blank"&gt;EXE Files on Codeplex&lt;/a&gt;&lt;br /&gt;&lt;img alt="Application" align="middle" src="http://i3.codeplex.com/Images/v15760/RuntimeBinary.gif" /&gt;&amp;nbsp;&amp;nbsp; &lt;a title=".Net Project" href="http://class2table.codeplex.com/SourceControl/ListDownloadableCommits.aspx" target="_blank"&gt;Sources on Codeplex&lt;/a&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:8eb9d37f-1541-4f29-b6f4-1eea890d4876:cbff0adf-2fdf-4bf0-9b94-e73af8b2bd29" class="wlWriterEditableSmartContent"&gt;Sources on Blog: &lt;a href="http://blogs.microsoft.co.il/blogs/maxim/Class2Table20090930Sources_3CA3B86E.zip" target="_blank"&gt;Class2Table-2009-09-30-Sources.zip&lt;/a&gt;&lt;/div&gt;
&lt;div style="PADDING-BOTTOM:0px;MARGIN:0px;PADDING-LEFT:0px;PADDING-RIGHT:0px;DISPLAY:inline;FLOAT:none;PADDING-TOP:0px;" class="wlWriterEditableSmartContent"&gt;&lt;br /&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style="PADDING-BOTTOM:0px;MARGIN:0px;PADDING-LEFT:0px;PADDING-RIGHT:0px;DISPLAY:inline;FLOAT:none;PADDING-TOP:0px;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:625aca0b-fa69-4fb6-a38b-f338a711cf2a" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/C%23" rel="tag"&gt;C#&lt;/a&gt;,&lt;a href="http://technorati.com/tags/DEV" rel="tag"&gt;DEV&lt;/a&gt;,&lt;a href="http://technorati.com/tags/MS+Visual+Studio+2008" rel="tag"&gt;MS Visual Studio 2008&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Linq2Sql" rel="tag"&gt;Linq2Sql&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Class2Table" rel="tag"&gt;Class2Table&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Code+Example" rel="tag"&gt;Code Example&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=414466" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Win-Forms/default.aspx">Win-Forms</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/.Net/default.aspx">.Net</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Example/default.aspx">Example</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Code+Example/default.aspx">Code Example</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Developer/default.aspx">Developer</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Designer/default.aspx">Designer</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Daily+Tip/default.aspx">Daily Tip</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/MS+Visual+Studio+2008/default.aspx">MS Visual Studio 2008</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Open+Source/default.aspx">Open Source</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Codeplex/default.aspx">Codeplex</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Class2Table/default.aspx">Class2Table</category></item><item><title>IMPR</title><link>http://blogs.microsoft.co.il/blogs/maxim/archive/2009/09/26/impr.aspx</link><pubDate>Sat, 26 Sep 2009 13:00:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:413351</guid><dc:creator>Maxim</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/maxim/rsscomments.aspx?PostID=413351</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/maxim/commentapi.aspx?PostID=413351</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/maxim/archive/2009/09/26/impr.aspx#comments</comments><description>&lt;h3&gt;&lt;strong&gt;Intelligent Mass Production Robotics&lt;/strong&gt;&lt;/h3&gt;  &lt;p&gt;&lt;a title="Artificial Intelligence" href="http://en.wikipedia.org/wiki/Artificial_intelligence" target="_blank"&gt;AI&lt;/a&gt; &amp;amp; &lt;a title="Image Processing" href="http://en.wikipedia.org/wiki/Image_processing" target="_blank"&gt;IP&lt;/a&gt; in Mass Production:&lt;/p&gt;  &lt;p&gt;&lt;object width="445" height="364"&gt;&lt;param name="movie" value="http://www.youtube.com/v/xHuDvVa7mkw&amp;amp;hl=en&amp;amp;fs=1&amp;amp;border=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/xHuDvVa7mkw&amp;amp;hl=en&amp;amp;fs=1&amp;amp;border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="445" height="364"&gt;&lt;/embed&gt;&lt;/object&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:7fb8ec62-5462-4425-8371-3f0ffc3f23bb" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Video" rel="tag"&gt;Video&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Media" rel="tag"&gt;Media&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Robotics" rel="tag"&gt;Robotics&lt;/a&gt;,&lt;a href="http://technorati.com/tags/AI" rel="tag"&gt;AI&lt;/a&gt;,&lt;a href="http://technorati.com/tags/IP" rel="tag"&gt;IP&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=413351" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Video/default.aspx">Video</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Media/default.aspx">Media</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Robotics/default.aspx">Robotics</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/AI/default.aspx">AI</category></item><item><title>High-Speed Robotics</title><link>http://blogs.microsoft.co.il/blogs/maxim/archive/2009/08/25/high-speed-robotics.aspx</link><pubDate>Mon, 24 Aug 2009 23:00:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:386479</guid><dc:creator>Maxim</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/maxim/rsscomments.aspx?PostID=386479</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/maxim/commentapi.aspx?PostID=386479</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/maxim/archive/2009/08/25/high-speed-robotics.aspx#comments</comments><description>&lt;p&gt;Interesting video about “High-Speed Robot Hand”:&lt;/p&gt;  &lt;p&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/-KxjVlaLBmk&amp;amp;hl=en&amp;amp;fs=1&amp;amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/-KxjVlaLBmk&amp;amp;hl=en&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;I got some spooky feeling that our (humans’) &lt;a title="The Terminator" href="http://en.wikipedia.org/wiki/The_Terminator" target="_blank"&gt;doom-day&lt;/a&gt; is getting closer.&lt;/em&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:dba76ebf-8019-4de2-a409-22827d6f7385" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Media" rel="tag"&gt;Media&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Video" rel="tag"&gt;Video&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Youtube" rel="tag"&gt;Youtube&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=386479" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Film/default.aspx">Film</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Video/default.aspx">Video</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Machine/default.aspx">Machine</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Education/default.aspx">Education</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Robotics/default.aspx">Robotics</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/OFFTOPIC/default.aspx">OFFTOPIC</category></item><item><title>מי שמצביע – משפיע!</title><link>http://blogs.microsoft.co.il/blogs/maxim/archive/2009/08/19/IDCC-2009.aspx</link><pubDate>Wed, 19 Aug 2009 21:00:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:382505</guid><dc:creator>Maxim</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/maxim/rsscomments.aspx?PostID=382505</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/maxim/commentapi.aspx?PostID=382505</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/maxim/archive/2009/08/19/IDCC-2009.aspx#comments</comments><description>&lt;div dir="rtl" align="right"&gt;
&lt;p&gt;&lt;a title="IDCC" href="http://www.idcc.co.il/"&gt;&lt;img style="BORDER-BOTTOM:0px;BORDER-LEFT:0px;DISPLAY:inline;BORDER-TOP:0px;BORDER-RIGHT:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/maxim/image_499D4193.png" width="508" height="60" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;הנכם מוזמנים &lt;a title="הצביעו בעדי :)" href="http://www.idcc.co.il/sessions" target="_blank"&gt;להצביע&lt;/a&gt; &lt;strong&gt;בעד&lt;/strong&gt; &lt;a title="ההרצאות שלי" href="http://www.idcc.co.il/people/10018" target="_blank"&gt;ההרצאות שלי&lt;/a&gt; באתר של כנס המפתחים שאמור להתקיים ב- &lt;a title="עקבו אחרי העדכונים" href="http://www.idcc.co.il/keepintouch" target="_blank"&gt;14/09/2009&lt;/a&gt; במשרדי מיקרוסופט &lt;a title="מפה" href="http://maps.google.com/maps?f=q&amp;amp;source=s_q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=13+Shenkar+st.,+Herzeliya,+Israel&amp;amp;sll=32.160918,34.812241&amp;amp;sspn=0.00881,0.019312&amp;amp;ie=UTF8&amp;amp;ll=32.160555,34.811769&amp;amp;spn=0.00881,0.019312&amp;amp;z=16" target="_blank"&gt;ברח’ שנקר 13 בהרצליה&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a title="הצעות שלי" href="http://www.idcc.co.il/people/10018" target="_blank"&gt;פרסמתי&lt;/a&gt; הצעה לשתי הרצאות מעניינות העוסקות בתחום פיתוח UI. שתיהן מאוד פרקטיות, ללא שווק, הכל תכלס, הכל מצד המפתח ועם כמה שיותר דוגמאות קוד.&lt;/p&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ההרצאה הראשונה הנה בנושא: &lt;/strong&gt;&lt;a title="תלת ממד בסילבלייט" href="http://www.idcc.co.il/sessions/3d-in-silverlight" target="_blank"&gt;&lt;strong&gt;“3D in Silverlight” או “תלת מימד בסילברלייט”&lt;/strong&gt;&lt;a title="Silverlight Website" href="http://silverlight.net/" target="_blank"&gt;&lt;img style="BORDER-RIGHT-WIDTH:0px;MARGIN:0px 10px 10px 5px;DISPLAY:inline;BORDER-TOP-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-LEFT-WIDTH:0px;" border="0" align="left" src="http://www.digitaldrug.us/blog/images/silverlightLogo.png" width="96" height="93" alt="" /&gt;&lt;/a&gt;&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;בהרצאה זו אני הולך לדון בנושא של &lt;a title="wiki" href="http://en.wikipedia.org/wiki/Rich_Internet_application" target="_blank"&gt;Rich Client Application for Internet&lt;/a&gt; עם שילוב של יכולות תלת ממד. נכון להיום, סילברלייט עדיין לא תומך באופן מלא בסצינות/אובייקטים תלת ממדים כמו WPF. בהרצאה אציג את ה&lt;a title="פוסט שלי בנושא" href="http://blogs.microsoft.co.il/blogs/maxim/archive/2009/05/15/3d-library-for-silverlight.aspx" target="_blank"&gt;ספריה Kit3D&lt;/a&gt; (קוד פתוח) כחלופה האפשרית לתצוגה של סצנות עם אובייקטים תלת ממדיים בשיטה הדומה ל- WPF. אציג מספר דוגמאות שממשות תלת ממד אמיתי בסילברלייט. כמו כן, אציג את היכולות של גרפיקה תלת ממדית בטכנולוגיה המתחרה של סילברלייט – &lt;a href="http://www.adobe.com/devnet/flash/articles/3d_support.html" target="_blank"&gt;Adobe Flash&lt;/a&gt; (גם פלאש עדיין לא תומך באופן מלא בתלת מימד). יכולות גרפיות לרידור אובקייטים תלת ממדיים פותחות אינסוף אפשרויות בפני המפתחים: משחקי תלת ממד מבוססי סילברלייט, סימולטורים, גראפים ועוד.&lt;/p&gt;
&lt;p&gt;לחצו על תמונה הבאה על מנת לראות דוגמא למימוש של קוביה הונגרית תלת ממדית עם טקסטרות וידאו:&lt;/p&gt;
&lt;p&gt;&lt;a title="דף של הדוגמא" href="http://sildev.net/3DCubes/index.html" target="_blank"&gt;&lt;img style="BORDER-RIGHT-WIDTH:0px;BORDER-TOP-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-LEFT-WIDTH:0px;" border="0" src="http://blogs.microsoft.co.il/blogs/maxim/image_78BD51C4.png" alt="" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;לחצו על התמונה על מנת לראות דוגמא ל- &lt;a title="wiki" href="http://en.wikipedia.org/wiki/Mockup" target="_blank"&gt;Mockup&lt;/a&gt; של סימולטור &lt;a href="http://www.segevsystems.tv/netcast/netcasting.html" target="_blank"&gt;Netcasting&lt;/a&gt; של משחקים קבוצתיים כמו כדורגל, כדורסל, כדורעף ועוד (בתוך היישום לחצו על סמל עם מגרש - court):&lt;/p&gt;
&lt;p&gt;&lt;a title="דוגמא לסימולטור" href="http://www.segevsystems.tv/netcast/netcasting.html" target="_blank"&gt;&lt;img style="BORDER-RIGHT-WIDTH:0px;BORDER-TOP-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-LEFT-WIDTH:0px;" border="0" src="http://blogs.microsoft.co.il/blogs/maxim/image_43D84A56.png" alt="" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;em&gt;(ניתן להתשמש ב- Sliders או עכבר לשינוי מיקום המצלמה, סיבוב המגרש ו- Zoom)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;בהרצאה אציג דוגמא נוספת (יותר מתוכמת ועם אנימציות) של יישום תלת ממדי עם אובייקטים מיובאים מתוכנת 3ds Max 2009.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;---&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ההרצאה השניה הנה בנושא: &lt;/strong&gt;&lt;a title="הצעה להרצאה שניה" href="http://www.idcc.co.il/sessions/gui-design-for-dot-net-developers" target="_blank"&gt;&lt;strong&gt;“GUI Design for .Net Developers” או “עיצוב ממשק משתמש למפתחי דוט-נט”&lt;/strong&gt;&lt;/a&gt;&lt;img style="BORDER-RIGHT-WIDTH:0px;MARGIN:0px 10px 10px 5px;DISPLAY:inline;BORDER-TOP-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-LEFT-WIDTH:0px;" border="0" align="left" src="http://blogs.microsoft.co.il/blogs/maxim/design%20sales.png" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;הרצאה זו תעסוק בהיבטים הפרקטיים של עיצוב, פיתוח ותחזוקה של ממשקי משתמש – GUI מהצד של מפתחי הדוט-נט. כמו ההרצאה הראשונה, הרצאה זו הנה מקצועית ודנה במספר פתרונות לבעיות בפיתוח של ממשקי משתמש ע”י אנשים שלא קיבלו השכלה פורמאלית בתחום. יוזכרו כל ה- buzzwords כמו: WPF, Silverlight, CAB, WinForms מגרסאות 2.0, 3.0 ו- 3.5. יוצגו דוגמאות של תהליכי עבודה, דוגמאות קוד, ממשקים לדוגמא (טובים, גרועים וסקסיים). אדבר על הקשיים של עיצוב ממשקים ללא התערבות של גורמים כמו גראפיקאים, יועצים, מנגישים, ארגומומים ויתר האנשים שנושמים את UI על בסיס יומי. אדבר על המפתחים שעוסקים ב- GUI לפי דרישות התפקיד ועל הבעיות הנפוצות שהם נתקלים בהן, כמו כן אציע מספר פתרונות יצירתיים לבעיות אלו. אני מכיר המון פרויקטים בתחום התוכנה שבהם אחד המרכיבים בהצלחה או כישלון הפרויקט הנו UI. &lt;br /&gt;בנוסף, אדבר על השיקולים בבחירת טכנולוגיה ל- GUI, אציג מספר דוגמאות לבחירה ומימוש מוצלחים (ופחות) של טכנולוגיה עם דגמאות. כמו למשל ההתלבטות בבחירה בין WPF ל- WinForms לאפליקציות בנקאיות/פיננסיות מרובות טפסים עם התממשקות למערכות חיצוניות שונות. אדבר על דרכים לחיסכון בבניה של פקדים ועל הספריות Open Source החנמיות ל- GUI. גם פה הרוב יהיה עם קוד, בלי שווק, הכל תכלס, הכל ממבט של מפתח דוט-נט.&lt;/p&gt;
&lt;p&gt;ראו תצלום מסך של GUI מתוך אפליקציה “Media Manager” שפיתחתי ב- WPF עובר “&lt;a title="אתר החברה" href="http://www.segevsystems.tv/" target="_blank"&gt;שגב מערכות&lt;/a&gt;” (אציג כדוגמא בהרצאה):&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/maxim/MediaManagerSearchResults_3F1C6D73.png" target="_blank"&gt;&lt;img style="BORDER-RIGHT-WIDTH:0px;DISPLAY:inline;BORDER-TOP-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-LEFT-WIDTH:0px;" title="Media Manager Search Results" border="0" alt="Media Manager Search Results" src="http://blogs.microsoft.co.il/blogs/maxim/MediaManagerSearchResults_thumb_6451DB7B.png" width="644" height="484" /&gt;&lt;/a&gt;&amp;nbsp; &lt;br /&gt;(לחצו על התמונה להגדלה)&lt;/p&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;p&gt;&lt;a title="Vote for Me :)" href="http://www.idcc.co.il/people/10018" target="_blank"&gt;&lt;img style="BORDER-RIGHT-WIDTH:0px;MARGIN:0px 10px 5px 5px;DISPLAY:inline;BORDER-TOP-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-LEFT-WIDTH:0px;" border="0" align="left" src="http://www.bis.org.il/files/barilan/page_pics/elections.bmp" width="128" height="128" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;font color="#0000ff"&gt;לדעתי החומר המוצע מאוד מעניין. מקווה שתצביעו ותשפיעו &lt;em&gt;;-)&lt;/em&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;font color="#c0c0c0" size="1"&gt;הערות: כל הזכויות שמורות, כל שימוש בחומר ההרצאה מותנה באישור שלי, כל התכנים ומשאבים שיהיו בשימוש בכנס יהיו בהסכמה של היוצרים. אינני אחראי לנזקים כלשהם שיכולים להגרם לגורמים המעורבים.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&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:4855101b-9018-4acb-bbd2-4c0d4d1ba3e6" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/GUI" rel="tag"&gt;GUI&lt;/a&gt;,&lt;a href="http://technorati.com/tags/UI" rel="tag"&gt;UI&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Winforms+2.0" rel="tag"&gt;Winforms 2.0&lt;/a&gt;,&lt;a href="http://technorati.com/tags/WPF" rel="tag"&gt;WPF&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Silverlight" rel="tag"&gt;Silverlight&lt;/a&gt;,&lt;a href="http://technorati.com/tags/3D" rel="tag"&gt;3D&lt;/a&gt;,&lt;a href="http://technorati.com/tags/.Net" rel="tag"&gt;.Net&lt;/a&gt;,&lt;a href="http://technorati.com/tags/IDCC" rel="tag"&gt;IDCC&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=382505" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Win-Forms/default.aspx">Win-Forms</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/GUI/default.aspx">GUI</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/.Net/default.aspx">.Net</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/UI/default.aspx">UI</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Education/default.aspx">Education</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/MS+Framework+3.0/default.aspx">MS Framework 3.0</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Software+Developement+Methods/default.aspx">Software Developement Methods</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Reusable+Components/default.aspx">Reusable Components</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/MS+Framework+3.5/default.aspx">MS Framework 3.5</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/UX/default.aspx">UX</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/_DC05D905D905D105D105DC05D505D205D905E005D205_/default.aspx">לייבבלוגינג</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Dysplay+Technologies/default.aspx">Dysplay Technologies</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/_E205D105E805D905EA05_/default.aspx">עברית</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/TECH/default.aspx">TECH</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/OFFTOPIC/default.aspx">OFFTOPIC</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Flash/default.aspx">Flash</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Open+Source/default.aspx">Open Source</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Kit3D/default.aspx">Kit3D</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/IDCC/default.aspx">IDCC</category></item><item><title>דרוש מתכנת דוט-נט למשרה מלאה</title><link>http://blogs.microsoft.co.il/blogs/maxim/archive/2009/08/09/wanted-dot-net-programmer.aspx</link><pubDate>Sun, 09 Aug 2009 16:30:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:376810</guid><dc:creator>Maxim</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/maxim/rsscomments.aspx?PostID=376810</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/maxim/commentapi.aspx?PostID=376810</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/maxim/archive/2009/08/09/wanted-dot-net-programmer.aspx#comments</comments><description>&lt;p dir="rtl" align="right"&gt;&lt;font color="#000000" size="2"&gt;&lt;a title="Segev Systems Website" href="http://www.segevsystems.tv/"&gt;&lt;img style="BORDER-RIGHT-WIDTH:0px;DISPLAY:inline;BORDER-TOP-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;MARGIN-LEFT:0px;BORDER-LEFT-WIDTH:0px;MARGIN-RIGHT:0px;" title="img_frm_back_top_logo" border="0" alt="img_frm_back_top_logo" align="right" src="http://blogs.microsoft.co.il/blogs/maxim/img_frm_back_top_logo_thumb_47F667CE.png" width="219" height="33" /&gt;&lt;/a&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr /&gt;

&lt;p dir="rtl" align="right"&gt;&lt;font size="2"&gt;&lt;strong&gt;לחברה דינאמית וצעירה דרוש/ה מתכנת/ת לעבודה במשרה מלאה&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p dir="rtl" align="right"&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p dir="rtl" align="right"&gt;&lt;u&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p dir="rtl" align="right"&gt;&lt;u&gt;&lt;font size="2"&gt;דרישות התפקיד:&lt;br /&gt;&lt;/font&gt;&lt;/u&gt;&lt;font size="2"&gt;שליטה בסביבת פיתוח 2.0 .Net – חובה &lt;br /&gt;&lt;/font&gt;&lt;font size="2"&gt;שליטה בשפת תכנות #C – חובה &lt;br /&gt;&lt;/font&gt;&lt;font size="2"&gt;ניסיון מעשי ב- WinForms 2.0 – חובה&lt;/font&gt;&lt;/p&gt;
&lt;p dir="rtl" align="right"&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p dir="rtl" align="right"&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p dir="rtl" align="right"&gt;&lt;u&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p dir="rtl" align="right"&gt;&lt;u&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p dir="rtl" align="right"&gt;&lt;u&gt;&lt;font size="2"&gt;הערות:&lt;br /&gt;&lt;/font&gt;&lt;/u&gt;&lt;font size="2"&gt;היכרות עם שרת MS SQL 2005/8 – יתרון &lt;br /&gt;&lt;/font&gt;&lt;font size="2"&gt;הכרות עם שפת VB.Net – יתרון &lt;br /&gt;&lt;/font&gt;&lt;font size="2"&gt;הכרות עם סביבות פיתוח .Net 3.0/3.5 – יתרון &lt;br /&gt;&lt;/font&gt;&lt;font size="2"&gt;יכולת למידה/עבודה עצמאית – יתרון &lt;/font&gt;&lt;/p&gt;
&lt;p dir="rtl" align="right"&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p dir="rtl" align="right"&gt;&lt;font size="2"&gt;נא לשלוח קו&amp;quot;ח לדוא&amp;quot;ל: &lt;/font&gt;&lt;a href="mailto:avshi@segevsystems.tv?subject=Dot-Net%20Programmer%20Wanted"&gt;&lt;font color="#000000" size="2"&gt;avshi@segevsystems.tv&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div dir="rtl" align="right"&gt;&lt;font size="2"&gt;
&lt;hr /&gt;
&lt;/font&gt;&lt;font size="2"&gt;&lt;br /&gt;העבודה מעניינת, באווירה כפרית של קיבוץ “&lt;a title="אתר הקיבוץ" href="http://www.glil-yam.org.il/"&gt;גליל ים&lt;/a&gt;” הנמצא במרכז הרצליה. &lt;br /&gt;פרטים על החברה ניתן למצוא באתר: &lt;/font&gt;&lt;a href="http://www.segevsystems.tv/"&gt;&lt;font color="#000000" size="2"&gt;http://www.segevsystems.tv&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt;.&lt;/font&gt; 
&lt;p align="right"&gt;&lt;font size="2"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=376810" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/.Net/default.aspx">.Net</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/VB.Net/default.aspx">VB.Net</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/MS+Framework+3.0/default.aspx">MS Framework 3.0</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/MS+Framework+3.5/default.aspx">MS Framework 3.5</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/_E205D105E805D905EA05_/default.aspx">עברית</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Segev+Systems+Ltd/default.aspx">Segev Systems Ltd</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/TECH/default.aspx">TECH</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/OFFTOPIC/default.aspx">OFFTOPIC</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/.Net+2.0/default.aspx">.Net 2.0</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Winforms+2.0/default.aspx">Winforms 2.0</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/_E205D105D505D305D405_/default.aspx">עבודה</category></item><item><title>The REAL Human Interface :)</title><link>http://blogs.microsoft.co.il/blogs/maxim/archive/2009/05/26/the-real-human-interface.aspx</link><pubDate>Mon, 25 May 2009 21:00:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:306826</guid><dc:creator>Maxim</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/maxim/rsscomments.aspx?PostID=306826</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/maxim/commentapi.aspx?PostID=306826</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/maxim/archive/2009/05/26/the-real-human-interface.aspx#comments</comments><description>Some cool video about HI......(&lt;a href="http://blogs.microsoft.co.il/blogs/maxim/archive/2009/05/26/the-real-human-interface.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=306826" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/GUI/default.aspx">GUI</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Film/default.aspx">Film</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Video/default.aspx">Video</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/UI/default.aspx">UI</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Machine/default.aspx">Machine</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Man/default.aspx">Man</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Media/default.aspx">Media</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Computers/default.aspx">Computers</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Human+Factors/default.aspx">Human Factors</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Fun/default.aspx">Fun</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/UX/default.aspx">UX</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Multi-Touch+Surface/default.aspx">Multi-Touch Surface</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Display+Technologies/default.aspx">Display Technologies</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/OFFTOPIC/default.aspx">OFFTOPIC</category></item><item><title>Daily Tip: How to import 3D model to WPF in couple clicks</title><link>http://blogs.microsoft.co.il/blogs/maxim/archive/2009/05/24/daily-tip-how-to-import-3d-model-to-wpf-in-couple-clicks.aspx</link><pubDate>Sun, 24 May 2009 06:00:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:303309</guid><dc:creator>Maxim</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/maxim/rsscomments.aspx?PostID=303309</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/maxim/commentapi.aspx?PostID=303309</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/maxim/archive/2009/05/24/daily-tip-how-to-import-3d-model-to-wpf-in-couple-clicks.aspx#comments</comments><description>Many 3D editors can export 3D scenes as OBJ files, these files can be easily imported into WPF project and being used to build complex 3D scenes. See how easy to import 3D scene from 3D editors....(&lt;a href="http://blogs.microsoft.co.il/blogs/maxim/archive/2009/05/24/daily-tip-how-to-import-3d-model-to-wpf-in-couple-clicks.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=303309" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/GUI/default.aspx">GUI</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/.Net/default.aspx">.Net</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/UI/default.aspx">UI</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/MS+Framework+3.0/default.aspx">MS Framework 3.0</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Code+Example/default.aspx">Code Example</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Daily+Tip/default.aspx">Daily Tip</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/MS+Framework+3.5/default.aspx">MS Framework 3.5</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Display+Technologies/default.aspx">Display Technologies</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/XAML/default.aspx">XAML</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/MS+Blend+2.0/default.aspx">MS Blend 2.0</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Blender/default.aspx">Blender</category></item><item><title>3D Library for Silverlight</title><link>http://blogs.microsoft.co.il/blogs/maxim/archive/2009/05/15/3d-library-for-silverlight.aspx</link><pubDate>Fri, 15 May 2009 16:30:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:292782</guid><dc:creator>Maxim</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/maxim/rsscomments.aspx?PostID=292782</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/maxim/commentapi.aspx?PostID=292782</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/maxim/archive/2009/05/15/3d-library-for-silverlight.aspx#comments</comments><description>&lt;p&gt;Silverlight is great technology with powerful graphic capabilities, allows us to build &lt;a title="Rich-Internet Application" href="http://en.wikipedia.org/wiki/Rich_Internet_application" target="_blank"&gt;RIA&lt;/a&gt;s with animated 2D graphics, scalable controls, media playback, uses GPU acceleration, and much more. The Silverlight application can be developed in same environment as WPF (&lt;a href="http://www.microsoft.com/Expression/products/Overview.aspx?key=blend" target="_blank"&gt;Blend&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Microsoft_Visual_Studio" target="_blank"&gt;Visual Studio&lt;/a&gt;, etc), has common principles of design as WPF (XAML, Namespaces, Syntax, etc). But, still it is different and targeted for cross-platform rich-client internet applications, the project from WPF can’t be ported easily to Silverlight (I’ll not open a discussion about why we &lt;a href="http://stackoverflow.com/questions/212111/convert-wpf-application-to-silverlight" target="_blank"&gt;can’t easily convert&lt;/a&gt; projects from WPF to Silverlight). I like both technologies, and mostly the 3D graphic capabilities of WPF, that is still missing in Silverlight (the 3rd version will contain &lt;a href="http://www.silverlightshow.net/items/Perspective-3D-in-Silverlight-3.aspx" target="_blank"&gt;3D transformations&lt;/a&gt;, but is still far away from &lt;a href="http://blogs.microsoft.co.il/blogs/maxim/archive/2008/01/19/wpf-windows-presentation-foundation.aspx" target="_blank"&gt;3D capabilities of WPF&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;I want to present cool library for Silverlight - “&lt;a title="Project Page on Codeplex" href="http://kit3d.codeplex.com/" target="_blank"&gt;&lt;strong&gt;&lt;font size="3"&gt;Kit3D&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;”, that allows presentation of 3D scenes (almost like in WPF).&lt;/p&gt;  &lt;p&gt;From &lt;a title="Kit3D" href="http://kit3d.codeplex.com" target="_blank"&gt;project’s homepage&lt;/a&gt;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;&lt;font color="#808080" size="2"&gt;Kit3D is a 3D graphics engine for Microsoft Silverlight. There is a JavaScript version that runs on the 1.0 bits of Silverlight, however moving forward the engine will only be actively developed in C#. The library has been refactored to match the System.Windows.Media.Media3D namespace from WPF so that it closely matches development for WPF3D syntax.          &lt;br /&gt;For some examples of the library in action, see &lt;/font&gt;&lt;/em&gt;&lt;a href="http://www.markdawson.org/Kit3D"&gt;&lt;em&gt;&lt;font color="#808080" size="2"&gt;http://www.markdawson.org/Kit3D&lt;/font&gt;&lt;/em&gt;&lt;/a&gt;&lt;em&gt;&lt;font color="#808080" size="2"&gt;.          &lt;br /&gt;PROJECT STATUS:           &lt;br /&gt;- This project is still very early on in its lifecycle, the following areas are where energy will be focused in the future:           &lt;br /&gt;- Bug fixes &amp;amp; Unit Testing - currently no unit tests for the SL code, I need to look into how to use the Silverlight unit testing framework, since unit testing frameworks like xUnit, nUnit cannot be used.           &lt;br /&gt;- View frustum culling - stops models that go outside the visible area of the viewport from causing rendering artifacts. Right now if you move models around outside of the visible screen space you may see visual artifacts flash on the screen as objects go behind the camera. This feature will also help improve performance for a large number of models.           &lt;br /&gt;- Implement more WPF3D features           &lt;br /&gt;DEVELOPMENT REQUIREMENTS:           &lt;br /&gt;- You will need a full version of Visual Studio to be able to compile the source code, since the Express versions of Visual Studio do not yet support the Silverlight Tools install.           &lt;br /&gt;- Need to install the Silverlight 2 dev tools from &lt;/font&gt;&lt;/em&gt;&lt;a title="www.silverlight.net" href="http://www.silverlight.net" target="_blank"&gt;&lt;em&gt;&lt;font color="#808080" size="2"&gt;www.silverlight.net&lt;/font&gt;&lt;/em&gt;&lt;/a&gt;       &lt;br /&gt;&lt;em&gt;&lt;font color="#808080" size="2"&gt;FUTURE DIRECTION:          &lt;br /&gt;Right now this project is focused on getting the core 3D engine up to scratch, however the longer term aim is to build on-top of the library with higher level constructs so that when Silverlight does release native 3D at some point in the future this library will still have value on-top of that.           &lt;br /&gt;PEOPLE USING KIT3D:           &lt;br /&gt;This is really cool - check out the video running on the cubes, also if you click on some of the cubes the layers rotate, awesome: &lt;/font&gt;&lt;/em&gt;&lt;a href="http://sildev.net/3DCubes/index.html"&gt;&lt;em&gt;&lt;font color="#808080" size="2"&gt;http://sildev.net/3DCubes/index.html&lt;/font&gt;&lt;/em&gt;&lt;/a&gt;&lt;em&gt;&lt;font color="#808080" size="2"&gt;.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Some cool samples by &lt;a title="Sildev Website" href="http://sildev.net" target="_blank"&gt;Sildev&lt;/a&gt; (the images are clickable):&lt;/p&gt;  &lt;p&gt;&lt;a title="3D Monkey" href="http://sildev.net/3DDemo/" target="_blank"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="3D Monkey" border="0" alt="3D Monkey" src="http://blogs.microsoft.co.il/blogs/maxim/image_64D3E4FB.png" width="294" height="202" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a title="3D Cube with Video Texture" href="http://sildev.net/3DCubes/index.html" target="_blank"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="3D Cube with Video Texture" border="0" alt="3D Cube with Video Texture" src="http://blogs.microsoft.co.il/blogs/maxim/image_78BD51C4.png" width="294" height="211" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a title="Animated 3D Scene" href="http://sildev.net/demos/ademo.html" target="_blank"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Animated 3D Scene" border="0" alt="Animated 3D Scene" src="http://blogs.microsoft.co.il/blogs/maxim/image_41471AC9.png" width="294" height="229" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Summary: Current (alpha) version of “Kit3D” doesn’t support the XAML code, doesn’t have all 3D features that are available in WPF; the 3D meshes are translated to collection of 2D polygons that are rendered by Silverlight without using GPU acceleration (as WPF does). The “Kit3D” is nascent and will be improved in future, until Microsoft will add “Real” 3D support.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/maxim/image_5EA94608.png" target="_blank"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Silverlight Spy Snapshot" border="0" alt="Silverlight Spy Snapshot" src="http://blogs.microsoft.co.il/blogs/maxim/image_thumb_149A4CF1.png" width="545" height="484" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;As we can see in this snapshot, the &lt;a title="Textured 3D Tiger" href="http://www.markdawson.org/kit3d/demos/sl2/tigertexture/testpage.html"&gt;3D Tiger&lt;/a&gt; is made from many polygons that are interpolated (transformed) in real-time by Silverlight render engine (see this &lt;a title="Kit3D examples" href="http://www.markdawson.org/Kit3D/"&gt;link with some 3D examples&lt;/a&gt;). &lt;em&gt;&lt;font color="#808080" size="1"&gt;[The snapshot was taken from “&lt;/font&gt;&lt;a title="Silverlight Spy" href="http://silverlightspy.com/silverlightspy/download-silverlight-spy/"&gt;&lt;font color="#808080" size="1"&gt;Silverlight Spy&lt;/font&gt;&lt;/a&gt;&lt;font color="#808080" size="1"&gt;” application]&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;The Kit3D is cool library that allows creation of 3D scenes in same way as I do it in WPF, see &lt;a href="http://www.segevsystems.tv/test/handball/" target="_blank"&gt;here&lt;/a&gt; my 3D model for Handball court that will be used for online game simulation in real-time (net casting), see &lt;a title="netcasting" href="http://www.segevsystems.tv/netcast/netcasting.html" target="_blank"&gt;here&lt;/a&gt; the mock-up for future application.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;font color="#808080" size="1"&gt;[use sliders or mouse to move/rotate/scale the court]&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="netcasting" href="http://www.segevsystems.tv/netcast/netcasting.html" target="_blank"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="netcasting" border="0" alt="netcasting" src="http://blogs.microsoft.co.il/blogs/maxim/image_43D84A56.png" width="364" height="230" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;font color="#808080"&gt;PS        &lt;br /&gt;I’m writing some post about how to use this great library…&lt;/font&gt;&lt;/em&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:846deee5-63cf-4775-900f-8195cf4fc395" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/UI" rel="tag"&gt;UI&lt;/a&gt;,&lt;a href="http://technorati.com/tags/GUI" rel="tag"&gt;GUI&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Silverlight" rel="tag"&gt;Silverlight&lt;/a&gt;,&lt;a href="http://technorati.com/tags/WPF" rel="tag"&gt;WPF&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Kit3D" rel="tag"&gt;Kit3D&lt;/a&gt;,&lt;a href="http://technorati.com/tags/.Net" rel="tag"&gt;.Net&lt;/a&gt;,&lt;a href="http://technorati.com/tags/3D" rel="tag"&gt;3D&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Render+Engine" rel="tag"&gt;Render Engine&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=292782" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/GUI/default.aspx">GUI</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/.Net/default.aspx">.Net</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/UI/default.aspx">UI</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Render+Engine/default.aspx">Render Engine</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/MS+Framework+3.0/default.aspx">MS Framework 3.0</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/MS+Visual+Studio+2008/default.aspx">MS Visual Studio 2008</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/MS+Framework+3.5/default.aspx">MS Framework 3.5</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/UX/default.aspx">UX</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Dysplay+Technologies/default.aspx">Dysplay Technologies</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/XAML/default.aspx">XAML</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/MS+Blend+2.0/default.aspx">MS Blend 2.0</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Kit3D/default.aspx">Kit3D</category></item><item><title>Daily Tip: How to import 3D model to WPF from Blender</title><link>http://blogs.microsoft.co.il/blogs/maxim/archive/2009/05/05/daily-tip-how-to-import-3d-model-to-wpf-from-blender.aspx</link><pubDate>Mon, 04 May 2009 21:45:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:282644</guid><dc:creator>Maxim</dc:creator><slash:comments>14</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/maxim/rsscomments.aspx?PostID=282644</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/maxim/commentapi.aspx?PostID=282644</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/maxim/archive/2009/05/05/daily-tip-how-to-import-3d-model-to-wpf-from-blender.aspx#comments</comments><description>&lt;p&gt;In resumption to my previous post “&lt;a href="http://blogs.microsoft.co.il/blogs/maxim/archive/2009/03/31/daily-tip-how-to-import-3d-model-to-wpf-from-3d-max.aspx"&gt;How to import 3D model to WPF from 3D Max&lt;/a&gt;” I want to present the “&lt;a title="XAML exporter for Blender" href="http://xamlexporter.codeplex.com" target="_blank"&gt;&lt;strong&gt;XAML exporter for Blender&lt;/strong&gt;&lt;/a&gt;” (&lt;a title="Blender.org" href="http://www.blender.org" target="_blank"&gt;Blender&lt;/a&gt; is an open-source cross-platform 3D designer).&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font color="#808080"&gt;if(Blender.Name == Blend.Name)       &lt;br /&gt;{        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Debug.WriteLine(“Wiiiiii !!!! :)”);        &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This post will guide you how to use this feature thru simple example.&lt;/p&gt;  &lt;p&gt;Software requirements for this guide: &lt;a title="Download Blender..." href="http://www.blender.org/download/get-blender/" target="_blank"&gt;Blender 2.48a&lt;/a&gt; or later, &lt;a href="http://www.microsoft.com/expression/products/Overview.aspx?key=blend"&gt;Microsoft Expression Blend 2.0&lt;/a&gt; (Final Release).     &lt;br /&gt;SDK and Framework requirements: &lt;a href="http://msdn.microsoft.com/en-us/netframework/default.aspx"&gt;Microsoft .Net 3.0 or 3.5&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Let’s start:&lt;/p&gt;  &lt;p&gt;(1) Download ZIP File from &lt;a title="Released on 2009-03-30" href="http://xamlexporter.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=25481" target="_blank"&gt;here&lt;/a&gt; and extract it into “&lt;font color="#0080c0"&gt;[X]:\[*Blender*]\.blender\scripts&lt;/font&gt;” directory on your hard drive (to apply changes, you have to restart Blender, if you’ve copied file when it was open).&lt;/p&gt;  &lt;p&gt;(2) Open/create scene with 3D objects in Blender. Select objects for exports and press on “File” menu.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/maxim/image_470BDCCA.png" width="608" height="507" /&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160; (3) Go to “Export” sub-menu and click on “Xaml (.xaml)…”.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/maxim/image_747CD6C0.png" width="616" height="508" /&gt; &lt;/p&gt;  &lt;p&gt; (4) Enter file path for export and press on “Export Xaml” button.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/maxim/image_46EB9130.png" width="614" height="512" /&gt; &lt;/p&gt;  &lt;p&gt; (5) Open created “xaml” file in any text editor (I prefer free “&lt;a title="Project&amp;#39;s Website" href="http://notepad-plus.sourceforge.net/uk/site.htm" target="_blank"&gt;Notepad++&lt;/a&gt;”).&lt;/p&gt; &lt;em&gt;&lt;/em&gt;  &lt;p&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/maxim/image_5990651A.png" width="669" height="532" /&gt; &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;As we can see it contains 3D models under “&lt;/em&gt;&lt;a title="MSDN" href="http://msdn.microsoft.com/en-us/library/system.windows.media.media3d.model3dgroup.aspx" target="_blank"&gt;&lt;em&gt;Model3DGroup&lt;/em&gt;&lt;/a&gt;&lt;em&gt;”, each model has definitions for “Geometry”, “&lt;strong&gt;*&lt;/strong&gt;Material”, “&lt;strong&gt;*&lt;/strong&gt;Back Material” and “&lt;strong&gt;*&lt;/strong&gt;Transform” (&lt;strong&gt;*&lt;/strong&gt; –&amp;gt; means that these are optional and depend on 3D object properties in Blender’s scene).&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;(6) Create/open WPF project in Blend.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/maxim/image_19B658C8.png" width="498" height="325" /&gt;&lt;/p&gt;  &lt;p&gt;(7) Add item “Resource Dictionary” to project-tree.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/maxim/image_5E164A07.png" width="495" height="380" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/maxim/image_17F56727.png" width="427" height="282" /&gt; &lt;/p&gt;  &lt;p&gt;(8) Open created dictionary (XAML view), Copy-Paste XAML code from exported file into dictionary. &lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/maxim/image_4EEF4560.png" width="665" height="388" /&gt; &lt;/p&gt;  &lt;p&gt;(9) The pasted “Model3DGroup” is an item in dictionary, all items must have Key-Name; add “x:Key=”modelGrp”” and remove “x:Name=”…”” tags from all nodes (dictionary cannot contain definitions with this tag). Save file and rebuild project [Ctrl]+[Shift]+[B].&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160; &lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/maxim/image_2955A232.png" width="661" height="477" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;(10) Open “Window1.xaml” in Blend editor (Design or Spitted view), go to “Resources” tab and links saved dictionary file to opened window (right-click on Window item to open context menu).&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/maxim/image_69E7C8D4.png" width="349" height="331" /&gt; &lt;/p&gt;  &lt;p&gt;(11) Add 3D objects into main grid: “&lt;a title="MSDN" href="http://msdn.microsoft.com/en-us/library/system.windows.controls.viewport3d.aspx" target="_blank"&gt;ViewPort3D&lt;/a&gt;” with “&lt;a title="MSDN" href="http://msdn.microsoft.com/en-us/library/system.windows.media.media3d.orthographiccamera.aspx" target="_blank"&gt;OrthographicCamera&lt;/a&gt;” + two 3D models (“&lt;a title="MSDN" href="http://msdn.microsoft.com/en-us/library/system.windows.media.media3d.modelvisual3d.aspx" target="_blank"&gt;ModelVisual3D&lt;/a&gt;”), one for “&lt;a title="MSDN" href="http://msdn.microsoft.com/en-us/library/system.windows.media.media3d.directionallight.aspx" target="_blank"&gt;DirectionalLight&lt;/a&gt;” and another for our 3D objects from Blender (exported XAML contains “Model3DGroup” that can be used for 3D model content in WPF).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/maxim/image_54A99D5F.png" target="_blank"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/maxim/image_thumb_1F20B56D.png" width="684" height="435" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;(12) Select 3D model object that was prepared to contain exported objects, go to “Properties” tab –&amp;gt; “Miscellaneous” –&amp;gt; “Content” and attach to local resource “modelGrp” (linked to dictionary).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/maxim/image_46875C0A.png" target="_blank"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/maxim/image_thumb_45329D5E.png" width="687" height="500" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;After attachment we’ll see the result (maybe it will require some adjustments):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/maxim/image_7B43EFE0.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/maxim/image_thumb_271443D0.png" width="408" height="304" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;(13) Use object “Properties”&amp;#160; tab to fix/adjust scene parameters/objects.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/maxim/image_7E292EC6.png" width="649" height="592" /&gt; &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;Many times we’ll prefer to adjust camera’s properties&amp;#160; (it is much easier then changing/transforming 3D models). Also, we can “play” with light properties.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;(14) Run [F5] project to see final result.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/maxim/image_19FA1825.png" width="493" height="401" /&gt; &lt;/p&gt;  &lt;p&gt;The example project with code can be downloaded from &lt;a title="Click here to go to download page..." href="http://blogs.microsoft.co.il/files/folders/maxim/entry282641.aspx" target="_blank"&gt;here&lt;/a&gt;&amp;#160;&lt;a href="http://blogs.microsoft.co.il/files/folders/maxim/entry282641.aspx" target="_blank"&gt;&lt;img style="border-bottom:0px;border-left:0px;border-top:0px;border-right:0px;" title="download" border="0" alt="download" src="http://blogs.microsoft.co.il/blogs/maxim/image025_5B3BB0DF.gif" /&gt;&lt;/a&gt; .&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Summary: It is very easy to port 3D models from Blender into XAML, the “&lt;b&gt;&lt;a title="XAML exporter for Blender" href="http://xamlexporter.codeplex.com" target="_blank"&gt;XAML exporter for Blender&lt;/a&gt;&lt;/b&gt;” is a plug-in (script file written in &lt;a title="Python in Blender..." href="http://wiki.blender.org/index.php/Extensions:Py/Scripts" target="_blank"&gt;Python&lt;/a&gt;) that converts complex scene parameters (e.g.: mesh points, texture coordinates, etc) into readable XAML file, it isn’t perfect and has some minor bugs and hopefully will be fixed in future.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;&lt;font color="#c0c0c0"&gt;PS         &lt;br /&gt;I’m not responsible for any damage that may be caused by using this post or its content. Any materials in this post were provided AS IS without any changes and other meanings.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&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:4f91b17c-f6bc-450e-9829-024a1c7f1f59" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/WPF" rel="tag"&gt;WPF&lt;/a&gt;,&lt;a href="http://technorati.com/tags/XAML" rel="tag"&gt;XAML&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Blend+2.0" rel="tag"&gt;Blend 2.0&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Blender+2.48" rel="tag"&gt;Blender 2.48&lt;/a&gt;,&lt;a href="http://technorati.com/tags/3D" rel="tag"&gt;3D&lt;/a&gt;,&lt;a href="http://technorati.com/tags/UI" rel="tag"&gt;UI&lt;/a&gt;,&lt;a href="http://technorati.com/tags/GUI" rel="tag"&gt;GUI&lt;/a&gt;,&lt;a href="http://technorati.com/tags/.Net+Framework+3.0" rel="tag"&gt;.Net Framework 3.0&lt;/a&gt;,&lt;a href="http://technorati.com/tags/.Net+Framework+3.5" rel="tag"&gt;.Net Framework 3.5&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=282644" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/GUI/default.aspx">GUI</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/.Net/default.aspx">.Net</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/UI/default.aspx">UI</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Render+Engine/default.aspx">Render Engine</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/DirectX/default.aspx">DirectX</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Example/default.aspx">Example</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Education/default.aspx">Education</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/MS+Framework+3.0/default.aspx">MS Framework 3.0</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Code+Example/default.aspx">Code Example</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Designer/default.aspx">Designer</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Daily+Tip/default.aspx">Daily Tip</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/MS+Visual+Studio+2008/default.aspx">MS Visual Studio 2008</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/MS+Framework+3.5/default.aspx">MS Framework 3.5</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Display+Technologies/default.aspx">Display Technologies</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/XAML/default.aspx">XAML</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/MS+Blend+2.0/default.aspx">MS Blend 2.0</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Open+Source/default.aspx">Open Source</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Blender/default.aspx">Blender</category></item><item><title>Keys Notificator</title><link>http://blogs.microsoft.co.il/blogs/maxim/archive/2009/04/26/keys-notificator.aspx</link><pubDate>Sat, 25 Apr 2009 22:30:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:275632</guid><dc:creator>Maxim</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/maxim/rsscomments.aspx?PostID=275632</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/maxim/commentapi.aspx?PostID=275632</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/maxim/archive/2009/04/26/keys-notificator.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/maxim/keys_notificator_logo_180E5F48.png"&gt;&lt;img style="border-right-width:0px;margin:0px 10px 10px 0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="keys_notificator_logo" border="0" alt="keys_notificator_logo" align="left" src="http://blogs.microsoft.co.il/blogs/maxim/keys_notificator_logo_thumb_7FBB452C.png" width="64" height="64" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I’m inviting you to take a part in testing of “&lt;a title="Codeplex Project" href="http://notificator.codeplex.com" target="_blank"&gt;Keys Notificator&lt;/a&gt;”.     &lt;br /&gt;This is small and useful program for keyboard monitoring that can be used to monitor common keys as [Shift], [Ctrl], [Alt], [Caps Lock], [Scroll Lock] and [Num Lock]. Very useful to alert users about change in keyboard layout like language ([Alt] + [Shift] ENG &amp;lt;=&amp;gt; HEB) or capital letters.&lt;/p&gt;  &lt;p&gt;The “&lt;a title="Codeplex Project" href="http://notificator.codeplex.com" target="_blank"&gt;Keys Notificator&lt;/a&gt;” is an open-source project and is a part of my community contribution under &lt;a title="GNU License" href="http://notificator.codeplex.com/license" target="_blank"&gt;GNU General Public License&lt;/a&gt;. The published/released version is “Beta” version that will be improved and extended in future. Any .NET developer can take a part in project development.&lt;/p&gt;  &lt;p&gt;The application binaries (EXE) can be downloaded from &lt;a title="EXE Files" href="http://notificator.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=26637" target="_blank"&gt;here&lt;/a&gt;&amp;#160;&lt;a href="http://notificator.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=26637" target="_blank"&gt;&lt;img style="border-right-width:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" border="0" src="http://blogs.microsoft.co.il/blogs/maxim/image025_5B3BB0DF.gif" alt="" /&gt;&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;The project source code can be downloaded from &lt;a title="Sources" href="http://notificator.codeplex.com/SourceControl/ListDownloadableCommits.aspx" target="_blank"&gt;here&lt;/a&gt; &lt;a href="http://notificator.codeplex.com/SourceControl/ListDownloadableCommits.aspx" target="_blank"&gt;&lt;img style="border-right-width:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" border="0" src="http://blogs.microsoft.co.il/blogs/maxim/image025_5B3BB0DF.gif" alt="" /&gt;&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;font color="#000080" size="2"&gt;(I’m planning to write detailed and more technological post about the project in near future)&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Thanks :)&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;font color="#808080" size="1"&gt;&lt;em&gt;PS        &lt;br /&gt;I’m not responsible for any damage that may be caused by using this post or its content. Any materials in this post were provided AS IS without any changes and other meanings.        &lt;br /&gt;&lt;/em&gt;&lt;/font&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:b4116968-5041-4ae6-990a-a130acea1c12" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/DEV" rel="tag"&gt;DEV&lt;/a&gt;,&lt;a href="http://technorati.com/tags/TECH" rel="tag"&gt;TECH&lt;/a&gt;,&lt;a href="http://technorati.com/tags/.Net+2.0" rel="tag"&gt;.Net 2.0&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Winforms+2.0" rel="tag"&gt;Winforms 2.0&lt;/a&gt;,&lt;a href="http://technorati.com/tags/VB.Net" rel="tag"&gt;VB.Net&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Keys+Notificator" rel="tag"&gt;Keys Notificator&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Open+Source" rel="tag"&gt;Open Source&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Keyboard" rel="tag"&gt;Keyboard&lt;/a&gt;,&lt;a href="http://technorati.com/tags/GUI" rel="tag"&gt;GUI&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=275632" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/GUI/default.aspx">GUI</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/.Net/default.aspx">.Net</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/UI/default.aspx">UI</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/VB.Net/default.aspx">VB.Net</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Example/default.aspx">Example</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Code+Example/default.aspx">Code Example</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/TECH/default.aspx">TECH</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/.Net+2.0/default.aspx">.Net 2.0</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Winforms+2.0/default.aspx">Winforms 2.0</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Open+Source/default.aspx">Open Source</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Keys+Notificator/default.aspx">Keys Notificator</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Codeplex/default.aspx">Codeplex</category></item><item><title>Mouse-Wheel-Helper for Silverlight (upgraded)</title><link>http://blogs.microsoft.co.il/blogs/maxim/archive/2009/04/03/mouse-wheel-helper-for-silverlight.aspx</link><pubDate>Fri, 03 Apr 2009 14:00:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:264314</guid><dc:creator>Maxim</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/maxim/rsscomments.aspx?PostID=264314</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/maxim/commentapi.aspx?PostID=264314</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/maxim/archive/2009/04/03/mouse-wheel-helper-for-silverlight.aspx#comments</comments><description>&lt;p&gt;Recently I’ve required to add Mouse-Wheel support in some of our Silverlight projects. Quickly discovered that unfortunately this feature isn’t supported in built-in events of Silverlight (at least in versions 1.0 and 2.0). After short search I found this &lt;a title="MouseWheelHelper" href="http://blois.us/blog/2008/03/ive-heard-number-of-people-wondering.html" target="_blank"&gt;post with sample code&lt;/a&gt; that solves this problem by attaching handlers to mouse events on html page.&lt;/p&gt;
&lt;p&gt;I made some changes in “MouseWheelHelper” class and added “UIElementExtender” class that &lt;a title="Extension Methods (C# Programming Guide)" href="http://msdn.microsoft.com/en-us/library/bb383977.aspx" target="_blank"&gt;extends&lt;/a&gt; classes that derived from “UIElement” class in order to provide Mouse-Wheel support.&lt;/p&gt;
&lt;p&gt;Here small example that uses “MouseWheelHelper” and “UIElementExtender”:&lt;br /&gt;(use mouse wheel to zoom-in/out, also you can change image by pasting new url into texbox)&lt;/p&gt;
&lt;p&gt;&lt;iframe style="WIDTH:350px;HEIGHT:350px;" src="http://silverlight.services.live.com/invoke/72458/SilverZoom/iframe.html" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;Some code samples:&lt;/p&gt;
&lt;p&gt;Attach even handler “HandleMouseWheel” to event from HTML-Side (each web-browser has different event for mouse-wheel):&lt;/p&gt;
&lt;p style="BACKGROUND-COLOR:#ffffcc;"&gt;if&lt;/font&gt;&lt;font size="2"&gt; (&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;HtmlPage&lt;/font&gt;&lt;font size="2"&gt;.BrowserInformation.UserAgent.Contains(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;Chrome&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;)) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;HtmlPage&lt;/font&gt;&lt;font size="2"&gt;.Window.AttachEvent(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;onmousewheel&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;, HandleMouseWheel); &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;else&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;if&lt;/font&gt;&lt;font size="2"&gt; (&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;HtmlPage&lt;/font&gt;&lt;font size="2"&gt;.BrowserInformation.UserAgent.Contains(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;Firefox&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;)) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;HtmlPage&lt;/font&gt;&lt;font size="2"&gt;.Window.AttachEvent(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;DOMMouseScroll&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;, HandleMouseWheel); &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;else &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;HtmlPage&lt;/font&gt;&lt;font size="2"&gt;.Document.AttachEvent(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;onmousewheel&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;, HandleMouseWheel);&lt;/font&gt; &lt;/p&gt;
&lt;p&gt;“HandleMouseWheel” event handler (each web-browser has specific property for mouse-wheel-delta, method corrects some values):&lt;/p&gt;
&lt;p style="BACKGROUND-COLOR:#ffffcc;"&gt;private&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;void&lt;/font&gt;&lt;font size="2"&gt; HandleMouseWheel(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;object&lt;/font&gt;&lt;font size="2"&gt; sender, &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;HtmlEventArgs&lt;/font&gt;&lt;font size="2"&gt; args) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;double&lt;/font&gt;&lt;font size="2"&gt; delta = 0; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;ScriptObject&lt;/font&gt;&lt;font size="2"&gt; eventObj = args.EventObject; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;if&lt;/font&gt;&lt;font size="2"&gt; (eventObj.GetProperty(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;wheelDelta&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;) != &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;null&lt;/font&gt;&lt;font size="2"&gt;) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; delta = ((&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;double&lt;/font&gt;&lt;font size="2"&gt;) eventObj.GetProperty(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;wheelDelta&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;)); &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if&lt;/font&gt;&lt;font size="2"&gt; (&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;HtmlPage&lt;/font&gt;&lt;font size="2"&gt;.Window.GetProperty(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;opera&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;) != &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;null&lt;/font&gt;&lt;font size="2"&gt;) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; delta = -delta; &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;if&lt;/font&gt;&lt;font size="2"&gt; (&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;HtmlPage&lt;/font&gt;&lt;font size="2"&gt;.BrowserInformation.UserAgent.Contains(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;Chrome&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;)) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; delta /= 140; &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;/font&gt;&lt;font size="2"&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; delta /= 120; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;if&lt;/font&gt;&lt;font size="2"&gt; (eventObj.GetProperty(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;detail&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;) != &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;null&lt;/font&gt;&lt;font size="2"&gt;) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; delta = -((&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;double&lt;/font&gt;&lt;font size="2"&gt;) eventObj.GetProperty(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;detail&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;)); &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if&lt;/font&gt;&lt;font size="2"&gt; (!&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;HtmlPage&lt;/font&gt;&lt;font size="2"&gt;.BrowserInformation.UserAgent.Contains(&lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;Macintosh&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;)) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; delta /= 2; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if&lt;/font&gt;&lt;font size="2"&gt; (delta == 0 || Moved == &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;null&lt;/font&gt;&lt;font size="2"&gt;) &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;return&lt;/font&gt;&lt;font size="2"&gt;; &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var&lt;/font&gt;&lt;font size="2"&gt; wheelArgs = &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;MouseWheelEventArgs&lt;/font&gt;&lt;font size="2"&gt;(delta); &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if&lt;/font&gt;&lt;font size="2"&gt; (Moved != &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;null&lt;/font&gt;&lt;font size="2"&gt;) Moved(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;this&lt;/font&gt;&lt;font size="2"&gt;, wheelArgs); &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if&lt;/font&gt;&lt;font size="2"&gt; (wheelArgs.Handled) args.PreventDefault(); &lt;br /&gt;}&lt;/font&gt; &lt;/p&gt;
&lt;p&gt;Method-Extension for “UIElement”:&lt;/p&gt;
&lt;p style="BACKGROUND-COLOR:#ffffcc;"&gt;public&lt;/font&gt;&lt;font size="2"&gt; &lt;font color="#0000ff"&gt;static&lt;/font&gt; &lt;font color="#0000ff"&gt;void&lt;/font&gt; RegisterMouseWheelHandler(&lt;font color="#0000ff"&gt;this&lt;/font&gt; &lt;font color="#2b91af"&gt;UIElement&lt;/font&gt; sender, &lt;font color="#2b91af"&gt;EventHandler&lt;/font&gt;&amp;lt;&lt;font color="#2b91af"&gt;MouseWheelEventArgs&lt;/font&gt;&amp;gt; handler){ &lt;font color="#00ae57"&gt;/*...*/&lt;/font&gt;&amp;nbsp; }&lt;/font&gt; &lt;/p&gt;
&lt;p&gt;Use of Method-Extension:&lt;/p&gt;
&lt;p style="BACKGROUND-COLOR:#ffffcc;"&gt;this&lt;/font&gt;&lt;font size="2"&gt;.RegisterMouseWheelHandler(OnMouseWheel); &lt;br /&gt;&lt;font color="#00b75b"&gt;/* ... */ &lt;br /&gt;// &amp;quot;MouseWheel&amp;quot; event handler, controls &amp;quot;zoom&amp;quot; of Image control &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;private&lt;/font&gt; &lt;font color="#0000ff"&gt;void&lt;/font&gt; OnMouseWheel(&lt;font color="#0000ff"&gt;object&lt;/font&gt; sender, &lt;font color="#2b91af"&gt;MouseWheelEventArgs&lt;/font&gt; e) &lt;br /&gt;{ &lt;br /&gt;&lt;font color="#0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if&lt;/font&gt; (e == &lt;font color="#0000ff"&gt;null&lt;/font&gt;) &lt;font color="#0000ff"&gt;return&lt;/font&gt;; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.Handled = &lt;font color="#0000ff"&gt;true&lt;/font&gt;; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; zoomDelta += e.Delta * 12; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; img.Margin = &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;Thickness&lt;/font&gt;(zoomDelta); &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;Source code for “MouseWheelHelper” can be downloaded from &lt;/font&gt;&lt;a href="http://blogs.microsoft.co.il/files/folders/maxim/entry264291.aspx"&gt;&lt;font size="2"&gt;here&lt;/font&gt;&lt;/a&gt;&lt;a href="http://blogs.microsoft.co.il/files/folders/maxim/entry264291.aspx"&gt;&lt;font size="2"&gt;&lt;img border="0" alt="" src="http://blogs.microsoft.co.il/blogs/maxim/image025_5B3BB0DF.gif" /&gt;&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt; .&lt;br /&gt;&lt;/font&gt;&lt;font size="2"&gt;Source code for example project can be downloaded from &lt;/font&gt;&lt;a href="http://blogs.microsoft.co.il/files/folders/maxim/entry264301.aspx"&gt;&lt;font size="2"&gt;here&lt;/font&gt;&lt;/a&gt;&lt;a href="http://blogs.microsoft.co.il/files/folders/maxim/entry264301.aspx"&gt;&lt;font size="2"&gt;&lt;img border="0" alt="" src="http://blogs.microsoft.co.il/blogs/maxim/image025_5B3BB0DF.gif" /&gt;&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt; .&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&lt;font color="#c0c0c0" size="2"&gt;PS &lt;br /&gt;I’m not responsible for any damage that may be caused by using this post or its content. Any materials in this post were provided AS IS without any changes and other meanings.&lt;/font&gt;&lt;/i&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:4dc9e811-16aa-4a0f-9cca-bf1ee89e99d3" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/.Net" rel="tag"&gt;.Net&lt;/a&gt;,&lt;a href="http://technorati.com/tags/UI" rel="tag"&gt;UI&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Example" rel="tag"&gt;Example&lt;/a&gt;,&lt;a href="http://technorati.com/tags/C%23" rel="tag"&gt;C#&lt;/a&gt;,&lt;a href="http://technorati.com/tags/MS+Framework+3.0" rel="tag"&gt;MS Framework 3.0&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Silverlight" rel="tag"&gt;Silverlight&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Code+Example" rel="tag"&gt;Code Example&lt;/a&gt;,&lt;a href="http://technorati.com/tags/MS+Blend" rel="tag"&gt;MS Blend&lt;/a&gt;,&lt;a href="http://technorati.com/tags/MS+Visual+Studio+2008" rel="tag"&gt;MS Visual Studio 2008&lt;/a&gt;,&lt;a href="http://technorati.com/tags/MS+Framework+3.5" rel="tag"&gt;MS Framework 3.5&lt;/a&gt;,&lt;a href="http://technorati.com/tags/UX" rel="tag"&gt;UX&lt;/a&gt;,&lt;a href="http://technorati.com/tags/XAML" rel="tag"&gt;XAML&lt;/a&gt;,&lt;a href="http://technorati.com/tags/DEV" rel="tag"&gt;DEV&lt;/a&gt;,&lt;a href="http://technorati.com/tags/MS+Blend+2.0" rel="tag"&gt;MS Blend 2.0&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=264314" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/.Net/default.aspx">.Net</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/UI/default.aspx">UI</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Example/default.aspx">Example</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Code+Example/default.aspx">Code Example</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/MS+Visual+Studio+2008/default.aspx">MS Visual Studio 2008</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/MS+Framework+3.5/default.aspx">MS Framework 3.5</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/UX/default.aspx">UX</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/XAML/default.aspx">XAML</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/MS+Blend+2.0/default.aspx">MS Blend 2.0</category></item><item><title>Daily Tip: How to import 3D model to WPF from 3D Max</title><link>http://blogs.microsoft.co.il/blogs/maxim/archive/2009/03/31/daily-tip-how-to-import-3d-model-to-wpf-from-3d-max.aspx</link><pubDate>Tue, 31 Mar 2009 16:24:49 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:262604</guid><dc:creator>Maxim</dc:creator><slash:comments>13</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/maxim/rsscomments.aspx?PostID=262604</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/maxim/commentapi.aspx?PostID=262604</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/maxim/archive/2009/03/31/daily-tip-how-to-import-3d-model-to-wpf-from-3d-max.aspx#comments</comments><description>

  &lt;div class="Section1"&gt;   &lt;p class="MsoNormal"&gt;I want to present very useful feature “&lt;b&gt;&lt;span style="font-size:12pt;"&gt;XAML exporter for 3D Studio Max&lt;/span&gt;&lt;/b&gt;”. This feature contains number of MAX-Script files with code that allows exporting 3D scenes from &lt;a title="wiki: Autodesk_3ds_Max" href="http://en.wikipedia.org/wiki/Autodesk_3ds_Max"&gt;3D Studio Max&lt;/a&gt; to &lt;a title="wiki: XAML" href="http://en.wikipedia.org/wiki/XAML"&gt;XAML&lt;/a&gt; files. “Max2Xaml” Project on Codeplex website: &lt;a href="http://max2xaml.codeplex.com"&gt;http://max2xaml.codeplex.com&lt;/a&gt;.&lt;/p&gt;    &lt;p class="MsoNormal"&gt;I’ll try to present a simple guide for this feature with some useful example.&lt;/p&gt;    &lt;p class="MsoNormal"&gt;Software requirements for this guide: 3D Studio Max 2007 or later (I use &lt;a title="3ds Max 2009" href="http://usa.autodesk.com/adsk/servlet/index?id=5659302&amp;amp;siteID=123112"&gt;3D Studio Max 2009&lt;/a&gt;), &lt;a title="MS Blend 2" href="http://www.microsoft.com/expression/products/Overview.aspx?key=blend"&gt;Microsoft Expression Blend 2.0&lt;/a&gt; (Final Release).      &lt;br /&gt;SDK and Framework requirements: &lt;a title=".Net" href="http://msdn.microsoft.com/en-us/netframework/default.aspx"&gt;Microsoft .Net 3.0 or 3.5&lt;/a&gt;.&lt;/p&gt;    &lt;p class="MsoNormal"&gt;Let’s start:&lt;/p&gt;    &lt;p class="MsoNormal"&gt;(1) Download ZIP File from &lt;a title="Max2Xaml" href="http://max2xaml.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24531"&gt;here&lt;/a&gt; and extract it to some directory on your hard drive.&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;a title="http://max2xaml.codeplex.com" href="http://max2xaml.codeplex.com/"&gt;&lt;span style="color:windowtext;text-decoration:none;"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" id="Picture 11" title="image001" border="0" alt="image001" src="http://blogs.microsoft.co.il/blogs/maxim/image001_326B15AB.png" width="502" height="552" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;(2) Open/build scene with 3D objects in 3ds Max.&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/maxim/image002_2FB2342D.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" id="Picture 12" title="image002" border="0" alt="image002" src="http://blogs.microsoft.co.il/blogs/maxim/image002_thumb_7F1B641C.png" width="595" height="506" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;(3) Ensure that each object has definition of material (this required by “Max2Xaml”).&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/maxim/image003_41BA63BB.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" id="Picture 18" title="image003" border="0" alt="image003" src="http://blogs.microsoft.co.il/blogs/maxim/image003_thumb_2B53D702.png" width="729" height="602" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;(4) Go to “MAXScript” sub-menu and click on “Run Script … ”.&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/maxim/image004_776B9516.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" id="Picture 13" title="image004" border="0" alt="image004" src="http://blogs.microsoft.co.il/blogs/maxim/image004_thumb_1AB7C815.png" width="326" height="301" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;(5) Select “Main.ms” script file from extracted directory and click on “Open”.&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/maxim/image005_7E4A3A5A.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" id="Picture 15" title="image005" border="0" alt="image005" src="http://blogs.microsoft.co.il/blogs/maxim/image005_thumb_7908271E.png" width="505" height="336" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;(6) Click on “Export” in dialog-box.&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/maxim/image006_015BD6A9.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" id="Picture 16" title="image006" border="0" alt="image006" src="http://blogs.microsoft.co.il/blogs/maxim/image006_thumb_71005EEF.png" width="351" height="222" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;(7) Type file name (with “xaml” extension) and click on “Save”.&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/maxim/image007_2EAD46AC.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" id="Picture 17" title="image007" border="0" alt="image007" src="http://blogs.microsoft.co.il/blogs/maxim/image007_thumb_376D292B.png" width="477" height="335" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;(8) This is “MAXScript” Editor window with XAML output of current scene:&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/maxim/image008_66FB21EA.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" id="Picture 19" title="image008" border="0" alt="image008" src="http://blogs.microsoft.co.il/blogs/maxim/image008_thumb_1570DF33.png" width="590" height="564" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;The output contains XAML code for “ResourceDictionary” that contains data for definitions of all scene models/objects,&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/maxim/image009_50949531.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" id="Picture 53" title="image009" border="0" alt="image009" src="http://blogs.microsoft.co.il/blogs/maxim/image009_thumb_28421085.png" width="710" height="186" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;materials,&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/maxim/image010_7127E6B1.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" id="Picture 54" title="image010" border="0" alt="image010" src="http://blogs.microsoft.co.il/blogs/maxim/image010_thumb_2E84D314.png" width="394" height="157" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;and other data.&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/maxim/image011_5AB1342B.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" id="Picture 55" title="image011" border="0" alt="image011" src="http://blogs.microsoft.co.il/blogs/maxim/image011_thumb_77C6B668.png" width="860" height="178" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;(9) Open/create new WPF project in Blend.&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/maxim/image012_7C1CEB95.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" id="Picture 21" title="image012" border="0" alt="image012" src="http://blogs.microsoft.co.il/blogs/maxim/image012_thumb_60F3F6BA.png" width="509" height="331" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;(10) Add existing item to project tree.&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/maxim/image013_551E63EE.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" id="Picture 22" title="image013" border="0" alt="image013" src="http://blogs.microsoft.co.il/blogs/maxim/image013_thumb_14D824A7.png" width="491" height="469" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;(11) Selected created XAML file and click “Open”.&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/maxim/image014_153431CF.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" id="Picture 23" title="image014" border="0" alt="image014" src="http://blogs.microsoft.co.il/blogs/maxim/image014_thumb_62EC95EA.png" width="689" height="463" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;(12) After addition of new resource dictionary merge it with resource dictionary in target window.&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/maxim/image015_7AFFDA78.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" id="Picture 31" title="image015" border="0" alt="image015" src="http://blogs.microsoft.co.il/blogs/maxim/image015_thumb_727BB987.png" width="785" height="433" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;(13) Add “Viewport3D” object into main grid (this object is used to display 3D scenes/objects).&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/maxim/image016_565AD4CF.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" id="Picture 38" title="image016" border="0" alt="image016" src="http://blogs.microsoft.co.il/blogs/maxim/image016_thumb_6AA04EC0.png" width="671" height="390" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;(14) Added “Viewport3D” already contains default camera. Add “ModelVisual3D” objects for each 3D model from the scene.&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/maxim/image017_14437E1A.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" id="Picture 32" title="image017" border="0" alt="image017" src="http://blogs.microsoft.co.il/blogs/maxim/image017_thumb_4CCDDC8D.png" width="919" height="492" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;(15) Link each model’s geometry to resource from merged dictionary.&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/maxim/image018_3D56DC8C.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" id="Picture 34" title="image018" border="0" alt="image018" src="http://blogs.microsoft.co.il/blogs/maxim/image018_thumb_01A6A7FF.png" width="854" height="440" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/maxim/image019_616B4FA7.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" id="Picture 37" title="image019" border="0" alt="image019" src="http://blogs.microsoft.co.il/blogs/maxim/image019_thumb_18550814.png" width="762" height="364" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;(16) Material of each model can be linked to resource from merged dictionary.&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/maxim/image020_00CA2E16.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" id="Picture 43" title="image020" border="0" alt="image020" src="http://blogs.microsoft.co.il/blogs/maxim/image020_thumb_47FF386E.png" width="688" height="451" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;(17) Probably we’ll not see the 3D models.&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/maxim/image021_5CED6889.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" id="Picture 44" title="image021" border="0" alt="image021" src="http://blogs.microsoft.co.il/blogs/maxim/image021_thumb_2FB83021.png" width="842" height="529" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;(18) We can adjust camera’s position and other parameters, and then we’ll see the models.&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/maxim/image022_2C364CDF.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" id="Picture 45" title="image022" border="0" alt="image022" src="http://blogs.microsoft.co.il/blogs/maxim/image022_thumb_2E8F0D36.png" width="904" height="541" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;(19) If models are black or still invisible, add new “ModelVisual3D” with light (can be “DirectionalLight”) that will “radiate” on scene objects.&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/maxim/image023_7FD56661.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" id="Picture 48" title="image023" border="0" alt="image023" src="http://blogs.microsoft.co.il/blogs/maxim/image023_thumb_6FF585C3.png" width="968" height="534" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;(20) After some adjustments of camera and light we’ll see imported models from 3ds Max.&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/maxim/image024_5922C615.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" id="Picture 49" title="image024" border="0" alt="image024" src="http://blogs.microsoft.co.il/blogs/maxim/image024_thumb_469A29C6.png" width="840" height="441" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;The example project with code can be downloaded from &lt;a title="click here to download zip file with sources..." href="http://blogs.microsoft.co.il/files/folders/maxim/entry262595.aspx"&gt;here&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" id="Picture 56" title="image025" border="0" alt="image025" src="http://blogs.microsoft.co.il/blogs/maxim/image025_5B3BB0DF.gif" width="20" height="20" /&gt;&lt;/a&gt;.&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;i&gt;Summary: Some WPF projects require complex 3D models in 3D scenes, these complex models can be made in 3D modeling software like 3ds Max and imported into WPF. This post shows how to port 3D models from 3ds Max to WPF. See next post(s) with guide for porting 3D models from “&lt;a title="Blender.org" href="http://www.blender.org" target="_blank"&gt;Blender&lt;/a&gt;” to WPF.&lt;/i&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;i&gt;&lt;span style="color:gray;"&gt;PS         &lt;br /&gt;I’m not responsible for any damage that may be caused by using this post or its content. Any materials in this post were provided AS IS without any changes and other meanings.&lt;/span&gt;&lt;/i&gt;&lt;/p&gt; &lt;/div&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=262604" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/GUI/default.aspx">GUI</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/.Net/default.aspx">.Net</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/UI/default.aspx">UI</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Render+Engine/default.aspx">Render Engine</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Code+Example/default.aspx">Code Example</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/Daily+Tip/default.aspx">Daily Tip</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/MS+Visual+Studio+2008/default.aspx">MS Visual Studio 2008</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/MS+Framework+3.5/default.aspx">MS Framework 3.5</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/UX/default.aspx">UX</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/XAML/default.aspx">XAML</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/maxim/archive/tags/MS+Blend+2.0/default.aspx">MS Blend 2.0</category></item></channel></rss>