<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US"><title type="html">benwu's WebLog</title><subtitle type="html" /><id>http://blogs.msdn.com/benwu/atom.xml</id><link rel="alternate" type="text/html" href="http://blogs.msdn.com/benwu/default.aspx" /><link rel="self" type="application/atom+xml" href="http://blogs.msdn.com/benwu/atom.xml" /><generator uri="http://communityserver.org" version="2.1.61025.2">Community Server</generator><updated>2004-02-02T10:16:00Z</updated><entry><title>Bindings, Bindings and more Bindings</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/benwu/archive/2009/01/05/bindings-bindings-and-more-bindings.aspx" /><id>http://blogs.msdn.com/benwu/archive/2009/01/05/bindings-bindings-and-more-bindings.aspx</id><published>2009-01-05T02:43:00Z</published><updated>2009-01-05T02:43:00Z</updated><content type="html">&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"&gt;&lt;meta name="ProgId" content="Word.Document"&gt;&lt;meta name="Generator" content="Microsoft Word 11"&gt;&lt;meta name="Originator" content="Microsoft Word 11"&gt;
&lt;link href="file:///C:%5CUsers%5CVALUED%7E1%5CAppData%5CLocal%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" mce_href="file:///C:%5CUsers%5CVALUED%7E1%5CAppData%5CLocal%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" rel="File-List"&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:WordDocument&gt;
  &lt;w:View&gt;Normal&lt;/w:View&gt;
  &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
  &lt;w:PunctuationKerning/&gt;
  &lt;w:ValidateAgainstSchemas/&gt;
  &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;
  &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;
  &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;
  &lt;w:Compatibility&gt;
   &lt;w:BreakWrappedTables/&gt;
   &lt;w:SnapToGridInCell/&gt;
   &lt;w:WrapTextWithPunct/&gt;
   &lt;w:UseAsianBreakRules/&gt;
   &lt;w:DontGrowAutofit/&gt;
  &lt;/w:Compatibility&gt;
  &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;
 &lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:LatentStyles DefLockedState="false" LatentStyleCount="156"&gt;
 &lt;/w:LatentStyles&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;style&gt;
&lt;!--
 /* Font Definitions */
 @font-face
	{font-family:Wingdings;
	panose-1:5 0 0 0 0 0 0 0 0 0;
	mso-font-charset:2;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:0 268435456 0 0 -2147483648 0;}
@font-face
	{font-family:Tahoma;
	panose-1:2 11 6 4 3 5 4 4 2 4;
	mso-font-charset:0;
	mso-generic-font-family:swiss;
	mso-font-pitch:variable;
	mso-font-signature:-520078593 -1073717157 41 0 66047 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-parent:"";
	margin:0in;
	margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:12.0pt;
	font-family:"Times New Roman";
	mso-fareast-font-family:"Times New Roman";}
p
	{mso-margin-top-alt:auto;
	margin-right:0in;
	mso-margin-bottom-alt:auto;
	margin-left:0in;
	mso-pagination:widow-orphan;
	font-size:12.0pt;
	font-family:"Times New Roman";
	mso-fareast-font-family:"Times New Roman";}
@page Section1
	{size:8.5in 11.0in;
	margin:1.0in 1.25in 1.0in 1.25in;
	mso-header-margin:.5in;
	mso-footer-margin:.5in;
	mso-paper-source:0;}
div.Section1
	{page:Section1;}
 /* List Definitions */
 @list l0
	{mso-list-id:896473103;
	mso-list-template-ids:345138260;}
@list l0:level1
	{mso-level-number-format:bullet;
	mso-level-text:;
	mso-level-tab-stop:.5in;
	mso-level-number-position:left;
	text-indent:-.25in;
	mso-ansi-font-size:10.0pt;
	font-family:Symbol;}
ol
	{margin-bottom:0in;}
ul
	{margin-bottom:0in;}
--&gt;
&lt;/style&gt;&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:"Table Normal";
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-parent:"";
	mso-padding-alt:0in 5.4pt 0in 5.4pt;
	mso-para-margin:0in;
	mso-para-margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:"Times New Roman";
	mso-ansi-language:#0400;
	mso-fareast-language:#0400;
	mso-bidi-language:#0400;}
&lt;/style&gt;
&lt;![endif]--&gt;

&lt;p&gt;&lt;span style="font-size: 10pt; font-family: Tahoma;"&gt;Bindings in WPF are great
and can accomplish so many things.&amp;nbsp; But how many times have you been in
the position of trying to do any of the following:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;ul type="disc"&gt;
&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: Tahoma;"&gt;Bind simple POCOs together&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;

&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: Tahoma;"&gt;Apply a binding to an object outside of your xaml file&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;

&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: Tahoma;"&gt;Bind the same property more than once (say once with
     OneWayToSource and again with a different OneWay binding)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;span style="font-size: 10pt; font-family: Tahoma;"&gt;I wrote a small utility
