<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Smart Client</title>
        <link>http://geekswithblogs.net/kobush/category/3702.aspx</link>
        <description>Including Composite UI Application Block and other topics related to developing Smart Clients.</description>
        <language>pl-PL</language>
        <copyright>Szymon Kobalczyk</copyright>
        <managingEditor>skobalczyk@gmail.com</managingEditor>
        <generator>Subtext Version 0.0.0.0</generator>
        <item>
            <title>Emulating multi-touch device for Windows 7</title>
            <link>http://geekswithblogs.net/kobush/archive/2009/03/10/129993.aspx</link>
            <description>&lt;p&gt;&lt;a href="http://geekswithblogs.net/images/geekswithblogs_net/kobush/WindowsLiveWriter/EmulatingmultitouchdeviceforWindows7_11B10/P1100794.jpg"&gt;&lt;img title="4Developers" style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; MARGIN: 0px 0px 10px 10px; BORDER-RIGHT-WIDTH: 0px" height="324" alt="4Developers" width="233" align="right" border="0" src="http://geekswithblogs.net/images/geekswithblogs_net/kobush/WindowsLiveWriter/EmulatingmultitouchdeviceforWindows7_11B10/P1100794_thumb.jpg" /&gt;&lt;/a&gt;Short while after I wrote about &lt;a target="_blank" href="http://geekswithblogs.net/kobush/archive/2009/02/13/129377.aspx"&gt;resources for multi-touch on Windows 7&lt;/a&gt; Daniel D left a comment that got me very excited:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;MultiTouchVista now has a driver that emulates multitouch hardware for Windows 7&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I got to try it out myself! Bit later I got everything up and running and I’m happy to report that it’s all true: &lt;strong&gt;you can now effectively emulate multi-touch devices under Windows 7&lt;/strong&gt;. You can see it yourself on &lt;a target="_blank" href="http://www.youtube.com/watch?v=C_-vxp1K-1Q"&gt;this video&lt;/a&gt;. In fact it works so well that I was able to demonstrate it last Saturday at &lt;a target="_blank" href="http://4developers.org.pl/"&gt;4Developers&lt;/a&gt; conference. &lt;/p&gt;
&lt;p&gt;That being said, the process to get it running involves few steps so I thought it would help to have a walkthrough to follow for anyone who would like to try it. So here it goes.&lt;/p&gt;
&lt;h2&gt;Hardware&lt;/h2&gt;
&lt;p&gt;Of course you need a PC. Note that computer vision puts CPU to heavy use, and I was able to get barely 15 FPS on my laptop with 1.6Ghz, and thus the interaction wasn’t very smooth. In fact Windows 7 specification requires multi-touch devices to report at least 50hz per finger. &lt;/p&gt;
&lt;p&gt;The software that we are going to use allows to work with number of protocols. One option is to simply connect multiple USB mice to emulate multi-touch. But it is much more fun to build your own surface-like table. For start you can built a &lt;a target="_blank" href="http://ssandler.wordpress.com/mtmini/"&gt;MTmini table designed by Seth Sanders&lt;/a&gt; – it takes about 20 minutes to build and all you will need is:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;Webcam &lt;/strong&gt;– people try different kinds of webcams for this, but I think even something simple with decent video should work. I have great results using &lt;a target="_blank" href="http://www.logitech.com/index.cfm/webcam_communications/webcams/devices/3056&amp;amp;cl=US,EN"&gt;Logitech QuickCam Pro 9000&lt;/a&gt; because it has excellent video quality in 640x480 and most important you can set the focus and other parameters manually. &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Tracing paper &lt;/strong&gt;– it’s purpose is to diffuse the light coming to the camera so only objects very close to the surface (i.e. your fingers) look sharp. Initially I used just ordinary printer paper, but tracing paper gives more even image. &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Photo frame &lt;/strong&gt;– no, I’m not talking about any fancy LCD frames. It’s just plain wood frame (word of advice: bad things will happen if you try to repurpose frame from your wedding photo). Frame I use has A4 paper format (210mm × 297mm) and fits nicely on top of the carton box from the packs of A4 office paper. &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Cardboard box&lt;/strong&gt;, &lt;strong&gt;duck tape&lt;/strong&gt;, and &lt;strong&gt;scissors&lt;/strong&gt;. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When you have all the materials here is what you do:&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;Put the camera at the bottom of the box facing up, and glue it with the duck tape. You might need to cut out the hole for the camera’s USB cord. &lt;/li&gt;
    &lt;li&gt;Remove the back board from the photo frame and put only the tracing paper on the glass. &lt;/li&gt;
    &lt;li&gt;Put the frame on top of the box. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You can also &lt;a target="_blank" href="http://www.youtube.com/watch?v=pQpr3W-YmcQ&amp;amp;eurl"&gt;watch this video&lt;/a&gt; for step by step instructions.&lt;/p&gt;
&lt;p&gt;Here is my completed setup:&lt;/p&gt;
&lt;p&gt;&lt;img title="My MTmini setup" style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="324" alt="My MTmini setup" width="429" border="0" src="http://geekswithblogs.net/images/geekswithblogs_net/kobush/WindowsLiveWriter/EmulatingmultitouchdeviceforWindows7_11B10/P1100787_2.jpg" /&gt; &lt;/p&gt;
&lt;h2&gt;Software&lt;/h2&gt;
&lt;p&gt;Obviously you need to have Windows 7 Beta installed. So hopefully you was able to download it while it lasted. &lt;/p&gt;
&lt;p&gt;Next thing to download and configure is &lt;strong&gt;tBeta&lt;/strong&gt;. Here is description of it from &lt;a target="_blank" href="http://tbeta.nuigroup.com/"&gt;official website&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Beta, &lt;strong&gt;tbeta&lt;/strong&gt; for short, is a &lt;strong&gt;open source/cross-platform solution &lt;/strong&gt;for &lt;strong&gt;computer vision&lt;/strong&gt; and &lt;strong&gt;multi-touch sensing. &lt;/strong&gt;It takes an video input stream and outputs tracking data (e.g. coordinates and blob size) and touch events (e.g. finger down, moved and released) that are used in building multi-touch applications. tbeta can interface with various web cameras and video devices as well as connect to various TUIO/OSC enabled applications and supports many multi-touch lighting techniques including: FTIR, DI, DSI, and LLP with expansion planned for the future (custom modules/filters).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Download the software from the above website and unzip to folder you choose. Before you run it you might want to change configuration to use higher resolution if your webcam supports it. Go to &lt;strong&gt;\tbeta\data&lt;/strong&gt; folder and open &lt;strong&gt;config.xml&lt;/strong&gt; file. Specify the correct values for  WIDTH and HEIGHT in CAMERA_0 node.&lt;/p&gt;
&lt;p&gt;One more thing I did to get more predictable results was to turn off all automatic adjustments in camera software. For Logitech QuickCam this includes switching to manual focus, and turning off Automatic settings for RightLight, exposure and gain. We are not going to move the camera around or dramatically change the lightning conditions so it will be best to make all settings constant. &lt;/p&gt;
&lt;p&gt;When you run tbeta.exe you should see something like this:&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://tbeta.nuigroup.com/"&gt;&lt;img title="tBeta" style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="445" alt="tBeta" width="644" border="0" src="http://geekswithblogs.net/images/geekswithblogs_net/kobush/WindowsLiveWriter/EmulatingmultitouchdeviceforWindows7_11B10/image_3.png" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;The tricky part is &lt;strong&gt;calibration&lt;/strong&gt;, which means adjusting the sliders for all filters at the bottom so that you get best recognition accuracy. Unfortunately I don’t know any rules that would help you with this. You would have to play with the settings a bit to get a feeling how it works. If you make it right you should see an outline and unique id associated with each of your fingers as seen on the above screenshot. When all works well you can minimize this window (press spacebar) so it won’t consume CPU for rendering.&lt;/p&gt;
&lt;p&gt;The last piece of this puzzle is &lt;a target="_blank" href="http://multitouchvista.codeplex.com/"&gt;MultiTouchVista&lt;/a&gt; project that I mentioned in previous post as well. This framework, which actively developed by &lt;strong&gt;Daniel D &lt;/strong&gt;himself (aka &lt;strong&gt;nesher)&lt;/strong&gt;, adds support of multi-touch to the current version of WPF. But for purpose of this article the important thing is the recently added Windows 7 multi-touch driver. It’s not even officially released yet, so you would need to go directly to Source Code tab and download latest bits (I run it on changeset 18685). &lt;/p&gt;
&lt;p&gt;You can &lt;a target="_blank" href="http://www.youtube.com/watch?v=_maaH1gecxw&amp;amp;feature=related"&gt;follow instruction in this video&lt;/a&gt; on how to install the driver and run the services. Here is a short summary of the same:&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;Compile all projects for MultiTouchVista. Follow instructions on &lt;a target="_blank" href="http://multitouchvista.codeplex.com/Wiki/View.aspx?title=How%20to%20compile"&gt;this page&lt;/a&gt;. &lt;/li&gt;
    &lt;li&gt;From Windows Explorer go to &lt;strong&gt;MultiTouchVista\Main Source&lt;/strong&gt; folder, and while holding down Shift right click on &lt;strong&gt;Multitouch.Diver&lt;/strong&gt; folder and select “Open Command Window Here”. &lt;/li&gt;
    &lt;li&gt;In this window type: &lt;strong&gt;install driver.cmd,&lt;/strong&gt; press Enter and ignore all warnings about not certified drivers. &lt;/li&gt;
    &lt;li&gt;Open Device Manager and confirm that new driver called “Universal Software HID device” is installed under “Human Interface Devices”. Video suggests to disable and then enable the driver to ensure it is working correctly. &lt;/li&gt;
    &lt;li&gt;To verify the driver is installed you can open “Pen and Touch” applet from Control Panel. It should now contain the Panning tab. &lt;/li&gt;
    &lt;li&gt;Back in Explorer go to &lt;strong&gt;MultiTouchVista\Main Source\Output&lt;/strong&gt; folder and run  &lt;strong&gt;Multitouch.Service.Consol.exe&lt;/strong&gt;. By default it loads the MultipleMiceInputProvider so if you should see red dots indicating “virtual cursor” for each USB mouse you have attached. But to use your MTmini table you would need to change configuration so it connects to tBeta through TUIO interface. &lt;/li&gt;
    &lt;li&gt;From &lt;strong&gt;MultiTouchVista\Main Source\Output&lt;/strong&gt; run Multitouch.Configuration.WPF.exe. From list of Available devices select Tuio and click the arrow button in middle to make it Active device. Then click “Restart service” button to apply the new configuration. &lt;/li&gt;
    &lt;li&gt;Finally go to &lt;strong&gt;MultiTouchVista\Main Source\Multitouch.Driver.Console\bin\debug &lt;/strong&gt;and run &lt;strong&gt;Multitouch.Driver.Console.exe&lt;/strong&gt;. &lt;/li&gt;
    &lt;li&gt;Now if you put finger on surface, you should see the input messages coming to the console window. And of course now you should be read to use it as input device for Windows. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Try it on several touch enable applications that I listed in my last post (XPS Viewer and Paint are great for quick demo). You can also find some C++/C# examples on &lt;a target="_blank" href="http://code.msdn.microsoft.com/WindowsTouch"&gt;MSDN Code Galery&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Great thanks for &lt;strong&gt;Daniel D&lt;/strong&gt; for leaving this inspiring comment, and even bigger compliments for developing such great library. Please don’t hesitate to let me know if I can help with anything. &lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=129993"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=129993" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/kobush/aggbug/129993.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Szymon Kobalczyk</dc:creator>
            <guid>http://geekswithblogs.net/kobush/archive/2009/03/10/129993.aspx</guid>
            <pubDate>Wed, 11 Mar 2009 03:35:19 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/kobush/comments/129993.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/kobush/archive/2009/03/10/129993.aspx#feedback</comments>
            <slash:comments>8</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/kobush/comments/commentRss/129993.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/kobush/services/trackbacks/129993.aspx</trackback:ping>
        </item>
        <item>
            <title>Resources for Multi-touch in Windows 7</title>
            <link>http://geekswithblogs.net/kobush/archive/2009/02/13/129377.aspx</link>
            <description>&lt;p&gt;Last couple of months I’ve been working on very cool project that utilizes new multi-touch features in Windows 7. Although I can’t talk yet about our product, I thought it would be good to start sharing my experience with multi-touch programming. I’ll begin with some general resources to get you started.&lt;/p&gt;
