<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>WPF</title>
        <link>http://geekswithblogs.net/kobush/category/6488.aspx</link>
        <description>Information and articles about the Windows Presentation Foundation. </description>
        <language>pl-PL</language>
        <copyright>Szymon Kobalczyk</copyright>
        <managingEditor>skobalczyk@gmail.com</managingEditor>
        <generator>Subtext Version 0.0.0.0</generator>
        <item>
            <title>Multi-touch in WPF4.0 Beta2</title>
            <link>http://geekswithblogs.net/kobush/archive/2009/10/28/135767.aspx</link>
            <description>&lt;p&gt;Now that .NET Framework 4.0 Beta 2 is out let’s look again what is available for building multi-touch application in WPF. In Beta 1 we got only a preview of manipulation and inertia components. With Beta 2 we finally get access to whole touch input system, and it looks very close to what was shown on PDC last year. Here is an &lt;a href="http://msdn.microsoft.com/en-us/library/bb613588(VS.100).aspx#touch_and_manipulation"&gt;overview from MSDN&lt;/a&gt;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Elements in WPF now accept touch input. The &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.uielement(VS.100).aspx"&gt;UIElement&lt;/a&gt;, and &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.uielement3d(VS.100).aspx"&gt;UIElement3D&lt;/a&gt;, and &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.contentelement(VS.100).aspx"&gt;ContentElement&lt;/a&gt; classes expose events that occur when a user touches an element on a touch-enabled screen. The following events are defined on &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.uielement(VS.100).aspx"&gt;UIElement&lt;/a&gt; and respond to touch input. Note that these events are also defined on &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.uielement3d(VS.100).aspx"&gt;UIElement3D&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.contentelement(VS.100).aspx"&gt;ContentElement&lt;/a&gt;.&lt;/p&gt;    &lt;ul&gt;     &lt;li&gt;       &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.uielement.previewtouchdown(VS.100).aspx"&gt;PreviewTouchDown&lt;/a&gt;&lt;/p&gt;     &lt;/li&gt;      &lt;li&gt;       &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.uielement.touchdown(VS.100).aspx"&gt;TouchDown&lt;/a&gt;&lt;/p&gt;     &lt;/li&gt;      &lt;li&gt;       &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.uielement.previewtouchmove(VS.100).aspx"&gt;PreviewTouchMove&lt;/a&gt;&lt;/p&gt;     &lt;/li&gt;      &lt;li&gt;       &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.uielement.touchmove(VS.100).aspx"&gt;TouchMove&lt;/a&gt;&lt;/p&gt;     &lt;/li&gt;      &lt;li&gt;       &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.uielement.previewtouchup(VS.100).aspx"&gt;PreviewTouchUp&lt;/a&gt;&lt;/p&gt;     &lt;/li&gt;      &lt;li&gt;       &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.uielement.touchup(VS.100).aspx"&gt;TouchUp&lt;/a&gt;&lt;/p&gt;     &lt;/li&gt;      &lt;li&gt;       &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.uielement.gottouchcapture(VS.100).aspx"&gt;GotTouchCapture&lt;/a&gt;&lt;/p&gt;     &lt;/li&gt;      &lt;li&gt;       &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.uielement.losttouchcapture(VS.100).aspx"&gt;LostTouchCapture&lt;/a&gt;&lt;/p&gt;     &lt;/li&gt;      &lt;li&gt;       &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.uielement.touchenter(VS.100).aspx"&gt;TouchEnter&lt;/a&gt;&lt;/p&gt;     &lt;/li&gt;      &lt;li&gt;       &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.uielement.touchleave(VS.100).aspx"&gt;TouchLeave&lt;/a&gt;&lt;/p&gt;     &lt;/li&gt;   &lt;/ul&gt;    &lt;p&gt;In addition to the touch events, the &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.uielement(VS.100).aspx"&gt;UIElement&lt;/a&gt; supports manipulation. A manipulation is interpreted to scale, rotate, or translate the &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.uielement(VS.100).aspx"&gt;UIElement&lt;/a&gt;. For example, a photo viewing application might allow users to move, zoom, resize, and rotate a photo by touching the computer screen over the photo. The following events have been added to &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.uielement(VS.100).aspx"&gt;UIElement&lt;/a&gt;:&lt;/p&gt;    &lt;ul&gt;     &lt;li&gt;       &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.uielement.manipulationstarted(VS.100).aspx"&gt;ManipulationStarted&lt;/a&gt;&lt;/p&gt;     &lt;/li&gt;      &lt;li&gt;       &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.uielement.manipulationdelta(VS.100).aspx"&gt;ManipulationDelta&lt;/a&gt;&lt;/p&gt;     &lt;/li&gt;      &lt;li&gt;       &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.uielement.manipulationinertiastarting(VS.100).aspx"&gt;ManipulationInertiaStarting&lt;/a&gt;&lt;/p&gt;     &lt;/li&gt;      &lt;li&gt;       &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.uielement.manipulationcompleted(VS.100).aspx"&gt;ManipulationCompleted&lt;/a&gt;&lt;/p&gt;     &lt;/li&gt;      &lt;li&gt;       &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.uielement.manipulationboundaryfeedback(VS.100).aspx"&gt;ManipulationBoundaryFeedback&lt;/a&gt;&lt;/p&gt;     &lt;/li&gt;   &lt;/ul&gt;    &lt;p&gt;To enable manipulation, set the &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.uielement.ismanipulationenabled(VS.100).aspx"&gt;IsManipulationEnabled&lt;/a&gt; to true. &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This is exactly what we were waiting for. I started playing with this new API and I will try to share some samples soon. But here is one problem I run into already. When I tried to use touch in ordinary WPF application, I noticed that all Buttons have a weird behavior, so that when I touched the Button it didn’t go into a pressed state immediately (I’m testing this on HP TouchSmart). Instead it only fires the Click event when I lift the finger. Testing it more I noticed that on any UIElement it won’t fire the MouseDown event until I lift the finger or slide it quite a bit. &lt;/p&gt;  &lt;p&gt;To help me diagnose this issue I created a simple test application shown here:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="multitouchtest" border="0" alt="multitouchtest" src="http://geekswithblogs.net/images/geekswithblogs_net/kobush/WindowsLiveWriter/7a3994036819_639C/multitouchtest_3.png" width="800" height="380" /&gt; &lt;/p&gt;  &lt;p&gt;From left to right I have gray rectangles that react to input events from mouse, stylus and touch. Each rectangle will change color to orange when mouse or stylus is over, and to green when is pressed. In addition, on press I capture the appropriate device and during capture the border changes color to red. &lt;/p&gt;  &lt;p&gt;This test confirms that when I use touch panel then the xxxDown events don’t arrive immediately regardless of the device used. I spent quite a while trying to figure it out and trying various settings in both the Touch and Pen Control Panel and the &lt;a href="http://www.nextwindow.com/assets/files/nwtouch28_inst.exe"&gt;NextWindow’s USB Config utility&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;Finally I noticed that somehow this works perfectly fine when I use manipulations. From this I quickly found that this problem goes away when you set &lt;strong&gt;IsManipulationEnabled&lt;/strong&gt; property on the element. Turns out that the side effect of setting this property to true is also changing the stylus properties to disable PressAndHold and Flicks gestures on the element. This explains this problem because stylus engine has to postpone these events trying to interpret the gestures. You can see the difference by selecting the appropriate checkbox on the window.&lt;/p&gt;  &lt;p&gt;However although now we get the xxxDown events immediately (which will be very useful for manipulations) this doesn’t fix the problem with Button pressed state. You will notice that MouseDown event is still deferred regardless of the IsManipulationEnabled settings. I believe that in this case this might be caused by input logic in Windows itself. In fact the only way I could affect this was to force the touch panel to report input as mouse events (using NextWindow’s USB Config tool).&lt;/p&gt;  &lt;p&gt;In the end I believe the proper fix for this would require extending all WPF built-in controls so that they understand the touch events and react accordingly. At the same time some controls might get some multi-touch specific behaviors as well. For example it was &lt;a href="http://weblogs.asp.net/scottgu/archive/2009/10/26/wpf-4-vs-2010-and-net-4-0-series.aspx"&gt;already announced&lt;/a&gt; that ScrollViewer will be enhanced to support multi-touch panning. In case of Button it was mentioned several times, that when simultaneous touches occur the correct behavior should be to fire the Click event only after the last touch is lifted. I hope that we get some of these enhancements in the RTM timeframe. &lt;/p&gt;  &lt;p&gt;You can download the sample code here.&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/MultiTouchTest.zip" frameborder="0" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=135767"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=135767" 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/135767.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Szymon Kobalczyk</dc:creator>
            <guid>http://geekswithblogs.net/kobush/archive/2009/10/28/135767.aspx</guid>
            <pubDate>Wed, 28 Oct 2009 08:02:44 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/kobush/comments/135767.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/kobush/archive/2009/10/28/135767.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/kobush/comments/commentRss/135767.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/kobush/services/trackbacks/135767.aspx</trackback:ping>
        </item>
        <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>UMPC + WPF = Audi Keyboard</title>
            <link>http://geekswithblogs.net/kobush/archive/2007/04/11/111454.aspx</link>
            <description>&lt;p&gt;&lt;img src="http://geekswithblogs.net/images/geekswithblogs_net/kobush/1591/o_Tegatech_Australia_Audi_Keyboard.jpg" align="right"&gt; As time goes by I keep finding more and more &lt;a href="http://blogs.msdn.com/tims/archive/tags/portfolio/default.aspx"&gt;great WPF applications&lt;/a&gt;, but this one really&amp;nbsp;got my attention. The Audi Keyboard is a WPF application that was designed for UMPCs that was used during the Melbourne Motorshow to input customer data. I actually found it on the &lt;a href="http://ubertablet.blogspot.com/2007/03/audi-take-ultra-mobile-pc-to-new-level.html"&gt;Hugo Ortega's Uber Tablet blog&lt;/a&gt; (which I'm huge fan by now) so it might have been missed by pure .NET geeks. Hugo published &lt;a href="http://ubertablet.blogspot.com/2007/03/samsung-q1-and-audi-keyboard.html"&gt;video with overview of this project&lt;/a&gt; where you can learn more details.&amp;nbsp; &lt;/p&gt; &lt;p&gt;This project is great example of how WPF brings together designers and developers enabling them to work together on the same project. There is also very interesting &lt;a href="http://www.screenedit.co.uk/sevideo/9992/9992.htm"&gt;video interview&lt;/a&gt; up on &lt;a href="http://www.screenedit.com/"&gt;ScreenEdit.com&lt;/a&gt; with Richard Bassett (the designer) and &lt;a href="http://drneil.blogspot.com"&gt;Dr. Neil&lt;/a&gt;&amp;nbsp;(the programmer). As they point out the most important lesson they learned&amp;nbsp;is that with WPF each of&amp;nbsp;them can work in the environment they are comfortable with (designer = Expression Blend, developer = Visual Studio), but this would be still part of the same project (remember that Blend reads and creates .csproj files). Also worth noting are the first impressions of seasoned designer coming to the Expression suite, and&amp;nbsp;comparing it to&amp;nbsp;competitive technologies like Flash and Adobe Illustrator. &amp;nbsp;&lt;/p&gt; &lt;p&gt;After working with WPF for a while I can 100% agree with what they say. &lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=111454"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=111454" 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/111454.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Szymon Kobalczyk</dc:creator>
            <guid>http://geekswithblogs.net/kobush/archive/2007/04/11/111454.aspx</guid>
            <pubDate>Thu, 12 Apr 2007 04:21:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/kobush/comments/111454.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/kobush/archive/2007/04/11/111454.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/kobush/comments/commentRss/111454.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/kobush/services/trackbacks/111454.aspx</trackback:ping>
        </item>
        <item>
            <title>WPF TabItems With Close Button</title>
            <link>http://geekswithblogs.net/kobush/archive/2007/04/08/closeabletabitem.aspx</link>
            <description>&lt;p&gt;One of the most common questions I've seen regarding the TabControl in Windows Forms was how to add a close button to each tab (similar to seen on tabs in Internet Explorer 7). &lt;/p&gt; &lt;p align="center"&gt;&lt;img src="http://geekswithblogs.net/images/geekswithblogs_net/kobush/1591/o_ie_tabs.png" /&gt; &lt;/p&gt; &lt;p&gt;Although there were &lt;a href="http://www.codeproject.com/cs/miscctrl/closabletabcontrolpage.asp"&gt;some solutions available&lt;/a&gt; the results weren't quite satisfactory and often requiring to &lt;a href="http://www.codeproject.com/vb/net/MDITabControl.asp?msg=1973375"&gt;rewrite the whole control from scratch&lt;/a&gt;. Recently I faced the same challenge working on the &lt;a href="http://geekswithblogs.net/kobush/archive/2007/03/13/108614.aspx"&gt;TSRI project&lt;/a&gt;. It turned out that in WPF this pretty straightforward task and in this article I'm going to show all the steps required to complete it. &lt;/p&gt; &lt;p&gt;To follow the discussion you can download the demo code first:&lt;/p&gt; &lt;p&gt;&lt;a href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=KobushCode&amp;amp;DownloadId=688"&gt;Download the source code&lt;/a&gt;&lt;/p&gt; &lt;p&gt;We start by creating a new custom control deriving from TabItem that implements this behavior. I'll name it &lt;font face="Courier New"&gt;CloseableTabItem&lt;/font&gt;.&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; CloseableTabItem : TabItem
{
    &lt;span class="kwrd"&gt;static&lt;/span&gt; CloseableTabItem()
    {
        DefaultStyleKeyProperty.OverrideMetadata(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(CloseableTabItem),
            &lt;span class="kwrd"&gt;new&lt;/span&gt; FrameworkPropertyMetadata(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(CloseableTabItem)));
    }
}&lt;/pre&gt;
&lt;p&gt;The instruction in static constructor informs the system that this element wants to use different style than it's parent. Since we are creating the default theme for the custom control it would be defined in &lt;font face="Courier New"&gt;generic\themes.xaml&lt;/font&gt;. &lt;/p&gt;
&lt;p&gt;Before we add more code let's create the control template first. With the aid of Expression Blend we can easily create a copy of the default template for TabItem control and start from there. The default template consists only of &lt;font face="Courier New"&gt;Grid&lt;/font&gt; and &lt;font face="Courier New"&gt;Border&lt;/font&gt; that wrap the &lt;font face="Courier New"&gt;ContentPresenter&lt;/font&gt;. We need to place additional DockPanel inside this &lt;font face="Courier New"&gt;Border&lt;/font&gt; to host both the Content and our close &lt;font face="Courier New"&gt;Button&lt;/font&gt;. Because we will reference this button from code later it's named &lt;font face="Courier New"&gt;PART_Close&lt;/font&gt; following the WPF naming convention. The button contains the "x" icon defined as &lt;font face="Courier New"&gt;Path&lt;/font&gt; element. You can see final hierarchy of elements on the image below:&lt;/p&gt;
&lt;p align="center"&gt;&lt;img src="http://geekswithblogs.net/images/geekswithblogs_net/kobush/1591/o_tab_template.png" /&gt; &lt;/p&gt;
&lt;p&gt;The close button should only show it's border when mouse is over and it shouldn't accept keyboard focus, hence there is additional style called &lt;font face="Courier New"&gt;CloseableTabItemButtonStyle&lt;/font&gt;. This template consist of Border and ContentPresenter inside of a Grid. The Border is hidden by default and shows only when mouse is over the button. To be consistent with IE7 behavior I've also added triggers to change the "x" icon fill color to red when mouse is over the button or when it's pressed. &lt;/p&gt;
&lt;p&gt;We are now ready to test these templates. To use our new control first the containing namespace must be mapped to a XML namespace. We don't need to reference the resource dictionary because it is declared as default theme for the control. Here is example markup for the main window of the application: &lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Window&lt;/span&gt;
    &lt;span class="attr"&gt;xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;/span&gt;
    &lt;span class="attr"&gt;xmlns:x&lt;/span&gt;&lt;span class="kwrd"&gt;="http://schemas.microsoft.com/winfx/2006/xaml"&lt;/span&gt;
    &lt;span class="attr"&gt;xmlns:local&lt;/span&gt;&lt;span class="kwrd"&gt;="clr-namespace:CloseableTabItemDemo"&lt;/span&gt;
    &lt;span class="attr"&gt;x:Class&lt;/span&gt;&lt;span class="kwrd"&gt;="CloseableTabItemDemo.MainWindow"&lt;/span&gt;
    &lt;span class="attr"&gt;Title&lt;/span&gt;&lt;span class="kwrd"&gt;="CloseableTabItem Demo"&lt;/span&gt; &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;="300"&lt;/span&gt; &lt;span class="attr"&gt;Width&lt;/span&gt;&lt;span class="kwrd"&gt;="500"&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;Grid&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;TabControl&lt;/span&gt; &lt;span class="attr"&gt;Margin&lt;/span&gt;&lt;span class="kwrd"&gt;="5"&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;local:CloseableTabItem&lt;/span&gt; &lt;span class="attr"&gt;Header&lt;/span&gt;&lt;span class="kwrd"&gt;="TabItem 1"&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;local:CloseableTabItem&lt;/span&gt; &lt;span class="attr"&gt;Header&lt;/span&gt;&lt;span class="kwrd"&gt;="TabItem 2"&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;local:CloseableTabItem&lt;/span&gt; &lt;span class="attr"&gt;Header&lt;/span&gt;&lt;span class="kwrd"&gt;="TabItem 3"&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;TabItem&lt;/span&gt; &lt;span class="attr"&gt;Header&lt;/span&gt;&lt;span class="kwrd"&gt;="TabItem 4"&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;TabControl&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;Grid&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;Window&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Note that we can freely mix the regular TabItems with our custom controls. Here is the result when we run this application:&lt;/p&gt;