class that helps these situations.&amp;nbsp; It's called a "Join".&amp;nbsp;
It simply allows you to specify two bindings and it will "join" the two
together.&amp;nbsp; You place Joins inside a JoinContainer which is a simple
ContentControl.&amp;nbsp; For example:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-size: 10pt; font-family: Tahoma;"&gt;&amp;nbsp;&amp;lt;Grid&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;JoinContainer&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;JoinContainer.Joins&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;Join Target="{Binding ElementName=textBox1, Path=Text}"
Value="{Binding ElementName=textBox2, Path=Text}" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;/JoinContainer.Joins&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;TextBox
x:Name="textBox1" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;TextBox
x:Name="textBox2" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;JoinContainer&amp;gt;&lt;br&gt;
&amp;lt;Grid&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-size: 10pt; font-family: Tahoma;"&gt;This will bind the text of
textbox1 to textbox2.&amp;nbsp;It does this without using any bindings on the
TextBoxes themselves, which frees you up to apply more bindings.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;Joins are purely oneway.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-size: 10pt; font-family: Tahoma;"&gt;Why would you want to do
this?&amp;nbsp; I give you two cases, but there are more:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: Tahoma;"&gt;1.
Inversion of Control&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: Tahoma;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-size: 10pt; font-family: Tahoma;"&gt;You can use the Binding
engine to implement a pseudo dependency injection system.&amp;nbsp; The main thing Joins
give you is the ability to apply a set of bindings to local properties that do
not have to be DPs and do not have to be declared on the base Type.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-size: 10pt; font-family: Tahoma;"&gt;Let’s say you have two
UserControls.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;One publishes a “MyService”
and the other consumes it.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;The publish
event can happen at any time and for simplicity, we use DataContext to hold the
services (you could also use an inherited attached property for this).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-size: 10pt; font-family: Tahoma;"&gt;Publisher:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;UserControl&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt; x&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;:&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;Class&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="WpfApp1.UserControl1"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;&lt;span style=""&gt;&amp;nbsp;&lt;/span&gt;xmlns&lt;/span&gt;&lt;span style="color: blue;"&gt;="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;&lt;span style=""&gt;&amp;nbsp;&lt;/span&gt;xmlns&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: red;"&gt;x&lt;/span&gt;&lt;span style="color: blue;"&gt;="http://schemas.microsoft.com/winfx/2006/xaml"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;&lt;span style=""&gt;&amp;nbsp;&lt;/span&gt;xmlns&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: red;"&gt;local&lt;/span&gt;&lt;span style="color: blue;"&gt;="clr-namespace:WpfApp1"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;&lt;span style=""&gt;&amp;nbsp;&lt;/span&gt;x&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: red;"&gt;Name&lt;/span&gt;&lt;span style="color: blue;"&gt;="UserControl1Root"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;&lt;span style=""&gt;&amp;nbsp;&lt;/span&gt;Height&lt;/span&gt;&lt;span style="color: blue;"&gt;="173"&lt;/span&gt;&lt;span style="color: red;"&gt; Width&lt;/span&gt;&lt;span style="color: blue;"&gt;="196"&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;local&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;:&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;JoinContainer&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;local&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;:&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;JoinContainer.Joins&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="background: yellow none repeat scroll 0% 0%; font-size: 10pt; font-family: 'Courier New'; color: blue; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: yellow none repeat scroll 0% 0%; font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;local&lt;/span&gt;&lt;span style="background: yellow none repeat scroll 0% 0%; font-size: 10pt; font-family: 'Courier New'; color: blue; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;:&lt;/span&gt;&lt;span style="background: yellow none repeat scroll 0% 0%; font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;Join&lt;/span&gt;&lt;span style="background: yellow none repeat scroll 0% 0%; font-size: 10pt; font-family: 'Courier New'; color: red; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt; Target&lt;/span&gt;&lt;span style="background: yellow none repeat scroll 0% 0%; font-size: 10pt; font-family: 'Courier New'; color: blue; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;="{&lt;/span&gt;&lt;span style="background: yellow none repeat scroll 0% 0%; font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;Binding&lt;/span&gt;&lt;span style="background: yellow none repeat scroll 0% 0%; font-size: 10pt; font-family: 'Courier New'; color: red; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt; MyService&lt;/span&gt;&lt;span style="background: yellow none repeat scroll 0% 0%; font-size: 10pt; font-family: 'Courier New'; color: blue; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;}"&lt;/span&gt;&lt;span style="background: yellow none repeat scroll 0% 0%; font-size: 10pt; font-family: 'Courier New'; color: red; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt; Value&lt;/span&gt;&lt;span style="background: yellow none repeat scroll 0% 0%; font-size: 10pt; font-family: 'Courier New'; color: blue; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;="{&lt;/span&gt;&lt;span style="background: yellow none repeat scroll 0% 0%; font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;Binding&lt;/span&gt;&lt;span style="background: yellow none repeat scroll 0% 0%; font-size: 10pt; font-family: 'Courier New'; color: red; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt; ElementName&lt;/span&gt;&lt;span style="background: yellow none repeat scroll 0% 0%; font-size: 10pt; font-family: 'Courier New'; color: blue; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;=UserControl1Root,&lt;/span&gt;&lt;span style="background: yellow none repeat scroll 0% 0%; font-size: 10pt; font-family: 'Courier New'; color: red; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt; Path&lt;/span&gt;&lt;span style="background: yellow none repeat scroll 0% 0%; font-size: 10pt; font-family: 'Courier New'; color: blue; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;=MyService}" /&amp;gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;local&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;:&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;JoinContainer.Joins&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;Grid&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;Button&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt; Margin&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="43,70,49,67"&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;
Name&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="button1"&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt; Click&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="button1_Click"&amp;gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;Publish&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;Button&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;Grid&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;local&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;:&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;JoinContainer&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;UserControl&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-size: 10pt; font-family: Tahoma;"&gt;The Join highlighted above
targets the “MyService” property on the datacontext and will set it from the “MyService”
property coming from UserControl1Root.&lt;span style=""&gt;&amp;nbsp;
&lt;/span&gt;That is, this sets a value on the Datacontext using local values.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-size: 10pt; font-family: Tahoma;"&gt;Consumer:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;UserControl&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt; x&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;:&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;Class&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="WpfApp1.UserControl2"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;&lt;span style=""&gt;&amp;nbsp;&lt;/span&gt;xmlns&lt;/span&gt;&lt;span style="color: blue;"&gt;="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;&lt;span style=""&gt;&amp;nbsp;&lt;/span&gt;xmlns&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: red;"&gt;x&lt;/span&gt;&lt;span style="color: blue;"&gt;="http://schemas.microsoft.com/winfx/2006/xaml"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;&lt;span style=""&gt;&amp;nbsp;&lt;/span&gt;xmlns&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: red;"&gt;local&lt;/span&gt;&lt;span style="color: blue;"&gt;="clr-namespace:WpfApp1"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;&lt;span style=""&gt;&amp;nbsp;&lt;/span&gt;Height&lt;/span&gt;&lt;span style="color: blue;"&gt;="162"&lt;/span&gt;&lt;span style="color: red;"&gt; Width&lt;/span&gt;&lt;span style="color: blue;"&gt;="206"&lt;/span&gt;&lt;span style="color: red;"&gt; x&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: red;"&gt;Name&lt;/span&gt;&lt;span style="color: blue;"&gt;="UserControl2Root"&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;UserControl.Resources&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;local&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;:&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;NullToBoolConverter&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;
x&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;:&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;Key&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="converter" /&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;UserControl.Resources&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;local&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;:&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;JoinContainer&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;local&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;:&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;JoinContainer.Joins&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="background: yellow none repeat scroll 0% 0%; font-size: 10pt; font-family: 'Courier New'; color: blue; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: yellow none repeat scroll 0% 0%; font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;local&lt;/span&gt;&lt;span style="background: yellow none repeat scroll 0% 0%; font-size: 10pt; font-family: 'Courier New'; color: blue; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;:&lt;/span&gt;&lt;span style="background: yellow none repeat scroll 0% 0%; font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;Join&lt;/span&gt;&lt;span style="background: yellow none repeat scroll 0% 0%; font-size: 10pt; font-family: 'Courier New'; color: red; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt; Target&lt;/span&gt;&lt;span style="background: yellow none repeat scroll 0% 0%; font-size: 10pt; font-family: 'Courier New'; color: blue; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;="{&lt;/span&gt;&lt;span style="background: yellow none repeat scroll 0% 0%; font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;Binding&lt;/span&gt;&lt;span style="background: yellow none repeat scroll 0% 0%; font-size: 10pt; font-family: 'Courier New'; color: red; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt; ElementName&lt;/span&gt;&lt;span style="background: yellow none repeat scroll 0% 0%; font-size: 10pt; font-family: 'Courier New'; color: blue; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;=UserControl2Root,&lt;/span&gt;&lt;span style="background: yellow none repeat scroll 0% 0%; font-size: 10pt; font-family: 'Courier New'; color: red; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt; Path&lt;/span&gt;&lt;span style="background: yellow none repeat scroll 0% 0%; font-size: 10pt; font-family: 'Courier New'; color: blue; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;=MyService}"&lt;/span&gt;&lt;span style="background: yellow none repeat scroll 0% 0%; font-size: 10pt; font-family: 'Courier New'; color: red; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt; Value&lt;/span&gt;&lt;span style="background: yellow none repeat scroll 0% 0%; font-size: 10pt; font-family: 'Courier New'; color: blue; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;="{&lt;/span&gt;&lt;span style="background: yellow none repeat scroll 0% 0%; font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;Binding&lt;/span&gt;&lt;span style="background: yellow none repeat scroll 0% 0%; font-size: 10pt; font-family: 'Courier New'; color: red; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt; MyService&lt;/span&gt;&lt;span style="background: yellow none repeat scroll 0% 0%; font-size: 10pt; font-family: 'Courier New'; color: blue; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;}" /&amp;gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;local&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;:&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;JoinContainer.Joins&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;Grid&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;Button&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt; Margin&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="49,46,29,68"&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;
Name&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="button1"&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt; Click&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="button1_Click"&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;&lt;span style=""&gt;&amp;nbsp;&lt;/span&gt;IsEnabled&lt;/span&gt;&lt;span style="color: blue;"&gt;="{&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;Binding&lt;/span&gt;&lt;span style="color: red;"&gt; ElementName&lt;/span&gt;&lt;span style="color: blue;"&gt;=UserControl2Root,&lt;/span&gt;&lt;span style="color: red;"&gt; Path&lt;/span&gt;&lt;span style="color: blue;"&gt;=MyService,&lt;/span&gt;&lt;span style="color: red;"&gt; Converter&lt;/span&gt;&lt;span style="color: blue;"&gt;={&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;StaticResource&lt;/span&gt;&lt;span style="color: red;"&gt; converter&lt;/span&gt;&lt;span style="color: blue;"&gt;}}"&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;Go!&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;Button&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;Grid&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;local&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;:&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;JoinContainer&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;UserControl&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-size: 10pt; font-family: Tahoma;"&gt;&amp;nbsp;This Join does the
opposite.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;It sets the local MyService
property on UserControl2Root from the value from the datacontext.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;And the great thing is you can use simple
properties – though the publisher will need to implement
INotifyPropertyChanged.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-size: 10pt; font-family: Tahoma;"&gt;To declare these in xaml without
Joins, you would need to declare MyService as DependencyProperties on a new
base Type for both usercontrols.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-size: 10pt; font-family: Tahoma;"&gt;2. Binding
a complex Model&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 10pt; font-family: Tahoma;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-size: 10pt; font-family: Tahoma;"&gt;Say you have a model such
as this:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ColorModel&lt;/span&gt; :&lt;span style="color: rgb(43, 145, 175);"&gt;INotifyPropertyChanged&lt;/span&gt; {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Color&lt;/span&gt;
_c;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt;
ColorModel() {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Color = &lt;span style="color: rgb(43, 145, 175);"&gt;Colors&lt;/span&gt;.RosyBrown;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Color&lt;/span&gt; Color {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;get&lt;/span&gt;
{ &lt;span style="color: blue;"&gt;return&lt;/span&gt; _c; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;set&lt;/span&gt;
{ _c = &lt;span style="color: blue;"&gt;value&lt;/span&gt;; &lt;span style="color: blue;"&gt;if&lt;/span&gt;
(PropertyChanged != &lt;span style="color: blue;"&gt;null&lt;/span&gt;) PropertyChanged(&lt;span style="color: blue;"&gt;this&lt;/span&gt;, &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;PropertyChangedEventArgs&lt;/span&gt;(&lt;span style="color: rgb(163, 21, 21);"&gt;"Color"&lt;/span&gt;));
}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;#region&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt; INotifyPropertyChanged
Members&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;event&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;PropertyChangedEventHandler&lt;/span&gt;
PropertyChanged;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;#endregion&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-size: 10pt; font-family: Tahoma;"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-size: 10pt; font-family: Tahoma;"&gt;And you
wanted to display a visual such as this:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;iframe src="http://cid-b6145069ff9968fb.skydrive.live.com/embedgrid.aspx/.Public/sshot.jpg" marginheight="0" marginwidth="0" style="border: 1px solid rgb(221, 229, 233); margin: 3px; padding: 0pt; width: 94px; height: 94px; background-color: rgb(255, 255, 255);" scrolling="no" frameborder="0"&gt;&lt;/iframe&gt;


&lt;p&gt;&lt;span style="font-size: 10pt; font-family: Tahoma;"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-size: 10pt; font-family: Tahoma;"&gt;The rectangle at the
bottom is the resulting color of all three textboxes.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;As you think about the solution, you
realize that the model given simply won’t work.&lt;span style=""&gt;&amp;nbsp;
&lt;/span&gt;The issue is that each textbox needs to be two-way to the underlying
ColorModel.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;So, when you type a new R value,
a new color gets pushed into ColorModel.Color.&lt;span style=""&gt;&amp;nbsp;
&lt;/span&gt;But when you go to write the converter for the R binding, you realize
you don’t have enough contextual information to build the whole color!&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;You are missing the values for G and B.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;So, it ends up that you can only make those
bindings oneway if you use the ColorModel above.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-size: 10pt; font-family: Tahoma;"&gt;Joins can help in this
situation by allowing you to keep the Textbox Bindings one-way and use a Join
for the other direction.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;Window&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt; x&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;:&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;Class&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="WpfApp1.MultiBindingsWindow"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;&lt;span style=""&gt;&amp;nbsp;&lt;/span&gt;xmlns&lt;/span&gt;&lt;span style="color: blue;"&gt;="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;&lt;span style=""&gt;&amp;nbsp;&lt;/span&gt;xmlns&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: red;"&gt;x&lt;/span&gt;&lt;span style="color: blue;"&gt;="http://schemas.microsoft.com/winfx/2006/xaml"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;&lt;span style=""&gt;&amp;nbsp;&lt;/span&gt;xmlns&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span style="color: red;"&gt;local&lt;/span&gt;&lt;span style="color: blue;"&gt;="clr-namespace:WpfApp1"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: red;"&gt;&lt;span style=""&gt;&amp;nbsp;&lt;/span&gt;Title&lt;/span&gt;&lt;span style="color: blue;"&gt;="Window1"&lt;/span&gt;&lt;span style="color: red;"&gt; Height&lt;/span&gt;&lt;span style="color: blue;"&gt;="228"&lt;/span&gt;&lt;span style="color: red;"&gt; Width&lt;/span&gt;&lt;span style="color: blue;"&gt;="230"&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;Grid&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;local&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;:&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;JoinContainer&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;local&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;:&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;JoinContainer.Resources&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;local&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;:&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;RGBConverter&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;
x&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;:&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;Key&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="rgbconverter" /&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;local&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;:&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;JoinContainer.Resources&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;local&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;:&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;JoinContainer.Joins&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: yellow none repeat scroll 0% 0%; font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;local&lt;/span&gt;&lt;span style="background: yellow none repeat scroll 0% 0%; font-size: 10pt; font-family: 'Courier New'; color: blue; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;:&lt;/span&gt;&lt;span style="background: yellow none repeat scroll 0% 0%; font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;Join&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt; Target&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="{&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;Binding&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt; Color&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;}"&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;local&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;:&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;Join.Value&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;MultiBinding&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt; Converter&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="{&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;StaticResource&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt; rgbconverter&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;}" &amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;MultiBinding.Bindings&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;Binding&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt; ElementName&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="textBox1"&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;
Path&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="Text" /&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;Binding&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt; ElementName&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="textBox2"&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;
Path&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="Text" /&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;Binding&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt; ElementName&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="textBox3"&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;
Path&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="Text" /&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;MultiBinding.Bindings&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;MultiBinding&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;local&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;:&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;Join.Value&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;local&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;:&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;Join&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;local&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;:&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;JoinContainer.Joins&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;Grid&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;Grid.Resources&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;local&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;:&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;RConverter&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;
x&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;:&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;Key&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="rconverter" /&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;local&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;:&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;GConverter&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;
x&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;:&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;Key&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="gconverter" /&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;local&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;:&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;BConverter&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;
x&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;:&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;Key&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="bconverter" /&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;Grid.Resources&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;TextBox&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt; Height&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="23"&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;
Margin&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="48,12,40,0"&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;
Name&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="textBox1"&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt; VerticalAlignment&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="Top"&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;
Text&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="{&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;Binding&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;
Color&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;,&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt; Mode&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;=OneWay,&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;
Converter&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;={&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;StaticResource&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;
rconverter&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;}}" /&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;TextBox&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt; Height&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="23"&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;
Margin&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="48,47,40,0"&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;
Name&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="textBox2"&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt; VerticalAlignment&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="Top"&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;
Text&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="{&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;Binding&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;
Color&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;,&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt; Mode&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;=OneWay,&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;
Converter&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;={&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;StaticResource&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;
gconverter&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;}}" /&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;TextBox&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt; Height&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="23"&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;
Margin&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="48,85,40,0"&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;
Name&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="textBox3"&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt; VerticalAlignment&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="Top"&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;
Text&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="{&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;Binding&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;
Color&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;,&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt; Mode&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;=OneWay,&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;
Converter&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;={&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;StaticResource&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;
bconverter&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;}}" /&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;Label&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt; HorizontalAlignment&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="Left"&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;
Margin&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="10,12,0,79"&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;
Name&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="label1"&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt; Width&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="30"&amp;gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;R&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;Label&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;Label&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt; HorizontalAlignment&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="Left"&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;
Margin&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="10,47,0,79"&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;
Name&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="label2"&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt; Width&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="30"&amp;gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;G&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;Label&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;Label&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt; HorizontalAlignment&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="Left"&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;
Margin&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="10,83,0,79"&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;
Name&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="label3"&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt; Width&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="30"&amp;gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;B&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;Label&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;Rectangle&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt; Height&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="55"&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;
Margin&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="10,0,8,9"&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;
Name&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="rectangle1"&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt; Stroke&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="Black"&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;
VerticalAlignment&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="Bottom"&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;Rectangle.Fill&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;SolidColorBrush&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt; Color&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;="{&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;Binding&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt; Color&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;,&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: red;"&gt;
Mode&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;=OneWay}" /&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;Rectangle.Fill&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;Rectangle&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;Grid&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;local&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;:&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;JoinContainer&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;Grid&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: rgb(163, 21, 21);"&gt;Window&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New'; color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: Tahoma;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-size: 10pt; font-family: Tahoma;"&gt;Of course, the easier
approach is to just create a viewmodel with separate values for R, G, and B.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-size: 10pt; font-family: Tahoma;"&gt;The implementation of Join
is pretty simple:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Join&lt;/span&gt; : &lt;span style="color: rgb(43, 145, 175);"&gt;Freezable&lt;/span&gt; {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;object&lt;/span&gt; Value {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;get&lt;/span&gt;
{ &lt;span style="color: blue;"&gt;return&lt;/span&gt; (&lt;span style="color: blue;"&gt;object&lt;/span&gt;)GetValue(ValueProperty);
}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;set&lt;/span&gt;
{ SetValue(ValueProperty, &lt;span style="color: blue;"&gt;value&lt;/span&gt;); }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green;"&gt;// Using a
DependencyProperty as the backing store for Value.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;This enables animation, styling, binding,
etc...&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;readonly&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;DependencyProperty&lt;/span&gt; ValueProperty =&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;DependencyProperty&lt;/span&gt;.Register(&lt;span style="color: rgb(163, 21, 21);"&gt;"Value"&lt;/span&gt;, &lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color: blue;"&gt;object&lt;/span&gt;), &lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color: rgb(43, 145, 175);"&gt;Join&lt;/span&gt;), &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;
&lt;span style="color: rgb(43, 145, 175);"&gt;UIPropertyMetadata&lt;/span&gt;(&lt;span style="color: blue;"&gt;null&lt;/span&gt;,
&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;PropertyChangedCallback&lt;/span&gt;(OnValueChanged)));&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; OnValueChanged(&lt;span style="color: rgb(43, 145, 175);"&gt;DependencyObject&lt;/span&gt;
target, &lt;span style="color: rgb(43, 145, 175);"&gt;DependencyPropertyChangedEventArgs&lt;/span&gt;
e) {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Join&lt;/span&gt;
j = target &lt;span style="color: blue;"&gt;as&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Join&lt;/span&gt;;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Debug&lt;/span&gt;.Assert(j
!= &lt;span style="color: blue;"&gt;null&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;j.Target = e.NewValue; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;object&lt;/span&gt; Target {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;get&lt;/span&gt;
{ &lt;span style="color: blue;"&gt;return&lt;/span&gt; (&lt;span style="color: blue;"&gt;object&lt;/span&gt;)GetValue(TargetProperty);
}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;set&lt;/span&gt;
{ SetValue(TargetProperty, &lt;span style="color: blue;"&gt;value&lt;/span&gt;); }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green;"&gt;// Using a
DependencyProperty as the backing store for Target.&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;This enables animation, styling, binding,
etc...&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;readonly&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;DependencyProperty&lt;/span&gt; TargetProperty =&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;DependencyProperty&lt;/span&gt;.Register(&lt;span style="color: rgb(163, 21, 21);"&gt;"Target"&lt;/span&gt;, &lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color: blue;"&gt;object&lt;/span&gt;), &lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color: rgb(43, 145, 175);"&gt;Join&lt;/span&gt;), &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;new&lt;/span&gt;
&lt;span style="color: rgb(43, 145, 175);"&gt;FrameworkPropertyMetadata&lt;/span&gt;(&lt;span style="color: blue;"&gt;null&lt;/span&gt;, &lt;span style="color: rgb(43, 145, 175);"&gt;FrameworkPropertyMetadataOptions&lt;/span&gt;.BindsTwoWayByDefault,
&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;PropertyChangedCallback&lt;/span&gt;(OnTargetChanged)));&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; OnTargetChanged(&lt;span style="color: rgb(43, 145, 175);"&gt;DependencyObject&lt;/span&gt;
target, &lt;span style="color: rgb(43, 145, 175);"&gt;DependencyPropertyChangedEventArgs&lt;/span&gt;
e) {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Join&lt;/span&gt;
j = target &lt;span style="color: blue;"&gt;as&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Join&lt;/span&gt;;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Debug&lt;/span&gt;.Assert(j
!= &lt;span style="color: blue;"&gt;null&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;j.Target = j.Value; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;protected&lt;/span&gt;
&lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Freezable&lt;/span&gt;
CreateInstanceCore() {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;throw&lt;/span&gt;
&lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;NotImplementedException&lt;/span&gt;();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: Tahoma;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-size: 10pt; font-family: Tahoma;"&gt;It derives from Freezable
to participate in the containers inheritance context.&amp;nbsp; The source for Joins can be found here:&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&amp;nbsp; 
&lt;iframe src="http://cid-b6145069ff9968fb.skydrive.live.com/embedrow.aspx/.Public/WpfApp1.zip" marginheight="0" marginwidth="0" style="border: 1px solid rgb(221, 229, 233); margin: 3px; padding: 0pt; width: 240px; height: 26px; background-color: rgb(255, 255, 255);" scrolling="no" frameborder="0"&gt;&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;span style="font-size: 10pt; font-family: Tahoma;"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9274322" width="1" height="1"&gt;</content><author><name>benwu</name><uri>http://blogs.msdn.com/members/benwu.aspx</uri></author></entry><entry><title>Managed Spy -- A new way to look at Windows Forms applications</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/benwu/archive/2006/02/16/532872.aspx" /><id>http://blogs.msdn.com/benwu/archive/2006/02/16/532872.aspx</id><published>2006-02-16T03:19:00Z</published><updated>2006-02-16T03:19:00Z</updated><content type="html">&lt;P&gt;I just wrote an article for msdn magazine, "&lt;A href="http://msdn.microsoft.com/msdnmag/issues/06/04/ManagedSpy/default.aspx"&gt;&lt;SPAN class=ST&gt;Managed Spy&lt;/SPAN&gt;: Deliver The Power Of Spy++ To Windows Forms With Our New Tool&lt;/A&gt;"&lt;/P&gt;
&lt;P&gt;This tool is a combination of an application (exe) and library (dll).&amp;nbsp; The application gives you a spy++ view of all managed processes and thier child windows.&amp;nbsp; Unlike spy++, managed spy allows you to set and get all managed properties such as "BackColor" or "BorderStyle".&amp;nbsp; You can also view managed events such as "MouseMove" or "ItemSelected".&lt;/P&gt;
&lt;P&gt;The library portion allows &lt;STRONG&gt;&lt;EM&gt;programmatic&lt;/EM&gt;&lt;/STRONG&gt; access to controls in another process.&amp;nbsp; This means you can sync on events and set properties all in your own code.&amp;nbsp; You could use this to create test harnesses, create a diagnostic tool for your application after its deployed or any number of things.&lt;/P&gt;
&lt;P&gt;Take a look at the article and let me know what you think!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=532872" width="1" height="1"&gt;</content><author><name>benwu</name><uri>http://blogs.msdn.com/members/benwu.aspx</uri></author></entry><entry><title>New VS feature allows VS to crash!</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/benwu/archive/2005/09/16/467971.aspx" /><id>http://blogs.msdn.com/benwu/archive/2005/09/16/467971.aspx</id><published>2005-09-16T01:39:00Z</published><updated>2005-09-16T01:39:00Z</updated><content type="html">&lt;P&gt;One of the newer "features" in Visual Studio 8.0 is the ability for us to collect better information about exceptions that are thrown in VS.&amp;nbsp; When an exception is thrown (and unhandled), VS will generate a Watson report that will send microsoft a minidump where the exception occurred.&amp;nbsp; Once we get this watson report, its easier now for us to locate the exact cause and issue a fix.&lt;/P&gt;
&lt;P&gt;Of course, a side effect of this is that unhandled exceptions will bring down VS and may cause loss of data if you had not saved your current work.&amp;nbsp; This can be particularly &lt;STRONG&gt;bad&lt;/STRONG&gt; in some scenarios where your control is being used in VS and throws an exception.&amp;nbsp; We do a lot to try to capture these exceptions.&amp;nbsp; For example, if the exception is thrown during designer load (when your control is being hosted in the windows forms designer) we will not shutdown VS.&amp;nbsp; Instead the user will see what we call the WSoD ("white screen of darn").&amp;nbsp; This indicates the callstack of the exception and disallows further edits to the form.&amp;nbsp; Also, if the exception is thrown as a result of a window message sent through the designer, we will catch the error and display it to the user.&amp;nbsp; An example of this is a button click or a mousehover/mouseover event.&amp;nbsp; These messages are intercepted by the designer before the control in the designer is allowed to process them.&lt;/P&gt;
&lt;P&gt;There are, however, scenarios that we can not catch during design time.&amp;nbsp; If you throw an exception in a Timer_Tick event, this will not go through a designer and it will therefore bring down VS.&amp;nbsp; We could&amp;nbsp;not change this behavior in the runtime because doing so would be a compat breaking change (apps that used to show the exception dialog in this case would no longer show it).&lt;/P&gt;
&lt;P&gt;It should be rare that you encounter this error.&amp;nbsp; However, if you do -- it can be particularly painful.&amp;nbsp; Especially if it happens whenever a certain form designer appears.&amp;nbsp; What is worse, is that if a solution has stored that it should show a form immediately when you load the solution, you can end up in a situation where VS crashes every time you open the solution!&amp;nbsp; One fix here is to delete the .suo file.&amp;nbsp; This is a solution config file that stores what documents should be opened when the solution is opened.&amp;nbsp; If there is no .suo file, no documents are opened by default.&amp;nbsp; This will give you a chance to fix any errors (in code) that might be giving you problems.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=467971" width="1" height="1"&gt;</content><author><name>benwu</name><uri>http://blogs.msdn.com/members/benwu.aspx</uri></author></entry><entry><title>Fixing Window leaks and "Class Already Registered" errors</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/benwu/archive/2005/09/15/466417.aspx" /><id>http://blogs.msdn.com/benwu/archive/2005/09/15/466417.aspx</id><published>2005-09-14T22:44:00Z</published><updated>2005-09-14T22:44:00Z</updated><content type="html">&lt;P&gt;Windows Forms makes it very easy to create a rich UI experience.&amp;nbsp; But it also makes it easy to leak windows or resources.&lt;/P&gt;
&lt;P&gt;For example, say you create a new temporary AppDomain and decide to show some UI in it.&amp;nbsp; If you close the AppDomain without cleaning up the windows (ie call Dispose on the Controls or close the windows via the UI), then the windows will be orphaned and will not be cleaned up properly.&lt;/P&gt;
&lt;P&gt;It is also easy to create new threads with UI.&amp;nbsp; However, if you shut down the thread that created the UI, any active windows will again be orphaned.&amp;nbsp; This is because you cannot destroy a window from a thread other than the thread that created the window.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;WindowCleanup : A utility to help&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Below is a class called "WindowCleanup" along with a Form that displays how it can be used:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;using System;&lt;BR&gt;using System.Drawing;&lt;BR&gt;using System.Collections;&lt;BR&gt;using System.ComponentModel;&lt;BR&gt;using System.Windows.Forms;&lt;BR&gt;using System.Data;&lt;BR&gt;using System.Runtime.InteropServices;&lt;BR&gt;using System.Threading;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;namespace WindowsApplication1&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;/// &amp;lt;summary&amp;gt;&lt;BR&gt;&amp;nbsp;/// Summary description for Form1.&lt;BR&gt;&amp;nbsp;/// &amp;lt;/summary&amp;gt;&lt;BR&gt;&amp;nbsp;public class Form1 : System.Windows.Forms.Form&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;private System.Windows.Forms.Button button1;&lt;BR&gt;&amp;nbsp;&amp;nbsp;private System.Windows.Forms.Button button2;&lt;BR&gt;&amp;nbsp;&amp;nbsp;/// &amp;lt;summary&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;/// Required designer variable.&lt;BR&gt;&amp;nbsp;&amp;nbsp;/// &amp;lt;/summary&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;private System.ComponentModel.Container components = null;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&amp;nbsp;&amp;nbsp;public Form1()&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Required for Windows Form Designer support&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;InitializeComponent();&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;// TODO: Add any constructor code after InitializeComponent call&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&amp;nbsp;&amp;nbsp;/// &amp;lt;summary&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;/// Clean up any resources being used.&lt;BR&gt;&amp;nbsp;&amp;nbsp;/// &amp;lt;/summary&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;protected override void Dispose( bool disposing )&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if( disposing )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (components != null) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;components.Dispose();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;base.Dispose( disposing );&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&amp;nbsp;&amp;nbsp;#region Windows Form Designer generated code&lt;BR&gt;&amp;nbsp;&amp;nbsp;/// &amp;lt;summary&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;/// Required method for Designer support - do not modify&lt;BR&gt;&amp;nbsp;&amp;nbsp;/// the contents of this method with the code editor.&lt;BR&gt;&amp;nbsp;&amp;nbsp;/// &amp;lt;/summary&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;private void InitializeComponent()&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.button1 = new System.Windows.Forms.Button();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.button2 = new System.Windows.Forms.Button();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.SuspendLayout();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;// &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;// button1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;// &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.button1.Location = new System.Drawing.Point(56, 152);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.button1.Name = "button1";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.button1.TabIndex = 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.button1.Text = "CleanUp";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.button1.Click += new System.EventHandler(this.button1_Click);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;// &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;// button2&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;// &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.button2.Location = new System.Drawing.Point(112, 80);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.button2.Name = "button2";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.button2.TabIndex = 1;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.button2.Text = "NewAppDomainWindow";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.button2.Click += new System.EventHandler(this.button2_Click);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;// &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Form1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;// &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.ClientSize = new System.Drawing.Size(292, 266);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.Controls.Add(this.button2);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.Controls.Add(this.button1);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.Name = "Form1";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.Text = "Form1";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.ResumeLayout(false);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;#endregion&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&amp;nbsp;&amp;nbsp;/// &amp;lt;summary&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;/// The main entry point for the application.&lt;BR&gt;&amp;nbsp;&amp;nbsp;/// &amp;lt;/summary&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;[STAThread]&lt;BR&gt;&amp;nbsp;&amp;nbsp;static void Main() &lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Application.Run(new Form1());&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=1&gt;&amp;nbsp;&amp;nbsp;private void button1_Click(object sender, System.EventArgs e)&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;WindowCleanup.CloseWindows(false, false);&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&amp;nbsp;&amp;nbsp;AppDomain domain;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;private void button2_Click(object sender, System.EventArgs e)&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (domain != null) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AppDomain.Unload(domain);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;domain = AppDomain.CreateDomain("tempdomain");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Form1 domainform = (Form1)domain.CreateInstanceAndUnwrap(typeof(Form1).Assembly.FullName,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;typeof(Form1).FullName);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;domainform.Show();&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&amp;nbsp;class WindowCleanup &lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;static bool closeNonManaged = false;&lt;BR&gt;&amp;nbsp;&amp;nbsp;static bool closeOnlyThisThread = false;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&amp;nbsp;&amp;nbsp;[DllImport("kernel32.dll", CharSet=CharSet.Auto, ExactSpelling=true)]&lt;BR&gt;&amp;nbsp;&amp;nbsp;public static extern int GetCurrentProcessId();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;[DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)]&lt;BR&gt;&amp;nbsp;&amp;nbsp;public static extern int GetWindowThreadProcessId(HandleRef hWnd, out int lpdwProcessId);&lt;BR&gt;&amp;nbsp;&amp;nbsp;[DllImport("user32.dll", ExactSpelling=true)]&lt;BR&gt;&amp;nbsp;&amp;nbsp;public static extern bool EnumChildWindows(HandleRef hwndParent, EnumWindowCallback lpEnumFunc, HandleRef lParam);&lt;BR&gt;&amp;nbsp;&amp;nbsp;[DllImport("user32.dll", CharSet=CharSet.Auto)]&lt;BR&gt;&amp;nbsp;&amp;nbsp;public static extern IntPtr SendMessage(HandleRef hWnd, int msg, int wParam, int lParam);&lt;BR&gt;&amp;nbsp;&amp;nbsp;[DllImport("user32.dll", CharSet=CharSet.Auto, SetLastError=true)]&lt;BR&gt;&amp;nbsp;&amp;nbsp;public static extern bool EnumWindows(EnumWindowCallback callback, IntPtr extraData);&lt;BR&gt;&amp;nbsp;&amp;nbsp;[DllImport("kernel32.dll", CharSet=CharSet.Auto, ExactSpelling=true)]&lt;BR&gt;&amp;nbsp;&amp;nbsp;public static extern int GetCurrentThreadId();&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&amp;nbsp;&amp;nbsp;public delegate bool EnumWindowCallback(IntPtr hwnd, IntPtr lParam);&lt;BR&gt;&amp;nbsp;&amp;nbsp;public static HandleRef NullHandleRef;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;static public void CloseWindows(bool nonManaged, bool onlyThisThread)&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;WindowCleanup.closeNonManaged = nonManaged;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;WindowCleanup.closeOnlyThisThread = onlyThisThread;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;EnumWindows(&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new EnumWindowCallback(CloseWindowsCallback), IntPtr.Zero);&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&amp;nbsp;&amp;nbsp;private static bool CloseWindowsCallback(IntPtr handle, IntPtr extraParameter)&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;int procid1;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;int procid2 = GetCurrentProcessId();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;int threadid1 = GetWindowThreadProcessId(new HandleRef(null, handle), out procid1);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (procid1 == procid2)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (closeNonManaged || NativeWindow.FromHandle(handle) != null)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!closeOnlyThisThread || GetCurrentThreadId() == threadid1) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SendMessage(new HandleRef(null, handle), 0x10, 0, 0);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return true;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EnumChildWindows(new HandleRef(null, handle), &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new EnumWindowCallback(CloseWindowsCallback), NullHandleRef);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return true;&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;}&lt;BR&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;WindowCleanup has one main static method:&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;&lt;EM&gt;&lt;STRONG&gt;WindowCleanup.CloseWindows(nonManaged, onlyThisThread)&lt;/STRONG&gt;&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;nonManaged&lt;/STRONG&gt;:&amp;nbsp; If this is true, then all windows belonging to the current process will be closed.&amp;nbsp; If false, then only windows recognized as managed windows in the &lt;STRONG&gt;current appdomain&lt;/STRONG&gt; will be closed.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;onlyThisThread&lt;/STRONG&gt;:&amp;nbsp; If this is true, then only windows created on the calling thread will be closed.&amp;nbsp; Use this to clean up any leftover windows before your temporary UI thread terminates.&lt;/P&gt;
&lt;P&gt;To see the difference this class makes, run the code above by creating a new C# Windows application and copying this code over Form1.cs.&amp;nbsp; When you run it, you will see 2 buttons (somewhat randomly placed).&lt;/P&gt;
&lt;P&gt;Do this to see an error that occurs when you leak a window:&lt;/P&gt;
&lt;P&gt;1.&amp;nbsp; Run the application&lt;/P&gt;
&lt;P&gt;2.&amp;nbsp; Click the "New AppdomainWindow" button on the first form.&amp;nbsp; A new form will appear and will have focus.&lt;/P&gt;
&lt;P&gt;3.&amp;nbsp; Go back to the first form and click the button again.&amp;nbsp; The opened form will disappear and a new form will appear.&lt;/P&gt;
&lt;P&gt;4.&amp;nbsp; Perform step 3 additional times.&amp;nbsp; Eventually you will get a "ClassAlreadyRegistered" error which occurs because a window was leaked.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Now, to see how the class fixes the problem:&lt;/P&gt;
&lt;P&gt;1.&amp;nbsp; Run the application&lt;/P&gt;
&lt;P&gt;2.&amp;nbsp; Click the "New AppdomainWindow" button on the first form.&amp;nbsp; A new form will appear and will have focus.&lt;/P&gt;
&lt;P&gt;3.&amp;nbsp; Go click the "Cleanup" button on the newly opened form.&amp;nbsp; That opened form will disappear.&lt;/P&gt;
&lt;P&gt;4.&amp;nbsp; Now click "NewAppdomainForm" again on the first form to show a second form again.&lt;/P&gt;
&lt;P&gt;5.&amp;nbsp; Perform step 3-4 additional times.&amp;nbsp; You will not get an error because the utility class is cleaning up open windows in the appdomain that will be shut down.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Let&amp;nbsp;me know if this helps you at all!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=466417" width="1" height="1"&gt;</content><author><name>benwu</name><uri>http://blogs.msdn.com/members/benwu.aspx</uri></author></entry><entry><title>SpyWindowFinalizer and Windows Message Hooking</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/benwu/archive/2005/08/17/452437.aspx" /><id>http://blogs.msdn.com/benwu/archive/2005/08/17/452437.aspx</id><published>2005-08-17T03:40:00Z</published><updated>2005-08-17T03:40:00Z</updated><content type="html">&lt;P&gt;One very powerful API that some UI developers may not be aware of is SetWindowHookEx.&amp;nbsp; This api allows you to intercept all types of window messages before (or after) they are processed.&lt;/P&gt;
&lt;P&gt;You can use this to do a whole range of neat things.&amp;nbsp; For instance, you can log all messages in your app.&amp;nbsp; You can use the windows journal record/playback utility to create a test harness.&amp;nbsp; You can also write code to validate your application -- such as whether your application disposes all of its windows properly.&amp;nbsp; If you allow a control to finalize (for example, if you remove the control from its container and do not call Dispose() on it), it can hurt the performance of your application or even worse -- cause an AV.&lt;/P&gt;
&lt;P&gt;The sample class I wrote below (SpyWindowFinalizer) allows you to detect controls in your application that are not being properly Dispose()'d&amp;nbsp;and could be leaking and causing performance problems.&amp;nbsp; It&amp;nbsp;allows you to take snapshots of all the controls currently valid in the application.&amp;nbsp; You could use this in a UI intensive app to measure where you may have too many temporary controls.&amp;nbsp; It also is a good starting sample if you'd like to do some window message hooking on your own!&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;using System;&lt;BR&gt;using System.Drawing;&lt;BR&gt;using System.Collections;&lt;BR&gt;using System.ComponentModel;&lt;BR&gt;using System.Windows.Forms;&lt;BR&gt;using System.Data;&lt;BR&gt;using System.Runtime.InteropServices;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;namespace&amp;nbsp;WindowSpy {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// This class uses SetWindowsHookEx to gather statistics and information&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// on windows created in the application.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// It can easily be extended to track detailed information on each control or&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// modify each control in some manner&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; class SpyWindowFinalizer {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// These P/Invokes are necessary to create and manage the hook&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [DllImport("User32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static extern IntPtr CallNextHookEx(HandleRef hhook, int code, IntPtr wparam, IntPtr lparam);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [DllImport("User32.dll", CharSet = CharSet.Auto)]&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static extern IntPtr SetWindowsHookEx(int hookid, HookProc pfnhook, HandleRef hinst, int threadid);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [DllImport("Kernel32.dll", ExactSpelling = true, CharSet = System.Runtime.InteropServices.CharSet.Auto)]&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static extern int GetCurrentThreadId();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [DllImport("User32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static extern bool UnhookWindowsHookEx(HandleRef hhook);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public const int WH_CALLWNDPROC = 4;&amp;nbsp;&amp;nbsp;&amp;nbsp; //this tells SetWindowsHookEx to hook WndProc calls&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public const int HC_ACTION = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //when this comes into our callback, we should handle the message&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public const int WM_CREATE = 0x0001;&amp;nbsp;&amp;nbsp;&amp;nbsp; //this window message is sent when a window is created&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public const int WM_NCDESTROY = 0x0082; //this window message is sent when the nonclient area of a window is destroyed&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static HookProc hookProc;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //this is the delegate to our message hook&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static IntPtr messageHookHandle;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //the handle used for unregistering&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static Hashtable ctorTable = new Hashtable();&amp;nbsp;&amp;nbsp; //our window table that holds all of the active window information we need&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static ArrayList badWindows = new ArrayList();&amp;nbsp; //a list of windows that finalized with the window active.&amp;nbsp; This means the control was not disposed properly&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Sets up our hook&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static void Initialize() {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (messageHookHandle != IntPtr.Zero) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hookProc = new HookProc(MessageHookProc);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; messageHookHandle = SetWindowsHookEx(WH_CALLWNDPROC,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hookProc,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new HandleRef(null, IntPtr.Zero),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetCurrentThreadId());&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Terminates our hook&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static void Terminate() {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GC.Collect();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GC.WaitForPendingFinalizers();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Application.DoEvents();&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (messageHookHandle != IntPtr.Zero) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UnhookWindowsHookEx(new HandleRef(null, messageHookHandle));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hookProc = null;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; messageHookHandle = IntPtr.Zero;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (string info in ctorTable.Values) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; badWindows.Add("**possible leak**" + info);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctorTable.Clear();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Returns a list of the windows that were not disposed.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static IEnumerable WindowsFinalized {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return badWindows;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Returns the current list of all windows forms controls&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static IEnumerable WindowsStillAlive {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ArrayList list = new ArrayList();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (IntPtr handle in ctorTable.Keys) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Control c = Control.FromHandle(handle);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (c != null) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; list.Add(c);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return list;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// The message hook itself.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// It stores info when windows get created and destroyed.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private static unsafe IntPtr MessageHookProc(int nCode, IntPtr wparam, IntPtr lparam) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (nCode == HC_ACTION) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CWPSTRUCT* msg = (CWPSTRUCT*)lparam;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (msg != null) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (msg-&amp;gt;message == WM_CREATE) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Control c = Control.FromHandle(msg-&amp;gt;hwnd);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (c != null) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string controlentry = c.Name + " : " + c.GetType().FullName;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; controlentry +=&amp;nbsp; new System.Diagnostics.StackTrace().ToString();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctorTable.Add(msg-&amp;gt;hwnd, controlentry);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (msg-&amp;gt;message == WM_NCDESTROY) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ctorTable.ContainsKey(msg-&amp;gt;hwnd)) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NativeWindow w = NativeWindow.FromHandle(msg-&amp;gt;hwnd);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (w == null) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; badWindows.Add(ctorTable[msg-&amp;gt;hwnd]);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctorTable.Remove(msg-&amp;gt;hwnd);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return CallNextHookEx(new HandleRef(null, messageHookHandle), nCode, wparam, lparam);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// parameter type for message hook&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [StructLayout(LayoutKind.Sequential)]&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Serializable]&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public struct CWPSTRUCT {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public IntPtr lParam;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public IntPtr wParam;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int message;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public IntPtr hwnd;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;/FONT&gt;&lt;FONT face="Courier New" size=1&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=1&gt;&lt;FONT face="Times New Roman" size=3&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&lt;FONT face="Times New Roman" size=3&gt;To use this in your app, write this:&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&amp;nbsp;&amp;nbsp;[STAThread]&lt;BR&gt;&amp;nbsp;&amp;nbsp;static void Main() &lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SpyWindowFinalizer.Initialize();&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Application.Run(new Form1());&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SpyWindowFinalizer.Terminate();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach(string s in SpyWindowFinalizer.WindowsFinalized) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Windows.Forms.MessageBox.Show(s);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&lt;FONT face="Times New Roman" size=3&gt;This will display the control names, types and contructor callstacks for all controls that finalized before being destroyed (meaning they were likely not properly disposed of).&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&lt;FONT face="Times New Roman" size=3&gt;You can test this by creating a simple windows form application with 2 buttons.&amp;nbsp; In the button click handlers do the following:&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void button1_Click(object sender, System.EventArgs e) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.button1.Parent = null;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.button1 = null;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void button2_Click(object sender, System.EventArgs e) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GC.Collect();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GC.WaitForPendingFinalizers();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Application.DoEvents();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Run the application,&lt;/P&gt;
&lt;P&gt;Click button1&amp;nbsp; (it should disappear)&lt;/P&gt;
&lt;P&gt;Click button2&lt;/P&gt;
&lt;P&gt;Close Form1 and you should see a dialog indicating a potential bad window (being button1 which was never disposed).&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;For more info, see:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookreference/hookfunctions/setwindowshookex.asp"&gt;http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookreference/hookfunctions/setwindowshookex.asp&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=1&gt;&lt;FONT face="Times New Roman" size=3&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;&lt;/FONT&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=452437" width="1" height="1"&gt;</content><author><name>benwu</name><uri>http://blogs.msdn.com/members/benwu.aspx</uri></author></entry><entry><title>Control.Invoke hangs under heavy stress</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/benwu/archive/2005/05/19/420148.aspx" /><id>http://blogs.msdn.com/benwu/archive/2005/05/19/420148.aspx</id><published>2005-05-19T03:00:00Z</published><updated>2005-05-19T03:00:00Z</updated><content type="html">&lt;P&gt;&lt;FONT size=2&gt;There have been reports of Control.Invoke hanging after the method completes.&amp;nbsp; This was reported by a few&amp;nbsp;customers and we&amp;nbsp;have fixed this.&amp;nbsp;&amp;nbsp;For your reference:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;ID: SRX050308605416&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;KB Article: 896665&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;The problem stems from some of the errors I describe in my previous post.&amp;nbsp; IsCompleted will be "true", but the AsyncWaitHandle will never be set.&amp;nbsp; The fix&amp;nbsp;will be included in our next service pack.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;A few workarounds exist:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;1.&amp;nbsp;Use a timeout in a loop checking IsComplete.&amp;nbsp; Such as:&lt;/FONT&gt;&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr&gt;
&lt;P&gt;&lt;FONT size=2&gt;while (!result.IsCompleted) {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;result.AsyncWaitHandle.WaitOne(200, false);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT size=2&gt;2.&amp;nbsp;Access AsyncWaitHandle and call Thread.MemoryBarrier() before checking IsComplete&lt;/FONT&gt;&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr&gt;
&lt;P&gt;&lt;FONT size=2&gt;WaitHandle handle = result.AsyncWaitHandle; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;Thread.MemoryBarrier();&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;if (!result.IsCompleted) {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;handle.WaitOne();&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;instead of:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;if (!result.IsCompleted) {&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;result.AsyncWaitHandle.WaitOne();&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT size=2&gt;Both of these workarounds should work.&amp;nbsp; The first has a minor perf implication.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;Props to Jack Cheng&amp;nbsp;at VideoTechnics&amp;nbsp;for helping to correct the second fix.&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=420148" width="1" height="1"&gt;</content><author><name>benwu</name><uri>http://blogs.msdn.com/members/benwu.aspx</uri></author></entry><entry><title>Is this code threadsafe?</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/benwu/archive/2005/05/06/415247.aspx" /><id>http://blogs.msdn.com/benwu/archive/2005/05/06/415247.aspx</id><published>2005-05-06T08:16:00Z</published><updated>2005-05-06T08:16:00Z</updated><content type="html">&lt;P&gt;Here is a question for you multithreaded coders out there.&lt;/P&gt;
&lt;P&gt;After executing Thread1 and Thread2, what are the possible values for "i"?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;bool&lt;/FONT&gt; b1 = &lt;FONT color=#0000ff&gt;false&lt;/FONT&gt;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;bool&lt;/FONT&gt; b2 = &lt;FONT color=#0000ff&gt;false&lt;/FONT&gt;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;int&lt;/FONT&gt; i = 0;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;private void&lt;/FONT&gt; Thread1() {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b1 = &lt;FONT color=#0000ff&gt;true&lt;/FONT&gt;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;if&lt;/FONT&gt; (b2) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i = 1;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;private void&lt;/FONT&gt; Thread2() {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b2 = &lt;FONT color=#0000ff&gt;true&lt;/FONT&gt;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;if&lt;/FONT&gt; (b1) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i = 1;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;The answer may surprise you.&amp;nbsp; In fact, it may be zero on multiprocessor machines do to load/store optimizations made by the CPU.&amp;nbsp; Try it for yourself.&amp;nbsp; (note: you will always get i==1 on a single proc machine).&lt;/P&gt;
&lt;P&gt;Pages 19-20 in &lt;A href="http://www.microsoft.com/whdc/driver/kernel/MP_issues.mspx"&gt;http://www.microsoft.com/whdc/driver/kernel/MP_issues.mspx&lt;/A&gt; explain why.&amp;nbsp; What is happening is that in about 1 in 1000 cases (if you actually test this on a multi-CPU machine), the CPU for Thread1 will preload the value of b2 at the same time the CPU for Thread2 is preloading the value for b1.&amp;nbsp; These CPUs then write out the new values at the same time, but lo and behold.&amp;nbsp; The loaded values for each bool will be false and neither if statement will be executed.&amp;nbsp; Pretty interesting, yes?&lt;/P&gt;
&lt;P&gt;On the "completely unrelated, but important" front, I have switched teams within Microsoft and I now belong to the .Net Client team (we own System.Windows.Forms, ComponentModel, Designer and a whole bunch of new features for whidbey such as ToolStrips, LayoutPanels, and DataGridView).&amp;nbsp; After using .Net for five years now, I hardly remember what MFC was like.&amp;nbsp; I can't imagine calling DoDataExchange or writing custom message handlers for anything.&amp;nbsp; I'm not sure many MFC coders know not only how easy it is to write UI in .Net, but also how flexible it is.&amp;nbsp; Only thing is -- I wish you could just override a method and see every window message being sent to the window.&amp;nbsp; Guess what-&amp;nbsp; you can do that!&amp;nbsp; Just override protected WndProc and you have all the power in the world.&amp;nbsp; Man, imagine having to add message handlers into a table (using&amp;nbsp;defines you&amp;nbsp;must remember beforehand)&amp;nbsp;for each message you wanted and pointing to a new method.&amp;nbsp; What a hassle.&amp;nbsp; I think its almost too easy in .Net.&amp;nbsp; Programmers in .Net have a tendency to be wasteful and create GDI objects (such as Fonts or Brushes) without cleaning them up -- but I digress.&lt;/P&gt;
&lt;P&gt;On the "be careful, don't do that" front, do not call SetWindowLong(GWL_WNDPROC) on a background thread (that is -- a thread other than the one that owns the window handle).&amp;nbsp; There is a threading issue with DispatchMessage and SetWindowLong(GWL_WNDPROC) that could cause your app to AV.&amp;nbsp; To change the wndproc or subclass/unsubclass you should do this via a window message so the SetWindowLong call gets executed on the UI thread -- or -- ensure that DispatchMessage is not being called on the window handle you are changing the wndproc.&amp;nbsp; Support article on this is incoming soon.&lt;/P&gt;
&lt;P&gt;And finally, on the "be careful and DO that" front, please remember to call Dispose on all disposable objects.&amp;nbsp; If you do not call dispose explicitly, you will allow the object to be garbage collected.&amp;nbsp; Not only does this decrease performance because your peak workingset is higher, but you are also exposing yourself to potentially nasty threading issues because, yes, the finalizer runs on a background thread.&amp;nbsp; (see previous 2 issues for examples).&amp;nbsp; Finalizers also typically have different logic than the explicit dispose and finalizers are difficult to write not only because of the threading issues -- but also because finalization order is not guaranteed.&amp;nbsp; For example, if A references B and B references C and C references A which one will be finalized first when none of the three are referenced by outside objects?&amp;nbsp; The answer is that it is not deterministic -- and you need to remember that when writing your finalizer.&amp;nbsp; More on this later.&lt;/P&gt;
&lt;P&gt;That's it for now -- happy Mother's day!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&amp;nbsp;&lt;/P&gt;&lt;/FONT&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=415247" width="1" height="1"&gt;</content><author><name>benwu</name><uri>http://blogs.msdn.com/members/benwu.aspx</uri></author></entry><entry><title>Deployment help! in VS 2003</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/benwu/archive/2004/04/30/123050.aspx" /><id>http://blogs.msdn.com/benwu/archive/2004/04/30/123050.aspx</id><published>2004-04-30T11:30:00Z</published><updated>2004-04-30T11:30:00Z</updated><content type="html">&lt;FONT size=2&gt;
&lt;P&gt;I recieved a request for information and deployment and our deployment expert pointed me to this share.&amp;nbsp; Let me know if it helps.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetcomp/html/netcfdeployment.asp"&gt;&lt;U&gt;&lt;FONT color=#0000ff size=2&gt;http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetcomp/html/netcfdeployment.asp&lt;/U&gt;&lt;/FONT&gt;&lt;/A&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=123050" width="1" height="1"&gt;</content><author><name>benwu</name><uri>http://blogs.msdn.com/members/benwu.aspx</uri></author></entry><entry><title>Wireless MP3 is HERE!</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/benwu/archive/2004/02/17/73927.aspx" /><id>http://blogs.msdn.com/benwu/archive/2004/02/17/73927.aspx</id><published>2004-02-17T12:49:00Z</published><updated>2004-02-17T12:49:00Z</updated><content type="html">&lt;P&gt;I sent this as feedback on another persons blog -- but I've got to plug in some free advertising for Creative Labs.&amp;nbsp; This setup is incredible.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://us.creative.com/products/product.asp?category=119&amp;amp;subcategory=121&amp;amp;product=9192"&gt;http://us.creative.com/products/product.asp?category=119&amp;amp;subcategory=121&amp;amp;product=9192&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;It took me about 15 minutes to set up over my existing 802.11 (wireless) network at home.&amp;nbsp; It would have taken less, but I have security enabled on my network, so I had to plug in the reciever into my computer's USB port to configure it.&amp;nbsp;&amp;nbsp;The setup consists of 2 peices of hardware:&lt;/P&gt;
&lt;P&gt;1.&amp;nbsp; The reciever&amp;nbsp; (just like an 802.11 base station, but instead of an ethernet output, it gives stereo output)&lt;/P&gt;
&lt;P&gt;2.&amp;nbsp; A&amp;nbsp;RF&amp;nbsp;remote with LCD.&amp;nbsp; You don't need line of sight with this and you can browse your entire library.&amp;nbsp; My only complaint with this is that there is no pageUP/DOWN.&amp;nbsp; But &amp;#8220;SmartPlaylists&amp;#8221; and favorites makes navigation much easier.&lt;/P&gt;
&lt;P&gt;There is nothing like lying down listeneing to your music and browsing for the next song on your remote.&amp;nbsp; Truly a new experience that you quickly get used to.&amp;nbsp; I don't think I will ever have another CD again.&amp;nbsp; Any CD I get as a gift will get downloaded to an MP3 file and then promptly placed in the trashbin.&amp;nbsp; Oh wait, my car still can't play MP3's.&amp;nbsp; Oh well, I guess thats where all my CDs will wind up.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=73927" width="1" height="1"&gt;</content><author><name>benwu</name><uri>http://blogs.msdn.com/members/benwu.aspx</uri></author></entry><entry><title>Having assembly binding problems?</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/benwu/archive/2004/02/16/73463.aspx" /><id>http://blogs.msdn.com/benwu/archive/2004/02/16/73463.aspx</id><published>2004-02-16T19:43:00Z</published><updated>2004-02-16T19:43:00Z</updated><content type="html">&lt;P&gt;If you're getting assembly load errors and cannot figure out why, you can use the fusionlog viewer to help figure it out.&amp;nbsp; The fusion log will show exactly how all managed assemblies were resolved.&lt;/P&gt;
&lt;P&gt;Check out:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cptools/html/cpgrffusionlogviewerfuslogvwexe.asp"&gt;http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cptools/html/cpgrffusionlogviewerfuslogvwexe.asp&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;This includes retargeted assemblies.&amp;nbsp; For example, if you run your device application on the desktop, compact framework assemblies are &amp;#8220;retargeted&amp;#8221; to desktop versions -- but only if fusion policy was applied.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;If you get a cryptic assembly load error when trying to run your app, try using the above log viewer.&amp;nbsp; It can save you a few hours.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=73463" width="1" height="1"&gt;</content><author><name>benwu</name><uri>http://blogs.msdn.com/members/benwu.aspx</uri></author></entry><entry><title>Custom controls for Devices in VS 7.1</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/benwu/archive/2004/02/02/65944.aspx" /><id>http://blogs.msdn.com/benwu/archive/2004/02/02/65944.aspx</id><published>2004-02-02T18:33:00Z</published><updated>2004-02-02T18:33:00Z</updated><content type="html">&lt;P&gt;A workmate and I were talking in the hallway and he mentioned that he saw several newsgroup postings that implied that the lack of device custom control support in VS 7.1 was intentional.&amp;nbsp; This couldn't be anything further from the truth!&lt;/P&gt;
&lt;P&gt;Although we do support custom controls in VS 7.1, its quite difficult to accomplish.&amp;nbsp; I've added a link to the left&amp;nbsp; (&amp;#8220;&lt;A id=SingleColumn1_Categories_CatList__ctl1_LinkList__ctl1_Link href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetcomp/html/customctrlscompactfx.asp"&gt;&lt;FONT color=#0000ff&gt;Custom Control Creation for Smart Devices in VS 7.1&lt;/FONT&gt;&lt;/A&gt;&amp;#8220; that guides you through the painful process.&lt;/P&gt;
&lt;P&gt;The truth of the matter is that device custom controls&amp;nbsp;are an extremely difficult problem.&amp;nbsp; The problem is that a control may use P/Invokes which are platform-dependant and will not function correctly on the desktop.&amp;nbsp; In fact the Compact Framework uses many P/Invoke calls internally (as does the desktop framework).&amp;nbsp; But coming in MDC (mobility devcon), we will be showcasing some features that some people have already seen at PDC last year.&amp;nbsp; Custom controls will be &lt;STRONG&gt;much&lt;/STRONG&gt; easier than in 7.1.&amp;nbsp; In fact, most of the time you won't even realize any difference between coding against the desktop framework versus the compact framework.&amp;nbsp; And&amp;nbsp;the foundation of why is based on retargetting.&amp;nbsp; More on retargeting next time.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=65944" width="1" height="1"&gt;</content><author><name>benwu</name><uri>http://blogs.msdn.com/members/benwu.aspx</uri></author></entry><entry><title>First Post</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/benwu/archive/2004/02/02/65938.aspx" /><id>http://blogs.msdn.com/benwu/archive/2004/02/02/65938.aspx</id><published>2004-02-02T18:16:00Z</published><updated>2004-02-02T18:16:00Z</updated><content type="html">This is my first BLOG entry!  I am a developer on the Visual Studio for Smart Devices team.  My main areas of expertise are designer infrastructure, custom controls, and a hodgepodge of other areas such as Intellisense and post-compilation verification.

We are very busy as MDC is approaching and we want to show off all the great work our whole team has been doing.  Hope to see you there!
&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=65938" width="1" height="1"&gt;</content><author><name>benwu</name><uri>http://blogs.msdn.com/members/benwu.aspx</uri></author></entry></feed>