&lt;h3&gt;Prerequisites&lt;/h3&gt;
&lt;p&gt;Of course first thing you need is a multi-touch capable hardware. As far as I know currently there are only three devices available on the market. Those lucky to be at PDC could see that most demos were run on &lt;a target="_blank" href="http://www.hp.com/united-states/campaigns/touchsmart/"&gt;HP TouchSmart All-in-One PC&lt;/a&gt;, or &lt;a target="_blank" href="http://www.dell.com/tablet?s=biz&amp;amp;cs=555"&gt;Dell Letitude XT&lt;/a&gt; tablet. Later in December HP released &lt;a target="_blank" href="http://www.hp.com/united-states/campaigns/touchsmart/notebook/buy.html"&gt;TouchSmart tx2z tablet&lt;/a&gt;, and this week Dell announced specs on &lt;a target="_blank" href="http://www.engadget.com/2009/02/10/dell-latitude-xt2-multi-touch-tablet-with-11-hour-battery-now-of/"&gt;Letitude XT2&lt;/a&gt;. For my work I use HP TouchSmart IQ504 PC. &lt;/p&gt;
&lt;p&gt;The good news is that we have already seen some announcements from other manufacturers, and can expect number of devices to increase closer to Windows 7 release date. &lt;/p&gt;
&lt;p&gt;In terms of touch-screen technology both tablets use the same DuoSense capacitive digitizer from &lt;a target="_blank" href="http://www.n-trig.com/"&gt;N-Trig&lt;/a&gt;, while HP All-in-one PC uses optical overlay developed by &lt;a target="_blank" href="http://www.nextwindow.com/"&gt;NextWindow&lt;/a&gt;. The main difference is that NextWindow device supports only two touch points, while N-Trig’s can recognize more contacts.&lt;/p&gt;
&lt;p&gt;Unfortunately multi-touch works only with dedicated hardware, so you can’t use other digitizers (like Wacom’s), touchpads or TabletPCs. Also there is no way to emulate multi-touch on Windows 7, for example by attaching multiple mice, although this is supported on Surface SDK emulator as &lt;a target="_blank" href="http://channel9.msdn.com/pdc2008/TL49/"&gt;demonstrated by Scott Hanselman&lt;/a&gt; (see around 14:30). &lt;/p&gt;
&lt;h3&gt;Software&lt;/h3&gt;
&lt;p&gt;In terms of software you need two things: Windows 7 and proper multi-touch driver for your device. Currently I run on Windows 7 Beta 1 (build 7000 for x86), and when I did clean install today most of the drivers are now available through Windows Update. The only driver I had to install manually was for &lt;a target="_blank" href="http://www.ralinktech.com.tw/data/drivers/IS_AP_STA_RT2860_D-1.2.1.0_VA-2.1.2.0_RU-2.1.9.0_VA-2.2.4.0_AU_2.0.9.0_VA-2.0.9.0_111108_1.0.6.0_Free.exe"&gt;Ralink WLAN adapter&lt;/a&gt;. However the TouchSmart version I have doesn’t have TV tuner, so if yours does you might need to install some additional software. Fortunately &lt;a target="_blank" href="http://www.brockett.net/?p=637"&gt;Kurt Brockett published detailed guide&lt;/a&gt; how to setup Windows 7 on HP TouchSmart. &lt;/p&gt;
&lt;p&gt;If by any chance the multi-touch drivers won’t install for you automatically, you can download them directly from NextWindow’s or N-trig’s websites:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a target="_blank" href="http://www.nextwindow.com/windriver/index.html"&gt;NextWindow’s Multi-Touch Screen Driver&lt;/a&gt; (Current version is 1.0.3.8 – the same as on Windows Update) &lt;/li&gt;
    &lt;li&gt;&lt;a target="_blank" href="http://www.n-trig.com/Content.aspx?Page=Multi_Touch"&gt;N-trig’s Multi-Touch download for Win7&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To verify all works fine open any page in IE8 and you should be able to use two fingers for zooming. &lt;/p&gt;
&lt;p&gt;Here are some other areas in Windows 7 that were enhanced with multi-touch features:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Panning with inertia is enabled “everywhere” where scrollbars exist. &lt;/li&gt;
    &lt;li&gt;Paint
    &lt;ul&gt;
        &lt;li&gt;Choose a brush from the “brush gallery” and you can then multi touch finger paint. &lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;Games
    &lt;ul&gt;
        &lt;li&gt;Hearts/Solitaire have been optimized for touch &lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;Shell
    &lt;ul&gt;
        &lt;li&gt;Windows Snapping (Aero Snap) with Touch &lt;/li&gt;
        &lt;li&gt;Aero Peek with Touch &lt;/li&gt;
        &lt;li&gt;Taskbar Jump Lists with Increased spacing &lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;Windows Media Player &lt;/li&gt;
    &lt;li&gt;Windows Photo Viewer
    &lt;ul&gt;
        &lt;li&gt;Zoom, Rotate, Panning and Flicks &lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;XPS Viewer
    &lt;ul&gt;
        &lt;li&gt;Gestures (Zoom, Two-Finger Tap, Panning) &lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;Media Center
    &lt;ul&gt;
        &lt;li&gt;Direct Panning in most Scrollable Views and Menus &lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;Touch Keyboard / TIP
    &lt;ul&gt;
        &lt;li&gt;Multi-touch touch keyboard &lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;Internet Explorer 8
    &lt;ul&gt;
        &lt;li&gt;Panning &lt;/li&gt;
        &lt;li&gt;Drag Menu (Address Bar) with Increased Spacing &lt;/li&gt;
        &lt;li&gt;Increased Spacing for Favorites with Touch &lt;/li&gt;
        &lt;li&gt;Gesture (Zoom, Panning, Flicks back and forth) &lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;Windows Live Photo Gallery
    &lt;ul&gt;
        &lt;li&gt;Gesture support in the Viewer &lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can also download IdentityMine’s Air Hockey game from: &lt;a href="http://www.identitymine.com/airhockey"&gt;www.identitymine.com/airhockey&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Tip: If you are using touch on regular basis touch it is a good idea to increase the size of Windows UI (fonts, icons, etc.) by changing your display settings to Medium (125%). This will make Windows much more “touchable”. &lt;/p&gt;