&lt;p align="center"&gt;&lt;img src="http://geekswithblogs.net/images/geekswithblogs_net/kobush/1591/o_tab_demo.png" /&gt; &lt;/p&gt;
&lt;p&gt;Having all the visuals in place lets switch back to Visual Studio and finish the remining code. I choose to publish the Close button click event as the a routed event on the control. Of course I could handle it directly in the code of the control but this way I have more control on how to handle it in the application (for example I could display a confirmation dialog before closing the tab). Alternatively I could also create a custom Command and bind it directly to the close button. This would allow me to declare everything in XAML markup but I think event would be easier to use in this case. So below is the declaration for the CloseTab event:&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; RoutedEvent CloseTabEvent =
    EventManager.RegisterRoutedEvent(&lt;span class="str"&gt;"CloseTab"&lt;/span&gt;, RoutingStrategy.Bubble,
        &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(RoutedEventHandler), &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(CloseableTabItem));

&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;event&lt;/span&gt; RoutedEventHandler CloseTab
{
    add { AddHandler(CloseTabEvent, &lt;span class="kwrd"&gt;value&lt;/span&gt;); }
    remove { RemoveHandler(CloseTabEvent, &lt;span class="kwrd"&gt;value&lt;/span&gt;); }
}&lt;/pre&gt;
&lt;p&gt;To raise the event I need first to attach a handler to the Button's Click event. I can do it easily by overriding the ... method. This is where I use the &lt;font face="Courier New"&gt;PART_Close&lt;/font&gt; name mentioned earlier to find the button declared in template by using the &lt;font face="Courier New"&gt;GetTemplateChild&lt;/font&gt; method. The event handler simply raises the new event. &lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnApplyTemplate()
{
    &lt;span class="kwrd"&gt;base&lt;/span&gt;.OnApplyTemplate();

    Button closeButton = &lt;span class="kwrd"&gt;base&lt;/span&gt;.GetTemplateChild(&lt;span class="str"&gt;"PART_Close"&lt;/span&gt;) &lt;span class="kwrd"&gt;as&lt;/span&gt; Button;
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (closeButton != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
        closeButton.Click += &lt;span class="kwrd"&gt;new&lt;/span&gt; System.Windows.RoutedEventHandler(closeButton_Click);
}

&lt;span class="kwrd"&gt;void&lt;/span&gt; closeButton_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, System.Windows.RoutedEventArgs e)
{
    &lt;span class="kwrd"&gt;this&lt;/span&gt;.RaiseEvent(&lt;span class="kwrd"&gt;new&lt;/span&gt; RoutedEventArgs(CloseTabEvent, &lt;span class="kwrd"&gt;this&lt;/span&gt;));
}&lt;/pre&gt;
&lt;p&gt;So the only thing left is to actually handle this event. This will be done in the MainWindow's code behind. Normally I would have to attach handlers for this event to each tab I created but since this is a routed event (with bubble strategy) I can also attach it once on any of it's parents (up to the Window itself). Closing the tab is done by finding the parent TabControl removing the source tab from it's Items collection.&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; MainWindow : System.Windows.Window
{
    &lt;span class="kwrd"&gt;public&lt;/span&gt; MainWindow()
    {
        InitializeComponent();

        &lt;span class="kwrd"&gt;this&lt;/span&gt;.AddHandler(CloseableTabItem.CloseTabEvent, &lt;span class="kwrd"&gt;new&lt;/span&gt; RoutedEventHandler(&lt;span class="kwrd"&gt;this&lt;/span&gt;.CloseTab));
    }

    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; CloseTab(&lt;span class="kwrd"&gt;object&lt;/span&gt; source, RoutedEventArgs args)
    {
        TabItem tabItem = args.Source &lt;span class="kwrd"&gt;as&lt;/span&gt; TabItem;
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (tabItem != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
        {
            TabControl tabControl = tabItem.Parent &lt;span class="kwrd"&gt;as&lt;/span&gt; TabControl;
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (tabControl != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
                tabControl.Items.Remove(tabItem);
        }
    }
}&lt;/pre&gt;
&lt;p&gt;That's all we need to do. Now we have customized tab items with fully working tab control. And as you can see this is relatively easy to implement so nothing prevents adding more buttons or other elements on the tabs. For example in the TSRI project we have additional button that opens the tab contents as floating window.  &lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=111119"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=111119" 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/111119.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Szymon Kobalczyk</dc:creator>
            <guid>http://geekswithblogs.net/kobush/archive/2007/04/08/closeabletabitem.aspx</guid>
            <pubDate>Sun, 08 Apr 2007 21:48:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/kobush/comments/111119.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/kobush/archive/2007/04/08/closeabletabitem.aspx#feedback</comments>
            <slash:comments>35</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/kobush/comments/commentRss/111119.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/kobush/services/trackbacks/111119.aspx</trackback:ping>
        </item>
        <item>
            <title>Overriding default SystemColors in WPF</title>
            <link>http://geekswithblogs.net/kobush/archive/2007/03/25/109753.aspx</link>
            <description>&lt;p&gt;After working with WPF for a while I must say that it is wonderful platform for building complex user interfaces but sometimes it falls short in very simple scenarios.&amp;nbsp;Or in other words, it's easy to do complex things with it's powerful tools but often it lacks simple tools to do simple things.&amp;nbsp;At least from a perspective of Windows Forms developer who expects some familiar tools and quickly finds out that they are gone. &lt;/p&gt; &lt;p&gt;There are several examples of this, but one that I run across recently and find it very often in other forums is how to change default colors in more complex controls like &lt;strong&gt;ListBox&lt;/strong&gt; or &lt;strong&gt;ComboBox&lt;/strong&gt;. For example yesterday there was a question on the MSDN forum on&amp;nbsp;&lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1388254&amp;amp;SiteID=1"&gt;how to change the highlight color in a popup of combobox&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;All controls in WPF have only three properties to adjust their colors: &lt;strong&gt;Foreground&lt;/strong&gt;, &lt;strong&gt;Background&lt;/strong&gt; and &lt;strong&gt;BorderBrush&lt;/strong&gt; (keep in mind that all of these properties accept brushes instead of solid colors). But you won't find such properties as HighlightedItemBrush on ComboBox or SelectedItemBrush on ListBox. &lt;/p&gt; &lt;p&gt;I read somewhere, that primary reason for this is that Controls encapsulate logical elements and shouldn't have properties that depend on their visual representation. Instead the appearance of each control is defined through it's &lt;strong&gt;ControlTemplate&lt;/strong&gt; and with some alternative template these properties might make no sense at all. &lt;/p&gt; &lt;p&gt;So it might seem that the only option&amp;nbsp;to override these colors would be to recreate the &lt;strong&gt;ControlTemplate&lt;/strong&gt; for particular control and adjust the colors. Thankfully you don't have to do it manually. With Microsoft Expression Blend you can very easily create copy of the default ControlTemplate by selecting the control and then from menu invoking &lt;strong&gt;Object&lt;/strong&gt; &amp;gt; &lt;strong&gt;Edit Control Parts (Template)&lt;/strong&gt; &amp;gt; &lt;strong&gt;Edit a Copy...&lt;/strong&gt; &lt;/p&gt; &lt;p&gt;But this will only recreate the template for your current Windows Theme so if you have to preserve all other visual aspects of the control you need to put even more work to subclass your control and recreate all themes for the new control. This is quite a big effort to do such a small thing. &lt;/p&gt; &lt;p&gt;There is however much simpler solution if overriding the default colors is the only thing you want to change.&amp;nbsp;Because these colors are defined as resources you can try to override these resource for your control. &lt;/p&gt; &lt;p&gt;For example, to change the color of selected item in a ListBox (or highlighted item in ComboBox )&amp;nbsp;override following resource:&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;SolidColorBrush&lt;/span&gt; &lt;span class="attr"&gt;x:Key&lt;/span&gt;&lt;span class="kwrd"&gt;="{x:Static SystemColors.HighlightBrushKey}"&lt;/span&gt; &lt;span class="attr"&gt;Color&lt;/span&gt;&lt;span class="kwrd"&gt;="Orange"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;And because I also wanted to have the same color when ListBox doesn't have focus I needed to override this resource as well:&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;SolidColorBrush&lt;/span&gt; &lt;span class="attr"&gt;x:Key&lt;/span&gt;&lt;span class="kwrd"&gt;="{x:Static SystemColors.ControlBrushKey}"&lt;/span&gt; &lt;span class="attr"&gt;Color&lt;/span&gt;&lt;span class="kwrd"&gt;="Orange"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;As with all resources you can do it either only for this particular control (using Style.Resources), whole window or even for the whole application depending on which ResourceDictionary you would use. And because these resources are referenced as DynamicResource you can even adjust them at runtime.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;So now the only problem is to find out what resources you need to override to get the desired control. Once again the Microsoft Expression Designer comes in handy and you can find this out by recreating the default templates but this time only to read what colors it uses and what what purpose. &lt;/p&gt;
&lt;p&gt;I've started putting together a reference of which system colors are used in default templates for simple controls and will publish it shortly. &lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=109753"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=109753" 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/109753.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Szymon Kobalczyk</dc:creator>
            <guid>http://geekswithblogs.net/kobush/archive/2007/03/25/109753.aspx</guid>
            <pubDate>Sun, 25 Mar 2007 18:46:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/kobush/comments/109753.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/kobush/archive/2007/03/25/109753.aspx#feedback</comments>
            <slash:comments>9</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/kobush/comments/commentRss/109753.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/kobush/services/trackbacks/109753.aspx</trackback:ping>
        </item>
    </channel>
</rss>