&lt;h3&gt;Multi-touch Programming&lt;/h3&gt;
Most of what we know so far about multi-touch API’s introduced in Windows 7 and WPF 4.0 comes from &lt;a target="_blank" href="http://channel9.msdn.com/pdc2008/PC03/"&gt;PDC session&lt;/a&gt; by Reed Townsend and Anson Tsao.
&lt;p&gt;There are also two later sessions from WinHEC 2008: &lt;a title="Multi-Touch in Windows 7 Overview" href="http://download.microsoft.com/download/F/A/7/FA70E919-8F82-4C4E-8D02-97DB3CF79AD5/MBL-T527_Yang_Taiwan.pdf"&gt;Multi-Touch in Windows 7 Overview&lt;/a&gt; covers some basics and repeats information from PDC, while &lt;a href="http://download.microsoft.com/download/F/A/7/FA70E919-8F82-4C4E-8D02-97DB3CF79AD5/MBL-T803_Yang_Taiwan.pdf"&gt;Multi-Touch Driver Development and Logo Compliance&lt;/a&gt; is more toward hardware developers. &lt;/p&gt;
&lt;p&gt;Recently published &lt;a target="_blank" href="http://www.microsoft.com/downloadS/details.aspx?familyid=A91DC12A-FC94-4027-B67E-46BAB7C5226C&amp;amp;displaylang=en"&gt;Windows 7 SDK Beta&lt;/a&gt; includes header files for WM_TOUCH, WM_GESTURE messages, and related functions and structures. It also includes some documentation and samples on this (also &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/dd317323(VS.85).aspx"&gt;available on MSDN&lt;/a&gt;). &lt;/p&gt;
&lt;p&gt;When you have all of above installed, you can try some code samples from &lt;a target="_blank" href="http://code.msdn.microsoft.com/WindowsTouch"&gt;hands on labs from PDC&lt;/a&gt; available on MSDN Code Gallery. These samples are both in C++ and C#. But to get it working in WPF you will need some more advanced framework in place, and I suggest you first take a look at the &lt;a target="_blank" href="http://www.codeplex.com/MultiTouchVista"&gt;Multi-touch Vista&lt;/a&gt; project on CodePlex. You can take a look at &lt;a target="_blank" href="http://www.generoso.info/miria/miria-project.html"&gt;MIRIA SDK&lt;/a&gt; that adds multi-touch support to Silverlight apps. Finally, for those of you that already work with TUIO libraries (like &lt;a target="_blank" href="http://www.nuigroup.com/touchlib/"&gt;Touchlib&lt;/a&gt;) here is an applet to &lt;a target="_blank" href="http://nuigroup.com/forums/viewthread/4087/"&gt;translate WM_TOUCH to TUIO messages&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;More information in multi-touch and related technology can be found in the great &lt;a href="http://nuigroup.com/forums/"&gt;NUI Group Forum&lt;/a&gt;. You can also find all information how to build multi-touch device yourself. &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;I hope that this information will get you started, and I will try to publish more information on multi-touch programming in C# in next few days. If you have any questions or suggestions please leave a comment.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=129377"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=129377" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/kobush/aggbug/129377.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Szymon Kobalczyk</dc:creator>
            <guid>http://geekswithblogs.net/kobush/archive/2009/02/13/129377.aspx</guid>
            <pubDate>Fri, 13 Feb 2009 14:19:14 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/kobush/comments/129377.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/kobush/archive/2009/02/13/129377.aspx#feedback</comments>
            <slash:comments>11</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/kobush/comments/commentRss/129377.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/kobush/services/trackbacks/129377.aspx</trackback:ping>
        </item>
        <item>
            <title>Two cool Microsoft Surface apps from InterKnowlogy</title>
            <link>http://geekswithblogs.net/kobush/archive/2008/08/29/124783.aspx</link>
            <description>&lt;p&gt;InterKnowlogy is always on the cutting edge of the Microsoft Platform so its not surprise that we were among first to build applications in WPF, Silverlight and now on &lt;a href="http://www.microsoft.com/surface" target="_blank"&gt;Microsoft Surface&lt;/a&gt; (a touch screen computer embedded in a coffee table). I'm excited to show you two applications that we released recently.&lt;/p&gt; &lt;h1&gt;VitruView&lt;/h1&gt; &lt;p&gt;VirtuView is a collaborative environment for viewing and annotating patient's examination results on anatomic 3D models. This application is evolution of our earlier &lt;a href="http://www.interknowlogy.com/lab/Pages/Angiographer.aspx" target="_blank"&gt;Angiographer&lt;/a&gt; that we build for &lt;a href="http://intermountainhealthcare.org/xp/public/" target="_blank"&gt;InterMountain Healthcare&lt;/a&gt; together with our partner &lt;a href="http://www.zygote.com/" target="_blank"&gt;Zygote&lt;/a&gt; (world's leader in 3D human anatomy models and textures). VirtuView lets users zoom and rotate the 3D heart models with your hands. You can use your fingers to draw arteries, place Stents and add annotations. And because this is multitouch you can use more than one finger or many people can work at once. This application is done in WPF and uses &lt;a href="http://www.healthvault.com/" target="_blank"&gt;Microsoft HealthVault&lt;/a&gt; to securely store patient's data. &lt;/p&gt; &lt;p&gt;Check out this video demonstration from Tim Huckaby and Kevin Kennedy:&lt;/p&gt; &lt;p&gt;&lt;iframe style="width: 500px; height: 375px" src="http://silverlight.services.live.com/invoke/67733/VitruView/iframe.html" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Update: &lt;/strong&gt;Here you can watch another video with Tim and Dr. Peter Kuhn from &lt;a href="http://blogs.msdn.com/healthblog/archive/2008/08/27/microsoft-hug-wish-you-were-here-day-2.aspx" target="_blank"&gt;Health User Group Conference&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;h1&gt;History at your fingertips&lt;/h1&gt; &lt;p&gt;This amazing application was built in conjunction with Microsoft and the Library of Congress. It chronicles the history of the republican and democratic national conventions in interactive Surface experience. The application is featured LIVE on Surface units at both upcoming conventions, and it was shown on the ABC National News this week and you can watch it on the &lt;a href="http://abcnews.go.com/Video/playerIndex?id=5660365" target="_blank"&gt;ABCnews.com website&lt;/a&gt; (move forward to approximately 01:18). &lt;/p&gt; &lt;p&gt;Here is a more technical demonstration from Rodney Guzman:&lt;/p&gt;&lt;iframe style="width: 500px; height: 375px" src="http://silverlight.services.live.com/invoke/67733/History%20At%20Your%20Fingertips_2/iframe.html" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt; &lt;p&gt; &lt;/p&gt; &lt;h1&gt;What about me?&lt;/h1&gt; &lt;p&gt;Meanwhile I've been working with great team at &lt;a href="http://www.coloniallife.com/" target="_blank"&gt;Colonial Life &amp;amp; Accident Insurance Company&lt;/a&gt; that built the Harmony solution. We helped them built a WPF offline version of the Web based Harmony self-enrollment system that will be used by insurance agents. You can find more details in this &lt;a href="http://www.microsoft.com/casestudies/casestudy.aspx?casestudyid=4000002535" target="_blank"&gt;Microsoft case study&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=124783"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=124783" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/kobush/aggbug/124783.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Szymon Kobalczyk</dc:creator>
            <guid>http://geekswithblogs.net/kobush/archive/2008/08/29/124783.aspx</guid>
            <pubDate>Fri, 29 Aug 2008 13:41:02 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/kobush/comments/124783.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/kobush/archive/2008/08/29/124783.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/kobush/comments/commentRss/124783.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/kobush/services/trackbacks/124783.aspx</trackback:ping>
        </item>
        <item>
            <title>How I won the Lab49 WPF in Finance Innovation Contest?</title>
            <link>http://geekswithblogs.net/kobush/archive/2008/03/17/120601.aspx</link>
            <description>&lt;p&gt;&lt;img style="margin: 0px 0px 5px 5px" src="http://www.lab49.com/files/logos/wpf_logo_blue3.gif" align="right" /&gt;Honestly, I still don't know how I did it. The LAB49 &lt;a href="http://wpfcontest.lab49.com/"&gt;WPF in Finance Innovation Contest&lt;/a&gt; was announced back in December and I think I first read about it on &lt;a href="http://blogs.msdn.com/tims/archive/2007/12/04/wpf-and-silverlight-contest-season-is-here.aspx"&gt;Tim Sneath blog&lt;/a&gt;. With &lt;a href="http://wpfcontest.lab49.com/prizes.aspx"&gt;all the cool prizes&lt;/a&gt; I was very inclined to participate, but it quickly turned out that its available only to US citizens. However that changed in the first week of February, so I started considering it again, but still didn't had any clue what to do. You see the goal of this contest was to create a WPF application that visualizes a set of provided financial data in some interesting way. While the first part was easy (writing the app in WPF) the hardest part was to figure out what to do with the data. Only after "last call to action" email from Daniel Chait I decided its about time to start coding.&lt;/p&gt; &lt;p&gt;Because I started working late on this project, initially I wanted to create only a charting control capable of displaying the line and candlestick plot of stock prices. But after the contest deadline was extended I started thinking of a better way to visualize the stock prices for a given day – something that goes beyond a simple listbox or a datagrid. The next option I considered was to create a heatmap – i.e. use color gradients to denote the change in stock prices relative to the previous day. But in all samples I’ve seen these symbols were placed on a regular grid and the placement didn’t correspond in any particular way with the data. I started thinking about how to sort the symbols so that those that experienced similar data change would be close to each other, and those with different data change remain further apart. This finally led me to the idea of applying &lt;a href="http://www.red3d.com/cwr/boids/"&gt;Craig Reynolds’ flocking algorithm&lt;/a&gt; to perform this clustering.  &lt;/p&gt;&lt;p&gt;Here is a screenshot from my final entry called &lt;strong&gt;Stock Information Boids&lt;/strong&gt;:  &lt;/p&gt;&lt;p align="center"&gt; &lt;a href="http://geekswithblogs.net/images/geekswithblogs_net/kobush/WindowsLiveWriter/HowIwontheLab49WPFinFinanceInnovationCon_11EC2/image_4.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="480" alt="Stock Information Boids WPF Application" src="http://geekswithblogs.net/images/geekswithblogs_net/kobush/WindowsLiveWriter/HowIwontheLab49WPFinFinanceInnovationCon_11EC2/image_thumb_1.png" width="591" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Also you can already download the source code for this application from &lt;a href="http://code.msdn.microsoft.com/KobushCode/Release/ProjectReleases.aspx?ReleaseId=667"&gt;my resource page at MSDN Code Gallery&lt;/a&gt;. Make sure to read the user guide that describes how the algorithm works and how to use the application.  &lt;/p&gt;&lt;p&gt;Turns out that for some reason the judges liked my solution, because last week at the closing keynote of 2008 &lt;a href="http://www.financialdevelopers.com"&gt;Microsoft Financial Services Developer Conference&lt;/a&gt; in New York, &lt;a href="http://blog.lab49.com/archives/1888"&gt;Daniel Chait announced&lt;/a&gt; that I won &lt;a href="http://blog.lab49.com/archives/1884"&gt;the grand prize in the contest&lt;/a&gt;!  &lt;/p&gt;&lt;p&gt;The two finalist were &lt;strong&gt;Jacob Carpenter&lt;/strong&gt; and &lt;strong&gt;Jobi K Joy&lt;/strong&gt;, while the honorable mention went to &lt;strong&gt;Paul Hounshell&lt;/strong&gt;. Congratulations guys, great work! You can download their very cool applications from here: &lt;/p&gt; &lt;p&gt;&lt;iframe style="border-right: #dde5e9 1px solid; padding-right: 0px; border-top: #dde5e9 1px solid; padding-left: 0px; padding-bottom: 0px; margin: 3px; border-left: #dde5e9 1px solid; width: 240px; padding-top: 0px; border-bottom: #dde5e9 1px solid; height: 66px; background-color: #ffffff" marginwidth="0" marginheight="0" src="http://cid-5b79e3a01fce9e08.skydrive.live.com/embedrowdetail.aspx/2008%20WPF%20in%20Finance%20Innovation%20Contest" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;/p&gt; &lt;p&gt;In following weeks I will try to share some details on my implementations (in particular about the Timeline and Flock controls). I was already told that &lt;a href="http://jobijoy.blogspot.com/"&gt;Jobi K Joy&lt;/a&gt; and &lt;a href="http://jacobcarpenter.wordpress.com/"&gt;Jacob Carpenter&lt;/a&gt; plan to do the same, so make sure to subscribe to their blogs too.  &lt;/p&gt;&lt;p&gt;I would like to thank &lt;a href="http://wpfcontest.lab49.com/judges.aspx"&gt;the judges&lt;/a&gt; for selecting my entry. And last but not least, big kisses for my wife Joanna for letting me work on the project all nights and weekends considering her present condition (L)&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=120601"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=120601" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/kobush/aggbug/120601.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Szymon Kobalczyk</dc:creator>
            <guid>http://geekswithblogs.net/kobush/archive/2008/03/17/120601.aspx</guid>
            <pubDate>Tue, 18 Mar 2008 02:39:06 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/kobush/comments/120601.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/kobush/archive/2008/03/17/120601.aspx#feedback</comments>
            <slash:comments>7</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/kobush/comments/commentRss/120601.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/kobush/services/trackbacks/120601.aspx</trackback:ping>
        </item>
        <item>
            <title>Introducing WikiSpider</title>
            <link>http://geekswithblogs.net/kobush/archive/2008/01/30/119101.aspx</link>
            <description>&lt;p&gt;About two weeks ago &lt;a href="http://www.microsoft.com/poland/developer/kontakt/dbiesiada.mspx"&gt;Daniel Biesiada&lt;/a&gt; (who is ISV DE here in Poland) announced on his blog a little &lt;a href="http://blogs.msdn.com/danieb/archive/2008/01/13/pl-geek-w-spos-b-na-nud-w-tym-konkurs.aspx"&gt;programming contest&lt;/a&gt;. The goal was to build a .NET application that would check if the the theory of &lt;a href="http://en.wikipedia.org/wiki/Six_degrees_of_separation"&gt;Six Degrees of separation&lt;/a&gt; applies to two given topics in Wikipedia. In order words to find a path from the source page to destination with no more then six links. At the time I had not much else to do (apart from setting up website for the &lt;a href="http://www.c2c2008.pl/"&gt;C2C Conference&lt;/a&gt;, helping out with the &lt;a href="http://poland.silverlightchallenge.eu/"&gt;European Silverlight Challenge&lt;/a&gt;, and preparing for the WPF Beta Exam) so I decided to give it a try. &lt;/p&gt; &lt;p&gt;Fast forward two weeks and I present you my WikiSpider:&lt;/p&gt; &lt;p align="center"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="534" alt="image" src="http://geekswithblogs.net/images/geekswithblogs_net/kobush/WindowsLiveWriter/e10a9ad47337_11C9E/image_3.png" width="600" border="0" /&gt; &lt;/p&gt; &lt;p&gt;As usual building this took me much more time than I initially anticipated (including few sleepless nights). And still I didn't make it before the deadline, so this even didn't count as a contest entry anymore (sigh!). However this was mainly because my personal goal was to throw in there every new piece of .NET 3.5 I could find fit - and most of them I never used before. &lt;/p&gt; &lt;p&gt;Here are some key technologies I managed to put into this:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;The UI is done in &lt;strong&gt;WPF&lt;/strong&gt; (and this was the only thing here I knew a bit about). However I borrowed the graph control from the excellent &lt;a href="http://j832.com/BagOTricks/"&gt;Kevin's WPF Bag-o-Tricks&lt;/a&gt;.  &lt;/li&gt;&lt;li&gt;The caching is done using &lt;strong&gt;SQL Server Express&lt;/strong&gt;. Initially I wanted to do this using &lt;strong&gt;SQL Compact &lt;/strong&gt;but I run into performance issues and had to switch to full SQL in order to run the queries in profiler. But since this was fixed (with big help from &lt;a href="http://zine.net.pl/blogs/sqlgeek/"&gt;Paweł Potasiński&lt;/a&gt;) I could try with SQL Compact again.  &lt;/li&gt;&lt;li&gt;Of course data-access is done using &lt;strong&gt;LINQ to SQL&lt;/strong&gt;. And of course this was the main source of my problems, as it was first time I've done anything in it, and so far I only read the &lt;a href="http://weblogs.asp.net/scottgu/archive/2007/08/27/linq-to-sql-part-8-executing-custom-sql-expressions.aspx"&gt;Scott Gu's tutorials&lt;/a&gt;. Still, I'm already in love with it.  &lt;/li&gt;&lt;li&gt;Speaking of LINQ. Initially we were screen scrapping the HTML pages to get all the links.  But turns out that Wikipedia has a little known about &lt;a href="http://en.wikipedia.org/w/query.php"&gt;Query API&lt;/a&gt; that enables to get the page content in XML. So the obvious move was to rewrite this part with &lt;strong&gt;LINQ to XML&lt;/strong&gt;.  &lt;/li&gt;&lt;li&gt;The path-finding algorithm was borrowed from &lt;a href="http://blogs.msdn.com/ericlippert/archive/2007/10/10/path-finding-using-a-in-c-3-0-part-four.aspx"&gt;Eric Lippert&lt;/a&gt;. The nice thing about it is that it uses lots of &lt;strong&gt;C# 3.0 language features&lt;/strong&gt;, so it is a great resource to learn from. The new C# syntax is so addictive that I already miss it in my other project.  &lt;/li&gt;&lt;li&gt;Finally, I wanted to publish the app with ClickOnce but run out of time. So maybe later. &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;I learned many interesting things and tried out some new stuff that I wanted to check out anyway. I will try to share my discoveries in the next few days, but in the meantime feel free to download and take a look at may code (I know it's not prettiest piece of code you've seen but I was in a rush to finish this on time):&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;a title="SixDegreesOfWikipedia 1.0" href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=KobushCode&amp;amp;DownloadId=686"&gt;Download the source code&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Here you can also download the entries from other participants: &lt;a href="http://www.dbiesiada.com/projects/WikiPathFinding/wikiContest_LukaszSowa.zip"&gt;Łukasz Sowa&lt;/a&gt;, &lt;a href="http://www.dbiesiada.com/projects/WikiPathFinding/wikiContest_MaciejRutkowski.zip"&gt;Maciej Rutkowski&lt;/a&gt;, and &lt;a href="http://www.dbiesiada.com/projects/WikiPathFinding/WikiContest_ArkadiuszBenedykt.zip"&gt;Arkadiusz Benedykt&lt;/a&gt;. Congratulations to all of you!&lt;/p&gt; &lt;h3&gt;Installation&lt;/h3&gt; &lt;ol&gt; &lt;li&gt;Download the code from the above link and extract it.  &lt;/li&gt;&lt;li&gt;The application uses local SQL database for caching and unfortunately you need to create it yourself (now you know why I wanted to use SQL Compact). Simply launch SSMS and create empty database called WikiCache.  &lt;/li&gt;&lt;li&gt;Run the &lt;strong&gt;Create_WikiCacheDB.sql&lt;/strong&gt; script from the &lt;strong&gt;data &lt;/strong&gt;folder to create the database schema.  &lt;/li&gt;&lt;li&gt;By default the app is configured to look for the &lt;strong&gt;WikiCache &lt;/strong&gt;database on the local &lt;strong&gt;SQLEXPRESS &lt;/strong&gt;instance. If you installed it somewhere else update the connection string in &lt;strong&gt;app.config &lt;/strong&gt;accordingly.  &lt;/li&gt;&lt;li&gt;Run the &lt;strong&gt;build.bat &lt;/strong&gt;or open solution in Visual Studio 2008 and run from there.&lt;/li&gt;&lt;/ol&gt; &lt;h3&gt;Usage&lt;/h3&gt; &lt;ol&gt; &lt;li&gt;Enter the name of the Wikipedia page in the address bar at the top and press the Go! button. The entered topic and the pages it links to will be displayed as graph.  &lt;/li&gt;&lt;li&gt;Clicking on any topic will make it currently selected (put it in the center of the graph).  &lt;/li&gt;&lt;li&gt;Right-click on any topic to open the context menu. Select "&lt;em&gt;Open in browser&lt;/em&gt;" to.... load the page in browser.  &lt;/li&gt;&lt;li&gt;Select "&lt;em&gt;Set as source&lt;/em&gt;" or "&lt;em&gt;Set as destination&lt;/em&gt;" to put the topic name in appropriate field on the sidebar &lt;br /&gt;[Note: &lt;em&gt;Currently it's the only way to show the sidebar&lt;/em&gt;]  &lt;/li&gt;&lt;li&gt;You can also enter the source/destination topics manually.  &lt;/li&gt;&lt;li&gt;When both are set click on the &lt;em&gt;Start &lt;/em&gt;button to begin searching for the path. Few statistics are displayed on the bottom of the sidebar.  &lt;/li&gt;&lt;li&gt;During the search you can still use the graph or navigate to other pages (thanks to the BackgroundWorker magic).  &lt;/li&gt;&lt;li&gt;When path is found it is displayed on the sidebar, and you can click on each topic to center it on graph. &lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Have fun! &lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=119101"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=119101" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/kobush/aggbug/119101.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Szymon Kobalczyk</dc:creator>
            <guid>http://geekswithblogs.net/kobush/archive/2008/01/30/119101.aspx</guid>
            <pubDate>Thu, 31 Jan 2008 04:22:47 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/kobush/comments/119101.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/kobush/archive/2008/01/30/119101.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/kobush/comments/commentRss/119101.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/kobush/services/trackbacks/119101.aspx</trackback:ping>
        </item>
        <item>
            <title>White paper: Designing Smart Clients Based on CAB and SCSF</title>
            <link>http://geekswithblogs.net/kobush/archive/2007/01/13/103499.aspx</link>
            <description>&lt;p&gt;A year ago I've published a series of articles on understanding Composite UI Application Block (CAB). Although I've never got to finish it I still occasionally receive comments and questions on this subject.&lt;/p&gt; &lt;p&gt;Recently I came across two great papers on CAB and SCSF that I would like to share:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=5F9A8435-1651-4BE2-956D-0446A89A7358&amp;amp;displaylang=en"&gt;Designing Smart Clients Based on CAB and SCSF&lt;/a&gt; by Mario Spuszta, is architectural guidance created for RACON Software GmbH, and later published as white paper on MSDN. It contains complete overview of CAB and SCSF, with many interesting tips on implementation and project management. It&amp;nbsp;answers many question I had when I was learning CAB.&amp;nbsp;What I particularly liked is the use case-driven strategy for identifying work items.  &lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/architecture/bb190159.aspx"&gt;Commonwealth Bank of Australia CommSee Solution: Case Study&lt;/a&gt;. Commonwealth Bank of Australia&amp;nbsp;designed, developed, and implemented its CommSee application, a relationship banking solution custom-built by the Commonwealth Bank of Australia. This &lt;a href="http://www.zdnet.com.au/news/software/soa/CommSee_an_absolute_standout_CBA_chief/0,130061733,139238388,00.htm"&gt;project was major success&lt;/a&gt; and has been successfully deployed to 30,000 users at more than 1,700 sites across Australia.&amp;nbsp;Its architecture inspired patterns&amp;amp;practices implementation of CAB and serves as great source of ideas on building composite smart clients and SOA applications. Ron Jacob recorded series of &lt;a href="http://msdn2.microsoft.com/en-us/architecture/aa948850.aspx"&gt;video interviews with the CommSee core team&lt;/a&gt;&amp;nbsp;available on Channel 9.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=103499"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=103499" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/kobush/aggbug/103499.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Szymon Kobalczyk</dc:creator>
            <guid>http://geekswithblogs.net/kobush/archive/2007/01/13/103499.aspx</guid>
            <pubDate>Sat, 13 Jan 2007 17:09:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/kobush/comments/103499.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/kobush/archive/2007/01/13/103499.aspx#feedback</comments>
            <slash:comments>5</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/kobush/comments/commentRss/103499.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/kobush/services/trackbacks/103499.aspx</trackback:ping>
        </item>
        <item>
            <title>Understanding Composite UI Application Block, Part VII</title>
            <link>http://geekswithblogs.net/kobush/archive/2006/02/26/70737.aspx</link>
            <description>&lt;p&gt;There seams to be some confusion around WorkItem's State. I've seen few posts on CAB message boards with questions if it's OK to put certain data into it. I will try to add my two cents to it but note that this is my point of view and it might be wrong.&lt;/p&gt; &lt;p&gt;Let's think for a minute what kinds of data we can have in our applications. First that comes to mind is the data that is presented to the end-user and this of course must be stored in the View (SmartPart) for the time it's displayed. This data can be loaded from some external sources (files, database) but this should be handled by services. To do their work services can also carry some runtime data that is not visible to the end-user. &lt;/p&gt; &lt;p&gt;So we have some flow of data between Views and Services (preferably with Controller or Presenter in the middle). But many times we also need to share same data between several Views. This will be for example in classical master-detail scenario when one View presents list of records and the other one shows details of currently selected record. Clearly the information of selected item lays outside of the service's domain because the same service can be used by several Views so from this standpoint it should be “stateless“. So here is where WorkItem's state comes in handy. In short State property is a loosely typed collection of items identified by some key. In my understanding it should be primary used for communication between SmartParts and other Items contained within the same WorkItem and its child WorkItems.&lt;/p&gt; &lt;p&gt;There are several mechanisms in CAB that help us with this scenarios.&lt;/p&gt; &lt;h3&gt;State change notification&lt;/h3&gt; &lt;p&gt;Often we want to react somehow to changes in State item's value. CAB automatically publishes events to state changes and allows to declare handlers simply by putting StateChangedAttribute on a method:&lt;/p&gt;&lt;pre class="csharpcode"&gt;[StateChanged(&lt;span class="str"&gt;"MyProperty"&lt;/span&gt;)]
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; MyProperty_StateChanged(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, StateChangedEventArgs args)
{
&lt;span class="rem"&gt; // handle state change&lt;/span&gt;
}&lt;/pre&gt;
&lt;p&gt;The StateChangedEventArgs contain State item's key, and both old and new values. Of course there can be more then one handler to this event. Also check out &lt;a href="http://luifit.net/blogs/jluif/PermaLink,guid,8cf9a782-d629-4f49-ac9b-6d22c8ae9598.aspx"&gt;John Luif's blog entry&lt;/a&gt; on this.&lt;/p&gt;
&lt;h3&gt;Injecting State into child WorkItems &lt;/h3&gt;
&lt;p&gt;Sometimes we need to pass the current value of some State item from parent WorkItem to the newly created child WorkItem. We can do this by manually copying the respective values or let the CAB do the work for us. To indicate that property value or constructor parameter should be injected from parent WorkItem's State we can use the StateAttribute:&lt;/p&gt;&lt;pre class="csharpcode"&gt;[State(&lt;span class="str"&gt;"MyProperty"&lt;/span&gt;)]
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; MyChildProperty
{
get { ... }
set { ... }
}&lt;/pre&gt;
&lt;p&gt;Note that this will only copy the value when child WorkItem is created and won't update it when it changes on parent WorkItem. There are some restrictions when using state injection and be sure to read two excellent entries on &lt;a href="http://staff.southworks.net/blogs/mariano/archive/category/1043.aspx"&gt;Mariano's Szklanny blog&lt;/a&gt; on how to avoid them.&lt;/p&gt;
&lt;h3&gt;Persisting WorkItem's State &lt;/h3&gt;
&lt;p&gt;Finally, CAB defines IStatePersistenceService that allows to persist WorkItem's State between sessions. Out of the box CAB provides to implementations: FileStatePersistenceService and IsolatedStorageStatePersistenceService. Both store state in binary files using the BinaryFormater serializer, but the later one uses Isolated Storage so it should work in restricted access scenarios. Both inherit from StreamStatePersistantService base class with you can also use to implement you own service.&lt;/p&gt;
&lt;p&gt;This service does not load by default and you need to add following entry in app.config to enable it:&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;CompositeUI&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt; &amp;lt;&lt;/span&gt;&lt;span class="html"&gt;services&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt; &amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;serviceType&lt;/span&gt;&lt;span class="kwrd"&gt;="Microsoft.Practices.CompositeUI.Services.IStatePersistenceService,
Microsoft.Practices.CompositeUI"&lt;/span&gt; 
&lt;span class="attr"&gt; instanceType&lt;/span&gt;&lt;span class="kwrd"&gt;="Microsoft.Practices.CompositeUI.Services.IsolatedStorageStatePersistenceService,
Microsoft.Practices.CompositeUI"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt; span class="html"&amp;gt;services&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;span class="html"&amp;gt;CompositeUI&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;To store or retrieve WorkItem's State simply use it's Save() and Load() methods. Note that it uses WorkItem's name to uniquely identify that WorkItem's state so make sure you assign it to the same value before saving and loading. &lt;/p&gt;&lt;p&gt;I haven't tried this one yet but it opens some interesting possibilities.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;As example of using state let's take a look at the Inventory WorkItem of my sample application. There are three primary views in this WorkItem: Product list, Items list and Item details. When user selects a product category the first view shows list of products for this category. Next when product is selected second view shows product items. Then after selecting the item it's details are presented on the final view. The IDs of currently selected records are stored in Inventory WorkItem's state and the View's are wired to state change events so they react immediately to any changes.&lt;/p&gt;&lt;p&gt;Currently only one view is displayed at a time but now we can easily build an "Advanced View" that will show all three views at once. We will start by creating container SmartParts for both modes. SimpleView hosts a DeckWorkspace while AdvancedView contains ZoneWorkspace with two SplitContainers. Both also contain simple link buttons to switch the view. These buttons invoke a TogleValueCommand that changes the value of the ViewMode property. This in turn rises a StateChange event that is handled in ViewMode_StateChanged method. Finally this method changes the current container view and moves the three inventory views to current workspace. It also tries to maintain current active SmartPart. &lt;/p&gt;&lt;p&gt;You can see the inventory screens in both modes below:&lt;/p&gt;&lt;center&gt;&lt;img src="/images/geekswithblogs_net/kobush/1591/o_inventory.jpg" /&gt;&lt;/center&gt;&lt;p&gt;But the nicest part in all this that I didn't have to change the existing SmartParts at all! They were already communicating with State and changing their arrangement on screen didn't required any changes to their code. Isn't that cool or what :-)&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;hr /&gt;

&lt;p&gt;&lt;strong&gt;Updated 10/05/2009: &lt;/strong&gt;Since ProjectDistributor.net is gone I’ve moved the source code to my SkyDrive. You can grab it here:&lt;/p&gt;
&lt;p&gt; &lt;iframe style="padding-bottom: 0px; background-color: #fcfcfc; padding-left: 0px; width: 98px; padding-right: 0px; height: 115px; padding-top: 0px" title="Preview" marginheight="0" src="http://cid-4c7ec0c2176a0b0d.skydrive.live.com/embedicon.aspx/Blog/SmartPetShop^_20060219.zip" frameborder="0" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=70737"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=70737" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/kobush/aggbug/70737.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Szymon Kobalczyk</dc:creator>
            <guid>http://geekswithblogs.net/kobush/archive/2006/02/26/70737.aspx</guid>
            <pubDate>Sun, 26 Feb 2006 13:57:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/kobush/comments/70737.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/kobush/archive/2006/02/26/70737.aspx#feedback</comments>
            <slash:comments>18</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/kobush/comments/commentRss/70737.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/kobush/services/trackbacks/70737.aspx</trackback:ping>
        </item>
        <item>
            <title>CAB sample published and future plans</title>
            <link>http://geekswithblogs.net/kobush/archive/2006/02/19/70044.aspx</link>
            <description>&lt;P&gt;The source code for SmartPetShop, my sample project for Composite UI Application Block, is now &lt;A href="http://projectdistributor.net/Projects/Project.aspx?projectId=192"&gt;available for download&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;If you want to run it, first I recommend to download and install the original &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/petshop3x.asp"&gt;PetShop.NET 3.2 from Microsoft&lt;/A&gt; , as it will setup properly the database and register COM+ services. After that you should update the connection strings in Win application's app.config with encrypted settings taken from original Web PetShop's web.config. Simply find settings like &lt;ADD KEY="SQLCONNSTRINGX" ... &gt;and copy them to app.config. Later I will try to provide my own installation scripts for this. Finally, to compile the code you would need to place CAB DLL's om the Lib folder. 
&lt;P&gt;Currently my changes concentrate only on presentation layer so I simply replaced the Web project with my own Win project. All other code remains unchanged (with kind of proves that this is indeed well architected application).&lt;/P&gt;
&lt;H3&gt;Future plans&lt;/H3&gt;
&lt;P&gt;My first goal was to create sample application that would demonstrate how CAB can be used in real-life project. But during the process I realized I can further extend this sample and try to apply some other new technologies emerging in .NET world. So here are my future plans for this project. &lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Finish conversion to Windows Forms&lt;/STRONG&gt; 
&lt;P&gt;From the original Web PetShop there is only couple of functions left to implement (for placing orders). But looking at CAB I already covered following features: &lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://geekswithblogs.net/kobush/archive/2006/01/06/65129.aspx"&gt;SmartParts and Workspaces&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://geekswithblogs.net/kobush/archive/2006/01/09/65305.aspx"&gt;WorkItems &lt;/A&gt;
&lt;LI&gt;&lt;A href="http://geekswithblogs.net/kobush/archive/2006/01/13/65775.aspx"&gt;MVP and MVC patterns&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://geekswithblogs.net/kobush/archive/2006/01/24/66946.aspx"&gt;Commands and UIElements&lt;/A&gt; 
&lt;LI&gt;and &lt;A href="http://geekswithblogs.net/kobush/archive/2006/02/05/68250.aspx"&gt;Custom UIElementAdapters&lt;/A&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;To make it complete I still need to discuss:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://geekswithblogs.net/kobush/archive/2006/02/26/70737.aspx"&gt;WorkItem's State and StateChange events&lt;/A&gt; 
&lt;LI&gt;Services 
&lt;LI&gt;Events and background processing 
&lt;LI&gt;Modules and WorkItem extensions 
&lt;LI&gt;ObjectBuilder&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;/P&gt;
&lt;LI&gt;&lt;STRONG&gt;Reimplement Data Access Layer using Enterprise Library&lt;/STRONG&gt; 
&lt;P&gt;CAB is only a little brother of EntLib so I think it makes sense to show how to use them both in the same application. I'm also curious to what degree it will simplify the original code for the data access and business logic layers. I will definitely explore the Data Access AppBlock but I will also try include others like Logging, Exception Handling and Caching. Also, I should try to replace the PetShop's ConfigTool with EntLib's Configuration. At the same time I would try to deploy the database on MS SQL 2005 Express using user instance databases and embedded update scripts (seen nice articles on both recently).&lt;/P&gt;
&lt;LI&gt;&lt;STRONG&gt;Separate client code from server&lt;/STRONG&gt; 
&lt;P&gt;I called my version SmartPetShop to indicate that it will support the SmartClient architecture. There are three main characteristics of SmartClients: rich user experience, intelligent updates, and offline capabilities. If we assume that my CAB implementation provides richer experience that the previous Web based (actually it tries to mimic it closely) there are two things left to address. For installation and updates I would use ClickOnce, but there is not much to say that wasn't well known already. So last thing is to enable the application to work without connection to server. In this mode it should at least enable to browse the product catalog and place items in shopping cart. Then, when application goes on-line, user can submit orders and check status of earlier orders.&lt;/P&gt;
&lt;P&gt;Currently the application connects directly to database so the main task here would be to move the data access and business logic to separate server process. Necessity to connect these two will allow me to explore another exciting new technology, the &lt;STRONG&gt;Windows Communication Foundation&lt;/STRONG&gt; (aka Indigo). This will also test the current architecture as it seems that it should suffice to switch ServiceAgent implementations and there should be no change to UI logic.&lt;/P&gt;
&lt;LI&gt;&lt;STRONG&gt;Another type of client&lt;/STRONG&gt; 
&lt;P&gt;When I'm done with above I should have working example of SmartClient. Then I can try to implement another type of clients. There are two candidates. I'm really excited to start working with &lt;STRONG&gt;Windows Presentation Foundation&lt;/STRONG&gt; (aka Avalon), however I don't think I would have opportunity to apply it in my professional work in foreseeable future. It is more likely that I would need to refresh my skills in ASP.NET. I stopped working on Web apps almost one and a half years ago and didn't had opportunity to try out all the goodies in ASP.NET 2.0. I'm also excited about the Atlas extensions since I've done some work with AJAX technologies on my own (some really cool DHTML behaviors). &lt;/P&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;So here you have it. I will try to do as much as I can of this in upcoming months. I need to learn these things anyway but if I also put myself to write about it the process is more systematic. Feel free to drop me a note if you have additional ideas or like me to explore any particular topic more closely.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Update:&lt;/STRONG&gt; I just discovered that last week Microsoft released &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/bdasamppet4.asp"&gt;.NET Pet Shop 4.0&lt;/A&gt;. What a perfect timing! I guess I need to revise my goals as some became obsolete. Most notably these guys saved me work (and pleasure) of upgrading to ASP.NET 2.0. I haven't reviewed the code yet but judging from the accompyning article most changes were made to the presentation layer (bummer!). However, it seems it would be easier to update my code base now before starting any modifications to other layers. Anyway, it's great this project is not dead and I'm sure it will be valuable source of information on building enterprise .NET 2.0 applications for everyone. &lt;/P&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=70044"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=70044" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/kobush/aggbug/70044.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Szymon Kobalczyk</dc:creator>
            <guid>http://geekswithblogs.net/kobush/archive/2006/02/19/70044.aspx</guid>
            <pubDate>Sun, 19 Feb 2006 17:46:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/kobush/comments/70044.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/kobush/archive/2006/02/19/70044.aspx#feedback</comments>
            <slash:comments>10</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/kobush/comments/commentRss/70044.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/kobush/services/trackbacks/70044.aspx</trackback:ping>
        </item>
        <item>
            <title>Understanding Composite UI Application Block, Part VI</title>
            <link>http://geekswithblogs.net/kobush/archive/2006/02/05/68250.aspx</link>
            <description>&lt;P&gt;It's been over a week since my last post on Composite UI App Block, but don't start thinking I have given up on it already. I still want to finish the PetShop sample and at the same time to cover all important parts of CAB on this blog.&lt;/P&gt;
&lt;P&gt;Last time I have covered some basics on using Commands and UI Elements and demonstrated how I implemented commands in my sample application. But as I said before, out of the box CAB only has UIElementAdapters for ToolStrips and MenuStrips. Just to get started I put all my commands on the main menu, but the original PetShop was a web app so this were all links. So it got me thinking what it takes to implement my own UIElementAdapter. For most people support for menus and toolstrip could be enough, but some of us use third-party controls or wants to invoke commands from other controls like trees, or Outlook style navigation bars. I think knowing how to extend CAB to handle such situation can be helpful.&lt;/P&gt;
&lt;P&gt;(On the other hand, I heard on ARCast that Infragistics committed to release CAB wrappers for their controls so those of you who use NetAdvantage don't need to read any further).&lt;/P&gt;
&lt;P&gt;First thing was to create the control that will display my links and fire events when one is clicked. For this I have extended the standard &lt;SPAN style="FONT-FAMILY: Courier New"&gt;LinkLabel&lt;/SPAN&gt; adding collection of my own LinkListItems. These items are similar to a menu items having Text, Enabled, and Visible properties, and a Click event. The control automatically updates itself based on these settings. Under the hood it constructs a single line from the texts of all visible items inserting bars ( | ) as separators, and it positions a LinkArea on each enabled item. Then upon receiving LinkClicked event it propagates it back to corresponding item and fires its Click event. It took ~200 lines of code but there is nothing fancy so I won't bore you with it here.&lt;/P&gt;
&lt;P&gt;Now having the control ready I need to plug it into the CAB framework. There are three additional elements that I need to provide: IUIElementAdapter, IUIElementAdapterFactory, and CommandAdapter.&lt;/P&gt;
&lt;P&gt;As explained in last post, UIElement adapter is responsible for properly showing items of given UIElement type. This interface has only two methods: Add and Remove that are called each time items are added or removed from extension site. In my case these methods simply add or remove items from the LinkList items collection:&lt;/P&gt;&lt;PRE class=csharpcode&gt;&lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;public&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;class&lt;/FONT&gt;&lt;/SPAN&gt; LinkListUIAdapter : UIElementAdapter&lt;LINKLISTITEM&gt;
{
    LinkList linkList;

    &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;public&lt;/FONT&gt;&lt;/SPAN&gt; LinkListUIAdapter(LinkList linkList)
    {
        Guard.ArgumentNotNull(linkList, &lt;SPAN class=str&gt;&lt;FONT color=#006080&gt;"linkList"&lt;/FONT&gt;&lt;/SPAN&gt;);
        &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;this&lt;/FONT&gt;&lt;/SPAN&gt;.linkList = linkList;
    }

    &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;protected&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;override&lt;/FONT&gt;&lt;/SPAN&gt; LinkListItem Add(LinkListItem uiElement)
    {
        &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;if&lt;/FONT&gt;&lt;/SPAN&gt; (linkList == &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;null&lt;/FONT&gt;&lt;/SPAN&gt;)
            &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;throw&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;new&lt;/FONT&gt;&lt;/SPAN&gt; InvalidOperationException();

        linkList.Items.Add(uiElement);
        &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;return&lt;/FONT&gt;&lt;/SPAN&gt; uiElement;
    }

    &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;protected&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;override&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;void&lt;/FONT&gt;&lt;/SPAN&gt; Remove(LinkListItem uiElement)
    {
        &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;if&lt;/FONT&gt;&lt;/SPAN&gt; (uiElement.Owner != &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;null&lt;/FONT&gt;&lt;/SPAN&gt;)
            uiElement.Owner.Items.Remove(uiElement);
    }
}&lt;/PRE&gt;
&lt;P&gt;The role of &lt;SPAN style="FONT-FAMILY: Courier New"&gt;IUIElementAdapterFactory&lt;/SPAN&gt; is to provide appropriate UIElementAdapter instances for given UIElement's type. The &lt;SPAN style="FONT-FAMILY: Courier New"&gt;Supports&lt;/SPAN&gt; method should indicate if particular factory supports the given UI Elements type, and then &lt;SPAN style="FONT-FAMILY: Courier New"&gt;GetAdapter&lt;/SPAN&gt; methods should create adapter for that UI Element.&lt;/P&gt;&lt;PRE class=csharpcode&gt;&lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;public&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;class&lt;/FONT&gt;&lt;/SPAN&gt; LinkListItemAdapterFactory : IUIElementAdapterFactory
{
    &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;public&lt;/FONT&gt;&lt;/SPAN&gt; IUIElementAdapter GetAdapter(&lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;object&lt;/FONT&gt;&lt;/SPAN&gt; uiElement)
    {
        &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;if&lt;/FONT&gt;&lt;/SPAN&gt; (uiElement &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;is&lt;/FONT&gt;&lt;/SPAN&gt; LinkList)
            &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;return&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;new&lt;/FONT&gt;&lt;/SPAN&gt; LinkListUIAdapter((LinkList)uiElement);

        &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;throw&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;new&lt;/FONT&gt;&lt;/SPAN&gt; ArgumentException(&lt;SPAN class=str&gt;&lt;FONT color=#006080&gt;"uiElement"&lt;/FONT&gt;&lt;/SPAN&gt;);
    }

    &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;public&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;bool&lt;/FONT&gt;&lt;/SPAN&gt; Supports(&lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;object&lt;/FONT&gt;&lt;/SPAN&gt; uiElement)
    {
        &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;return&lt;/FONT&gt;&lt;/SPAN&gt; (uiElement &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;is&lt;/FONT&gt;&lt;/SPAN&gt; LinkList);
    }
}&lt;/PRE&gt;
&lt;P&gt;If we want to be able to attach command to the UI Elements we also need to provide a CommandAdapter. It's purpose is to provide logic that is needed for UIElement to invoke a Command, and also to synchronize changes to Command with the UI Element. Luckily for me the first part is handled by the base class EventCommandAdapter, so I only had to make sure that changes to Command status will be applied to the corresponding link:&lt;/P&gt;&lt;PRE class=csharpcode&gt;&lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;public&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;class&lt;/FONT&gt;&lt;/SPAN&gt; LinkListItemCommandAdapter : EventCommandAdapter&lt;LINKLISTITEM&gt;
{
    &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;public&lt;/FONT&gt;&lt;/SPAN&gt; LinkListItemCommandAdapter()
        : &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;base&lt;/FONT&gt;&lt;/SPAN&gt;()
    { }

    &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;public&lt;/FONT&gt;&lt;/SPAN&gt; LinkListItemCommandAdapter(LinkListItem item, &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;string&lt;/FONT&gt;&lt;/SPAN&gt; eventName)
        : &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;base&lt;/FONT&gt;&lt;/SPAN&gt;(item, eventName)
    { }

    &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;protected&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;override&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;void&lt;/FONT&gt;&lt;/SPAN&gt; OnCommandChanged(Command command)
    {
        &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;base&lt;/FONT&gt;&lt;/SPAN&gt;.OnCommandChanged(command);

        &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;foreach&lt;/FONT&gt;&lt;/SPAN&gt; (KeyValuePair&lt;LINKLISTITEM, class=kwrd List&lt;&lt;SPAN&gt;&lt;FONT color=#0000ff&gt;string&lt;/FONT&gt;&lt;/SPAN&gt;&amp;gt;&amp;gt; pair &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;in&lt;/FONT&gt;&lt;/SPAN&gt; Invokers)
        {
            pair.Key.Enabled = (command.Status == CommandStatus.Enabled);
            pair.Key.Visible = (command.Status != CommandStatus.Unavailable);
        }
    }
}&lt;/PRE&gt;
&lt;P&gt;Having all these three pieces we can now register them in CAB. It should be done in the AfterShellCreated method of the ShellApplication class:&lt;/P&gt;&lt;PRE class=csharpcode&gt;&lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;protected&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;override&lt;/FONT&gt;&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;void&lt;/FONT&gt;&lt;/SPAN&gt; AfterShellCreated()
{
    &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;base&lt;/FONT&gt;&lt;/SPAN&gt;.AfterShellCreated();

    ICommandAdapterMapService mapService = 
        RootWorkItem.Services.Get&lt;ICOMMANDADAPTERMAPSERVICE&gt;();
    mapService.Register(&lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;typeof&lt;/FONT&gt;&lt;/SPAN&gt;(LinkListItem), &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;typeof&lt;/FONT&gt;&lt;/SPAN&gt;(LinkListItemCommandAdapter));

    IUIElementAdapterFactoryCatalog catalog = 
        RootWorkItem.Services.Get&lt;IUIELEMENTADAPTERFACTORYCATALOG&gt;();
    catalog.RegisterFactory(&lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;new&lt;/FONT&gt;&lt;/SPAN&gt; LinkListItemAdapterFactory());
}&lt;/PRE&gt;Finally we have all set up and we are ready to use the new UI Elements. But the best thing it was, that the only change I had to make was to replace references to &lt;SPAN style="FONT-FAMILY: Courier New"&gt;ToolStripMenuItem&lt;/SPAN&gt; with my own &lt;SPAN style="FONT-FAMILY: Courier New"&gt;LinkListItems&lt;/SPAN&gt; like this:&lt;BR&gt;&lt;PRE class=csharpcode&gt;  LinkListItem signInItem = &lt;SPAN class=kwrd&gt;&lt;FONT color=#0000ff&gt;new&lt;/FONT&gt;&lt;/SPAN&gt; LinkListItem(&lt;SPAN class=str&gt;&lt;FONT color=#006080&gt;"SIGN IN"&lt;/FONT&gt;&lt;/SPAN&gt;);
  UIExtensionSites[&lt;SPAN class=str&gt;&lt;FONT color=#006080&gt;"NavigationBar"&lt;/FONT&gt;&lt;/SPAN&gt;].Add(signInItem);
  Commands[&lt;SPAN class=str&gt;&lt;FONT color=#006080&gt;"SignIn"&lt;/FONT&gt;&lt;/SPAN&gt;].AddInvoker(signInItem, &lt;SPAN class=str&gt;&lt;FONT color=#006080&gt;"Click"&lt;/FONT&gt;&lt;/SPAN&gt;);
&lt;/PRE&gt;&lt;BR&gt;All the other code that handles commands and updates their status remains unchanged. And thats the real advantage of CAB! &lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=68250"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=68250" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/kobush/aggbug/68250.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Szymon Kobalczyk</dc:creator>
            <guid>http://geekswithblogs.net/kobush/archive/2006/02/05/68250.aspx</guid>
            <pubDate>Mon, 06 Feb 2006 01:54:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/kobush/comments/68250.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/kobush/archive/2006/02/05/68250.aspx#feedback</comments>
            <slash:comments>8</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/kobush/comments/commentRss/68250.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/kobush/services/trackbacks/68250.aspx</trackback:ping>
        </item>
        <item>
            <title>Understanding Composite UI Application Block, Part V</title>
            <link>http://geekswithblogs.net/kobush/archive/2006/01/24/66946.aspx</link>
            <description>In most applications certain user interface areas are shared among various modules. Examples are all kinds of menus, tool bars, status bars, Outlook style sidebars and others. What is common for all of them is that they serve as containers for collections items (menu items, toolbar buttons, etc.) that user can activate to trigger some actions in the application. For example, the &lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"&gt;File &amp;gt; Open&lt;/SPAN&gt; menu item normally would invoke the action of opening a file. However same action could be also accessible using a toolbar button. So it is desirable that we could decouple the user interface elements from the actions that they trigger. CAB provides solution for this in the form of &lt;STRONG&gt;UIElements&lt;/STRONG&gt; and &lt;STRONG&gt;Commands&lt;/STRONG&gt;.&amp;nbsp;&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;UIExtensionSites&lt;/STRONG&gt; are the shared containers that can contain your &lt;STRONG&gt;UIElements&lt;/STRONG&gt;. Out of the box CAB provides support for &lt;STRONG&gt;MenuStrips&lt;/STRONG&gt; and &lt;STRONG&gt;ToolBarStrips&lt;/STRONG&gt; but you can easily add support for other elements by implementing your own &lt;STRONG&gt;UIElementAdapter&lt;/STRONG&gt;. After you add a menu or toolbar to your SmartPart you need to register it as an &lt;STRONG&gt;extension site&lt;/STRONG&gt;, by calling the RegisterSite method on the WorkItem.UIExtensionsSites collection and providing unique identifier for that site. Usually extension sites are registered in the RootWorkItem by the developer of shell the application. Later when module developer needs to add his own items to that site he only need to create these items as usual and than call the Add method of the specific UIExtensionSite. The corresponding UIElementAdapter is responsible for properly showing items for given UIElement type. &lt;BR&gt;&lt;BR&gt;Next step is to attach &lt;STRONG&gt;Commands&lt;/STRONG&gt; to your UIElements. Commands are used to assign easily the same code to multiple UIElements. To declare command you need to create event handler that implements your action. Then you add the &lt;STRONG&gt;CommandHandler&lt;/STRONG&gt; attribute to the method declaration specifying command name. To assign Command with a UIElement you can call the &lt;STRONG&gt;AddInvoker&lt;/STRONG&gt; method on specific Commands collection passing reference to the UIElement and specifying name of its event that will trigger the action. &lt;BR&gt;
&lt;HR&gt;
All pages in the .NET PetShop sample share a common NavigationBar that contains links to following pages: Sign In, Sign Out, Edit Account, View Shopping Cart and the Search TextBox. So we can consider them as UIElements that invoke Commands in different modules. For example, SignIn command is handled in the Account module, and ViewShoppingCart is handled in the Orders module. So it would be nice if each module could register the commands it provides and the Shell doesn't need to know anything besides providing an extension site for them.&lt;BR&gt;&lt;BR&gt;Because out of the box CAB only supports UIElementAdapters for toolbars and menus for now I will implement the navigation bar in form of the main menu to see how this works. Later I can implement a custom UIElementAdapter that would closely match the web style. &lt;BR&gt;&lt;BR&gt;First I need to add a MenuStrip to the the ShellForm and make it publicly accessible. Then I can register it as UIExtensionSite by adding following line in ShellApplication's AfterShellCreated method:&lt;BR&gt;&lt;PRE&gt;  RootWorkItem.UIExtensionSites.RegisterSite("NavBar", Shell.menuStrip);&lt;/PRE&gt;Basically that is all that shell developer needs to do -- the rest belongs to module developers. So I quickly switch hats, and go to the account management module. Let's start by adding the SignIn button. In the OnRunStarted method of AccountWorkItem I add following lines:&lt;BR&gt;&lt;PRE&gt;  ToolStripMenuItem signInItem = new ToolStripMenuItem("SIGN IN");
  UIExtensionSites["NavBar"].Add(signInItem);&lt;/PRE&gt;As you can see, first I create a normal ToolStripMenuItem. But then, instead of adding it directly to a MenuStrip, I add it to the UIExtendsionSite defined earlier. Internally CAB finds the MenuStrip defined earlier in ShellForm and passes it together with the menu item to the correct UIElementAdapter with knows how to handle them both correctly. &lt;BR&gt;&lt;BR&gt;Now, when I run the application I should see my first menu item and I can add items for other two commands (SignOut and EditAccount) the same way. However, clicking all these menu items does nothing so I need to attach handlers for appropriate events on these items. I could to this the usual way by directly attaching instance method to the Click event but in CAB we should use Commands to handle such things. Following line will register the Click event of the SignIn menu item as invoker for the SignInCommand:&lt;BR&gt;&lt;PRE&gt; Commands["SignInCommand"].AddInvoker(signInItem, "Click");&lt;/PRE&gt;To handle this command I need to declare the event handler and mark it with CommandHandler attribute:&lt;BR&gt;&lt;PRE&gt;  [CommandHandler("SignInCommand")]
  public void SignInHandler(object sender, EventArgs e)
  {
    SignIn();
  }&lt;/PRE&gt;What is important is that command handlers and UI elements that invoke them doesn't need to be defined in the same class or in other way directly accessible. For example, the command could be invoked in one WorkItem and handled in another WorkItem, SmartPart or Presenter. And I guess that there can be multiple handlers as well as many invokers attached to single command but I haven't tried this yet.&lt;BR&gt;&lt;BR&gt;In many cases command's availability depends of the application's state. For example, toolbar's undo button would be disabled if user hasn't made any modifications. In my case the SignIn button should be visible only if no user has authenticated and SignOut and My Account buttons should be visible otherwise. Normally I would control this by setting the Visible property on MenuItems but again in CAB I can do this indirectly using Commands. This ensures that if there are multiple UIElements for the same Command then all of them would get updated accordingly. Commands define the Status property that can have one of three values: Enabled, Disabled and Unavailable. When value of this property changes, the adapters linked to particular command can apply these changes to the corresponding UIElements. So in my case when user signs in or signs out I execute following code:&lt;BR&gt;&lt;PRE&gt;  if (userAuthenticated) 
    Commands["CommandSignIn"].Status = CommandStatus.Unavailable; 
  else
    Commands["CommandSignIn"].Status = CommandStatus.Enabled;&lt;/PRE&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=66946"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=66946" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/kobush/aggbug/66946.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Szymon Kobalczyk</dc:creator>
            <guid>http://geekswithblogs.net/kobush/archive/2006/01/24/66946.aspx</guid>
            <pubDate>Wed, 25 Jan 2006 00:28:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/kobush/comments/66946.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/kobush/archive/2006/01/24/66946.aspx#feedback</comments>
            <slash:comments>14</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/kobush/comments/commentRss/66946.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/kobush/services/trackbacks/66946.aspx</trackback:ping>
        </item>
    </channel>
</rss>