<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:yt="http://gdata.youtube.com/schemas/2007" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
   <channel>
      <title>ligAZ blogs</title>
      <description>Stefan Dobrev speaking ...</description>
      <link>http://pipes.yahoo.com/pipes/pipe.info?_id=ZKEOPsML3RGD2__96kjTQA</link>
      <pubDate>Mon, 06 Jul 2009 17:33:32 -0700</pubDate>
      <generator>http://pipes.yahoo.com/pipes/</generator>
      <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/ligaz" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
         <title>Transpose or just rows as columns</title>
         <link>http://feedproxy.google.com/~r/ligaz/~3/BkVBZD_BBiA/transpose_or_just_rows_as_columns.aspx</link>
         <description>&lt;p&gt;A common scenario when displaying tabular data is to flip the axis so your rows becomes columns and vice versa. This can be easily achieved when you know the shape of your data. For example imagine we have a &lt;strong&gt;Customer&lt;/strong&gt; class with 3 properties:&amp;#160; &lt;strong&gt;Name&lt;/strong&gt;, &lt;strong&gt;Age&lt;/strong&gt; and &lt;strong&gt;JobCode&lt;/strong&gt;. Let’s say that we have 5 customers in our data repository. If we want to select just the names we can do something like this:&lt;/p&gt; &lt;div style="font-family:consolas;background:#e6e6e6;color:black;font-size:10pt;"&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;IList&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Customer&lt;/span&gt;&amp;gt; customers = &lt;span style="color:#2b91af;"&gt;Customer&lt;/span&gt;.GetAll();&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt; names =&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;new&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Customer1 = customers[0].Name,&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Customer2 = customers[1].Name,&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Customer3 = customers[2].Name,&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Customer4 = customers[3].Name,&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Customer5 = customers[4].Name&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; };&lt;/p&gt; &lt;/div&gt; &lt;p&gt;Imagine that another Customer is added and suddenly this code have to changed. Obviously this won’t scale even in a short period of time. So what is the solution?&lt;/p&gt; &lt;h3&gt;Introducing Transpose&amp;lt;T&amp;gt; extension method&lt;/h3&gt; &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Transpose"&gt;Transpose&lt;/a&gt; is an operation used in linear algebra to transpose (of course) a matrix. In our case Transpose is an extension method with the following signature:&lt;/p&gt; &lt;div style="font-family:consolas;background:#e6e6e6;color:black;font-size:10pt;"&gt; &lt;p style="margin:0px;"&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:#2b91af;"&gt;IEnumerable&lt;/span&gt; Transpose&amp;lt;T&amp;gt;(&lt;span style="color:blue;"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; source)&lt;/p&gt; &lt;/div&gt; &lt;p&gt;But what did Transpose do under the covers? Here are the recipe ingredients:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;1 tablespoon of &lt;a rel="nofollow" target="_blank" href="http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx"&gt;DynamicClass&lt;/a&gt;. &lt;/li&gt; &lt;li&gt;2 tablespoons of Reflection. &lt;/li&gt; &lt;li&gt;1 cup of Expression Trees. &lt;/li&gt; &lt;li&gt;1 slice of LINQ. &lt;/li&gt; &lt;li&gt;2 slices of functional programming. &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Here is the code itself:&lt;/p&gt; &lt;div style="font-family:consolas;background:#e6e6e6;color:black;font-size:10pt;"&gt; &lt;p style="margin:0px;"&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;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EnumerableExtension&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;{&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;readonly&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MethodInfo&lt;/span&gt; GetValueMethod =&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (&lt;span style="color:blue;"&gt;from&lt;/span&gt; m &lt;span style="color:blue;"&gt;in&lt;/span&gt; &lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;PropertyInfo&lt;/span&gt;).GetMethods()&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;where&lt;/span&gt; m.Name == &lt;span style="color:#a31515;"&gt;"GetValue"&lt;/span&gt; &amp;amp;&amp;amp; !m.IsAbstract&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;select&lt;/span&gt; m).First();&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;readonly&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ConstantExpression&lt;/span&gt; NullObjectArrayExpression =&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;Expression&lt;/span&gt;.Constant(&lt;span style="color:blue;"&gt;null&lt;/span&gt;, &lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:blue;"&gt;object&lt;/span&gt;[]));&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt; Transpose&amp;lt;T&amp;gt;(&lt;span style="color:blue;"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; source)&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (source == &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;throw&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;"source"&lt;/span&gt;);&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; TransposeCore(source);&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Delegate&lt;/span&gt; CreateSelectorFunc&amp;lt;T&amp;gt;(&lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; source)&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; T[] list = source.ToArray();&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;DynamicProperty&lt;/span&gt;[] dynamicProperties =&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; list.Select(i =&amp;gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DynamicProperty&lt;/span&gt;(i.ToString(), &lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:blue;"&gt;object&lt;/span&gt;))).ToArray();&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;Type&lt;/span&gt; transposedType = &lt;span style="color:#2b91af;"&gt;ClassFactory&lt;/span&gt;.Instance.GetDynamicClass(dynamicProperties);&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;ParameterExpression&lt;/span&gt; propParam = &lt;span style="color:#2b91af;"&gt;Expression&lt;/span&gt;.Parameter(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;PropertyInfo&lt;/span&gt;), &lt;span style="color:#a31515;"&gt;"prop"&lt;/span&gt;);&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; bindings = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MemberBinding&lt;/span&gt;[list.Length];&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;for&lt;/span&gt; (&lt;span style="color:blue;"&gt;int&lt;/span&gt; i = 0; i &amp;lt; list.Length; i++)&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;MethodCallExpression&lt;/span&gt; getter =&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;Expression&lt;/span&gt;.Call(&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; propParam,&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; GetValueMethod,&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;Expression&lt;/span&gt;.Constant(list[i]),&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NullObjectArrayExpression&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; );&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; bindings[i] = &lt;span style="color:#2b91af;"&gt;Expression&lt;/span&gt;.Bind(transposedType.GetProperty(dynamicProperties[i].Name), getter);&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;LambdaExpression&lt;/span&gt; selector =&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;Expression&lt;/span&gt;.Lambda(&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;Expression&lt;/span&gt;.MemberInit(&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;Expression&lt;/span&gt;.New(transposedType),&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; bindings),&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; propParam);&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; selector.Compile();&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt; TransposeCore&amp;lt;T&amp;gt;(&lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; source)&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;PropertyInfo&lt;/span&gt;&amp;gt; properties = &lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(T).GetProperties().ToList();&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;Delegate&lt;/span&gt; selector = CreateSelectorFunc(source);&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;PropertyInfo&lt;/span&gt; property &lt;span style="color:blue;"&gt;in&lt;/span&gt; properties)&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;yield&lt;/span&gt; &lt;span style="color:blue;"&gt;return&lt;/span&gt; selector.DynamicInvoke(property);&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;p style="margin:0px;"&gt;}&lt;/p&gt; &lt;/div&gt; &lt;p&gt;Note that &lt;a rel="nofollow" target="_blank" href="http://blogs.msdn.com/ericlippert/archive/2008/09/08/high-maintenance.aspx"&gt;some&lt;/a&gt; iterator best guidelines are also in place. And the final result is:&lt;/p&gt; &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://blogs.telerik.com/Libraries/MetaBlogLib/WindowsLiveWriter-Transposeorjustrowsascolumns_C513-TransposedGridView_2.sflb"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="TransposedGridView" border="0" alt="TransposedGridView" src="http://blogs.telerik.com/Libraries/MetaBlogLib/WindowsLiveWriter-Transposeorjustrowsascolumns_C513-TransposedGridView_thumb.sflb" width="596" height="387"/&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:fb3a1972-4489-4e52-abe7-25a00bb07fdf:5699af67-0801-4b87-9f3d-e65f210f86f4" class="wlWriterEditableSmartContent"&gt;&lt;p&gt;You can download the code from &lt;a rel="nofollow" target="_blank" href="http://blogs.telerik.com/Libraries/MetaBlogLib/WindowsLiveWriter-Transposeorjustrowsascolumns_C513-Transpose-RowsAsColumns.sflb"&gt;here&lt;/a&gt;&lt;/p&gt;&lt;/div&gt; . &lt;p&gt;&lt;/p&gt; &lt;p&gt;Have fun.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ligaz/~4/BkVBZD_BBiA" height="1" width="1"/&gt;</description>
         <author>Stefan Dobrev</author>
         <guid isPermaLink="false">5eafdaab-f7a0-4519-a542-a185a98c5875</guid>
         <pubDate>Mon, 16 Feb 2009 00:17:54 -0800</pubDate>
      <feedburner:origLink>http://blogs.telerik.com/StefanDobrev/Posts/09-02-16/transpose_or_just_rows_as_columns.aspx</feedburner:origLink></item>
      <item>
         <title>IntelliSense for Expression Blend</title>
         <link>http://feedproxy.google.com/~r/ligaz/~3/gDkWZeLYx9A/intellisense_for_expression_blend.aspx</link>
         <description>&lt;p&gt;&lt;font color="#ff0000"&gt;[Update]: You can find the addin for Expression Blend 2.0 SP1 &lt;/font&gt;&lt;a rel="nofollow" target="_blank" href="https://code.msdn.microsoft.com/Release/ProjectReleases.aspx?ProjectName=BlendSense&amp;amp;ReleaseId=2129"&gt;&lt;font color="#ff0000"&gt;here&lt;/font&gt;&lt;/a&gt;&lt;font color="#ff0000"&gt;.&lt;/font&gt;&lt;/p&gt; &lt;h3&gt;The problem&lt;/h3&gt; &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.microsoft.com/expression/products/Overview.aspx?key=blend"&gt;Expression Blend&lt;/a&gt; has been out in the wild for quite some time. However one of the most annoying thing was the lack of &lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Autocompletion"&gt;autocompletion&lt;/a&gt; (aka &lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/IntelliSense"&gt;IntelliSense&lt;/a&gt;). Most of devs/designers out there were constantly switching from Blend to VS and backwards to do their stuff. The great free tool &lt;a rel="nofollow" target="_blank" href="http://kaxaml.com/"&gt;Kaxaml&lt;/a&gt; is at great help as well.&lt;/p&gt; &lt;h3&gt;The solution&lt;/h3&gt; &lt;p&gt;Using the &lt;strong&gt;Blend 2.5&lt;/strong&gt; add-ins architecture I have created an add-in that adds IntelliSense in Blend. I have reused the code from &lt;a rel="nofollow" target="_blank" href="http://codeplex.com/Kaxaml"&gt;Kaxaml&lt;/a&gt; and adapted it work within Blend. Take a look:&lt;/p&gt; &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://blogs.telerik.com/Libraries/MetaBlog/WindowsLiveWriter-IntelliSenseforExpressionBlend_8BD4-BlendSense_2.sflb"&gt;&lt;img style="border-right-width:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" border="0" alt="BlendSense" src="http://blogs.telerik.com/Libraries/MetaBlog/WindowsLiveWriter-IntelliSenseforExpressionBlend_8BD4-BlendSense_thumb.sflb" width="555" height="388"/&gt;&lt;/a&gt; &lt;/p&gt; &lt;h3&gt;Download&lt;/h3&gt; &lt;p&gt;You can download the add-in from &lt;a rel="nofollow" target="_blank" href="https://code.msdn.microsoft.com/Release/ProjectReleases.aspx?ProjectName=BlendSense&amp;amp;ReleaseId=1358"&gt;here&lt;/a&gt;. What you need to do is:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Extract the contents of installation archive in your Blend 2.5 installation folder (typically &lt;strong&gt;%ProgramFiles%&amp;#92;Microsoft Expression&amp;#92;Blend 2.5 June 2008 Preview&lt;/strong&gt;) &lt;/li&gt; &lt;li&gt;Run Blend from the Blend.bat file that was extracted into Blend's installation folder. (The only way to run an add-in in Blend is to use a command line argument: -addin:path_to_the_addin - in our case -&lt;strong&gt;addin:Addins&amp;#92;Expression.Blend.IntelliSense.dll. &lt;/strong&gt;You can also create a shortcut to Blend and pass this argument.) &lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;Limitations&lt;/h3&gt; &lt;p&gt;There are some limitation of the current implementation:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;You should have &lt;strong&gt;Blend 2.5 June Preview (Version 2.1.1535)&lt;/strong&gt; - available for free download &lt;a rel="nofollow" target="_blank" href="http://www.microsoft.com/downloads/details.aspx?FamilyId=32A3E916-E681-4955-BC9F-CFBA49273C7C&amp;amp;displaylang=en"&gt;here&lt;/a&gt;. For version compatible with &lt;strong&gt;Blend 2.0&lt;/strong&gt; check &lt;a rel="nofollow" target="_blank" href="https://code.msdn.microsoft.com/Release/ProjectReleases.aspx?ProjectName=BlendSense&amp;amp;ReleaseId=2129"&gt;here&lt;/a&gt;. &lt;/li&gt; &lt;li&gt;No support for custom namespace types and custom attached properties. &lt;/li&gt; &lt;li&gt;Currently the Silverlight support is not accurate, because it is using the WPF XML schema for IntelliSense information. &lt;/li&gt; &lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/ligaz/~4/gDkWZeLYx9A" height="1" width="1"/&gt;</description>
         <author>sdobrev</author>
         <guid isPermaLink="false">6b9a7492-f627-4240-8487-676fe6b4dbcb</guid>
         <pubDate>Sun, 03 Aug 2008 18:55:43 -0700</pubDate>
      <feedburner:origLink>http://blogs.telerik.com/StefanDobrev/Posts/08-08-04/intellisense_for_expression_blend.aspx</feedburner:origLink></item>
      <item>
         <title>[ReSharper] Directory name donates namespace Yes or No ?</title>
         <link>http://feedproxy.google.com/~r/ligaz/~3/ukni1dzaJaY/resharper_directory_name_donates_namespace_yes_or_no.aspx</link>
         <description>&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://blogs.telerik.com/Libraries/MetaBlog/WindowsLiveWriter-DirectorynamedonatesnamespaceYesorNo_F480-image_14.sflb"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="59" alt="image" src="http://blogs.telerik.com/Libraries/MetaBlog/WindowsLiveWriter-DirectorynamedonatesnamespaceYesorNo_F480-image_thumb_6.sflb" width="74" align="left" border="0"/&gt;&lt;/a&gt;If you like us are passionate user of &lt;a rel="nofollow" target="_blank" href="http://www.jetbrains.com/resharper/features/index.html"&gt;ReSharper&lt;/a&gt; you know that ReSharper "&lt;em&gt;did not like&lt;/em&gt;" when a class' namespace did not correspond to the directory structure the file belongs to. To illustrate this lets look at a simple example. &lt;/p&gt; &lt;p&gt;Imagine that we have a project named &lt;strong&gt;MyProject&lt;/strong&gt;. By default its namespace is &lt;strong&gt;MyProject&lt;/strong&gt;. Lets have a folder named &lt;strong&gt;MyControls&lt;/strong&gt; in the project as well. Now lets add a class file in that folder, naming it &lt;strong&gt;"MyControl.cs"&lt;/strong&gt;. The default namespace that will be generated for the class will be &lt;strong&gt;MyProject.MyControls.&lt;/strong&gt; It is constructed using the default namespace and joining it with the folder name. But if we change the namespace to be only &lt;strong&gt;MyProject&lt;/strong&gt;, ReSharper will warn us with:&lt;/p&gt; &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://blogs.telerik.com/Libraries/MetaBlog/WindowsLiveWriter-DirectorynamedonatesnamespaceYesorNo_F480-ReSharper-File-Namespace_2.sflb"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="147" alt="ReSharper-File-Namespace" src="http://blogs.telerik.com/Libraries/MetaBlog/WindowsLiveWriter-DirectorynamedonatesnamespaceYesorNo_F480-ReSharper-File-Namespace_thumb.sflb" width="549" border="0"/&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;However, sometimes we may not want this behavior. We may just want to have a folder, which name will not participate in the default class' namespace. How to achieve this? Just in two easy steps:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;1. &lt;strong&gt;Right click&lt;/strong&gt; on the folder and choose &lt;strong&gt;properties&lt;/strong&gt;. &lt;/p&gt; &lt;/blockquote&gt; &lt;blockquote&gt; &lt;p&gt;2. Change the &lt;strong&gt;Namespace Provider&lt;/strong&gt; combo box value from True to False. &lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://blogs.telerik.com/Libraries/MetaBlog/WindowsLiveWriter-DirectorynamedonatesnamespaceYesorNo_F480-image_10.sflb"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="343" alt="image" src="http://blogs.telerik.com/Libraries/MetaBlog/WindowsLiveWriter-DirectorynamedonatesnamespaceYesorNo_F480-image_thumb_4.sflb" width="593" border="0"/&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;Now ReSharper will be happy and everything will be fine. Peace.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ligaz/~4/ukni1dzaJaY" height="1" width="1"/&gt;</description>
         <author>sdobrev</author>
         <guid isPermaLink="false">cb0841bd-91d2-4349-8f90-446942651bae</guid>
         <pubDate>Fri, 04 Jul 2008 04:05:49 -0700</pubDate>
      <feedburner:origLink>http://blogs.telerik.com/StefanDobrev/Posts/08-07-04/resharper_directory_name_donates_namespace_yes_or_no.aspx</feedburner:origLink></item>
      <item>
         <title>Tip of the Day: Clear your ClickOnce application store</title>
         <link>http://feedproxy.google.com/~r/ligaz/~3/JYHLmkhmbTc/tip_of_the_day_clear_your_clickonce_application_store.aspx</link>
         <description>&lt;p&gt;ClickOnce is a great technology that blurs the line between web and client(windows) applications. You can use it to easily deploy windows forms and WPF (through XBAP) app's. However there is common problem with it. The application store (the place where all ClickOnce applications get stored) has the ability to corrupt it self ending in an appropriate version mix of your application. You can end up in situation where "it works on my machine", but in reality the application did not work correctly. To avoid such situation it is a good practice to clear your application store before testing the deployment locally on your machine. You can do that using a magic (I mean it for real) command. Open Visual Studio command prompt and type:&lt;/p&gt; &lt;p style="background:rgb(0, 35, 0) none repeat scroll 0% 0%;"&gt;&lt;span style="color:rgb(0, 255, 0);"&gt;&amp;nbsp; mage -cc&lt;/span&gt;&lt;/p&gt; &lt;p&gt;And a magic happens ;)&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ligaz/~4/JYHLmkhmbTc" height="1" width="1"/&gt;</description>
         <author>sdobrev</author>
         <guid isPermaLink="false">ae24f2f5-fa0e-4601-a25d-7a52d6d559dc</guid>
         <pubDate>Tue, 24 Jun 2008 00:27:36 -0700</pubDate>
      <feedburner:origLink>http://blogs.telerik.com/StefanDobrev/Posts/08-06-24/tip_of_the_day_clear_your_clickonce_application_store.aspx</feedburner:origLink></item>
      <item>
         <title>WPF Series: IFrameworkElement - the missing interface</title>
         <link>http://feedproxy.google.com/~r/ligaz/~3/JwsEBIgvD-M/wpf_series_iframeworkelement_-_the_missing_interface.aspx</link>
         <description>&lt;p&gt;If you are familiar with WPF you are aware that the the grand daddy of all controls is &lt;a rel="nofollow" target="_blank" href="http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.aspx"&gt;FrameworkElement&lt;/a&gt;. It is defined in the PresentationFramework.dll assembly and derives from &lt;a rel="nofollow" target="_blank" href="http://msdn.microsoft.com/en-us/library/system.windows.uielement.aspx"&gt;UIElement&lt;/a&gt; (defined in PresentationCore.dll). Its purpose is to serve as a base element for all framework related stuff: styles, inheritance context, etc. However there is &lt;em&gt;another&lt;/em&gt; framework element - &lt;a rel="nofollow" target="_blank" href="http://msdn.microsoft.com/en-us/library/system.windows.frameworkcontentelement.style.aspx"&gt;FrameworkContentElement&lt;/a&gt;. The main distinct between them is that the later did not defines its own rendering behavior (its inheritors should do so). This is way properties like: (Actual)Width or (Actual)Height are not present at FrameworkContentElement. If you examine the classes that derive from FrameworkContentElement you will find out that they are mainly text and document related ones.&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;a rel="nofollow" target="_blank" href="http://blogs.telerik.com/Libraries/MetaBlog/WindowsLiveWriter-WPFSeriesIFrameworkElementthemissinginte_107EC-image_2.sflb"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="405" alt="image" src="http://blogs.telerik.com/Libraries/MetaBlog/WindowsLiveWriter-WPFSeriesIFrameworkElementthemissinginte_107EC-image_thumb.sflb" width="306" border="0"/&gt;&lt;/a&gt;&lt;/p&gt; &lt;h3&gt;So, what's the deal?&lt;/h3&gt; &lt;p&gt;Looking through the MSDN documentation you will find out that: "FrameworkContentElement deliberately parallels many of the same APIs as &lt;a rel="nofollow" target="_blank" href="http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.aspx"&gt;FrameworkElement&lt;/a&gt;." However they did not implement a common interface. For example if you want to access the DataContext property (present at both classes) you should check explicitly for each type like this:&lt;/p&gt; &lt;div style="font-size:10pt;background:white;padding-bottom:0px;color:black;line-height:1em;font-family:consolas;"&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt; dataContect = &lt;span style="color:#a31515;"&gt;"DataContext"&lt;/span&gt;;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt; frameworkElement = sender &lt;span style="color:blue;"&gt;as&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;FrameworkElement&lt;/span&gt;;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; ( frameworkElement != &lt;span style="color:blue;"&gt;null&lt;/span&gt; )&lt;/p&gt; &lt;p style="margin:0px;"&gt;{&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; frameworkElement.DataContext = dataContect;&lt;/p&gt; &lt;p style="margin:0px;"&gt;}&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;else&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;{&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; frameworkContentElement = sender &lt;span style="color:blue;"&gt;as&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;FrameworkContentElement&lt;/span&gt;;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; ( frameworkContentElement != &lt;span style="color:blue;"&gt;null&lt;/span&gt; )&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; frameworkContentElement.DataContext = dataContect;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;p style="margin:0px;"&gt;}&lt;/p&gt; &lt;/div&gt; &lt;p&gt;This is not good and pretty as it should be. Let's fix it. Introducing the IFrameworkElement - the missing interface. &lt;/p&gt; &lt;h3&gt;IFrameworkElement &lt;/h3&gt; &lt;p&gt;IFrameworkElement interface contains all matching members from FrameworkElement and FrameworkContentElement. It also implements &lt;a rel="nofollow" target="_blank" href="http://msdn.microsoft.com/en-us/library/system.windows.iframeworkinputelement.aspx"&gt;IFrameworkInputElement&lt;/a&gt; and &lt;a rel="nofollow" target="_blank" href="http://msdn.microsoft.com/en-us/library/system.windows.iframeworkinputelement.aspx"&gt;ISupportInitialize&lt;/a&gt;, which both classes implement as well. The way to work with it is to call an extension method (&lt;strong&gt;AsFrameworkElement()&lt;/strong&gt;) defined for a &lt;a rel="nofollow" target="_blank" href="http://msdn.microsoft.com/en-us/library/system.windows.dependencyobject.aspx"&gt;DependencyObject&lt;/a&gt; that will return the type as IFrameworkElement if the target is FrameworkElement or FrameworkContentElement, otherwise it will return null.&amp;#160; Here is now you can operate with it:&lt;/p&gt; &lt;div style="font-size:10pt;background:white;padding-bottom:0px;color:black;line-height:1em;font-family:consolas;"&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:green;"&gt;// sender is DependencyObject&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt; dataContext = &lt;span style="color:#a31515;"&gt;"DataContext"&lt;/span&gt;;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;IFrameworkElement&lt;/span&gt; frameworkElement = sender.AsFrameworkElement();&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (frameworkElement != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/p&gt; &lt;p style="margin:0px;"&gt;{&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; frameworkElement.DataContext = dataContect;&lt;/p&gt; &lt;p style="margin:0px;"&gt;}&lt;/p&gt; &lt;/div&gt; &lt;h3&gt;Why DependencyObject as target?&lt;/h3&gt; &lt;p&gt;If you wonder why the method is defined on DependencyObject - simply because this is the common ancestor of both classes.&lt;/p&gt; &lt;h3&gt;How is it implemented?&lt;/h3&gt; &lt;p&gt;Internally there are two wrappers that wrap FrameworkElement and FrameworkContentElement and implement IFrameworkElement. All the calls to the interface are send to the wrapped element. The actual code is very simple, but about 624 lines long for each element. (It will be a much simpler one line implementation in a dynamic language - C# 4.0 is coming :) ).&lt;/p&gt; &lt;p&gt;You can find a sample solution &lt;a rel="nofollow" target="_blank" href="http://blogs.telerik.com/photos/storage/sdobrev/Posts/20080610/FrameworkElementSample.zip"&gt;here&lt;/a&gt;. The code can be found on &lt;a rel="nofollow" target="_blank" href="http://www.codeplex.com/extensions"&gt;CodePlex&lt;/a&gt; too. &lt;/p&gt; &lt;p&gt;Have fun.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ligaz/~4/JwsEBIgvD-M" height="1" width="1"/&gt;</description>
         <author>sdobrev</author>
         <guid isPermaLink="false">78d0aeaa-057a-409f-92bc-1b346856bc25</guid>
         <pubDate>Tue, 10 Jun 2008 02:51:51 -0700</pubDate>
      <feedburner:origLink>http://blogs.telerik.com/StefanDobrev/Posts/08-06-10/wpf_series_iframeworkelement_-_the_missing_interface.aspx</feedburner:origLink></item>
      <item>
         <title>WPF Series: Creating Generic Adorner</title>
         <link>http://feedproxy.google.com/~r/ligaz/~3/Cb62v6S9XU8/wpf_series_creating_generic_adorner.aspx</link>
         <description>&lt;p&gt;As I have mentioned at the end of the &lt;a rel="nofollow" target="_blank" href="http://blogs.telerik.com/StefanDobrev/Posts/08-04-16/WPF_Series_Adorners_Commands_and_Logical_Tree.aspx"&gt;previous post&lt;/a&gt; today I will show you how to create a generic adorner, which will allow you to decorate a single element&amp;#160; multiple times at different positions. At the end we will be able to create something that looks like this:&lt;/p&gt; &lt;center&gt;&lt;a rel="nofollow" target="_blank" href="http://blogs.telerik.com/Photos/Storage/sdobrev/Posts/20080522/TopicWithAdorners.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="110" alt="TopicWithAdorners" src="http://blogs.telerik.com/Photos/Storage/sdobrev/Posts/20080522/TopicWithAdorners.png" width="209" border="0"/&gt;&lt;/a&gt; &lt;/center&gt; &lt;p&gt;To achieve this we will need a way to say that we want to position the adorner at the different corners of the element as well as to specify whether we want to be inside or outside (vertically or horizontally) of the element. Let's create some enumeration types that will serve for this purpose. Introducing &lt;em&gt;AdornerPosition&lt;/em&gt; and &lt;em&gt;AdornerPlacement&lt;/em&gt; enums.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;AdornerPosition&lt;/strong&gt;&lt;/p&gt; &lt;div style="font-size:10pt;background:white;padding-bottom:0px;color:black;line-height:1em;font-family:consolas;"&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;enum&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;AdornerPosition&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;{&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; Unspecified = 0,&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; TopLeft = 1,&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; TopCenter = 2,&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; TopRight = 3,&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; MiddleLeft = 4,&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; MiddleCenter = 5,&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; MiddleRight = 6,&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; BottomLeft = 7,&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; BottomCenter = 8,&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; BottomRight = 9&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;}&lt;/p&gt; &lt;/div&gt; &lt;p&gt;&lt;strong&gt;AdornerPlacement&lt;/strong&gt;&lt;/p&gt; &lt;div style="font-size:10pt;background:white;padding-bottom:0px;color:black;line-height:1em;font-family:consolas;"&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;enum&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;AdornerPlacement&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;{&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; Unspecified = 0,&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; In = 1,&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; OutHorizontally = 2,&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; OutVertically = 3&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;}&lt;/p&gt; &lt;/div&gt; &lt;p&gt;Each of the enums' values speak for it self, but for clarity here is a diagram that illustrates them:&lt;/p&gt; &lt;center&gt;&amp;#160; &lt;a rel="nofollow" target="_blank" href="http://blogs.telerik.com/Photos/Storage/sdobrev/Posts/20080522/AdornerPlacementAndPosition.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="306" alt="AdornerPlacementAndPosition" src="http://blogs.telerik.com/Photos/Storage/sdobrev/Posts/20080522/AdornerPlacementAndPosition.png" width="439" border="0"/&gt;&lt;/a&gt;&lt;/center&gt; &lt;p&gt;The final piece is to implement the &lt;em&gt;ArrangeOverride()&lt;/em&gt; method of the &lt;em&gt;Adorner&lt;/em&gt; class. It looks like this:&lt;/p&gt; &lt;div style="font-size:10pt;background:white;padding-bottom:0px;color:black;line-height:1em;font-family:consolas;"&gt; &lt;p style="margin:0px;padding-bottom:0px;"&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:#2b91af;"&gt;Size&lt;/span&gt; ArrangeOverride( &lt;span style="color:#2b91af;"&gt;Size&lt;/span&gt; finalSize )&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;{&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; ( adorningElement != &lt;span style="color:blue;"&gt;null&lt;/span&gt; )&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;Point&lt;/span&gt; adorningPoint = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Point&lt;/span&gt;();&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;int&lt;/span&gt; pos = (&lt;span style="color:blue;"&gt;int&lt;/span&gt;) position - 1;&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;Rect&lt;/span&gt; adorneredElementRect = &lt;span style="color:#2b91af;"&gt;VisualTreeHelper&lt;/span&gt;.GetContentBounds( AdornedElement );&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;Rect&lt;/span&gt; adorningElementRect = &lt;span style="color:#2b91af;"&gt;VisualTreeHelper&lt;/span&gt;.GetContentBounds( adorningElement );&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; adorningPoint.X = ( ( ( pos % 3 ) / 2d ) * adorneredElementRect.Width )&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; - ( ( ( pos % 3 ) / 2d ) * adorningElementRect.Width );&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; adorningPoint.Y = ( ( ( pos / 3 ) / 2d ) * adorneredElementRect.Height )&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; - ( ( ( pos / 3 ) / 2d ) * adorningElementRect.Height );&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; ( placement == &lt;span style="color:#2b91af;"&gt;AdornerPlacement&lt;/span&gt;.OutHorizontally )&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;switch&lt;/span&gt; ( pos % 3 )&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;default&lt;/span&gt; :&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;case&lt;/span&gt; 1 :&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:green;"&gt;//center column do nothing&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;break&lt;/span&gt;;&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;case&lt;/span&gt; 0 :&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; adorningPoint.X -= adorningElementRect.Width;&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;break&lt;/span&gt;;&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;case&lt;/span&gt; 2 :&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; adorningPoint.X += adorningElementRect.Width;&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;break&lt;/span&gt;;&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;else&lt;/span&gt; &lt;span style="color:blue;"&gt;if&lt;/span&gt; ( placement == &lt;span style="color:#2b91af;"&gt;AdornerPlacement&lt;/span&gt;.OutVertically )&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;switch&lt;/span&gt; ( pos / 3 )&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;default&lt;/span&gt; :&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;case&lt;/span&gt; 1 :&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:green;"&gt;//center row do nothing&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;break&lt;/span&gt;;&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;case&lt;/span&gt; 0 :&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; adorningPoint.Y -= adorningElementRect.Height;&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;break&lt;/span&gt;;&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;case&lt;/span&gt; 2 :&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; adorningPoint.Y += adorningElementRect.Height;&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;break&lt;/span&gt;;&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; adorningElement.Arrange( &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Rect&lt;/span&gt;( adorningPoint, adorningElement.DesiredSize ) );&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; finalSize;&lt;/p&gt; &lt;p style="margin:0px;padding-bottom:0px;"&gt;}&lt;/p&gt; &lt;/div&gt; &lt;p&gt;That's it. You can now adorn your elements passing different positions and placements. Sample project can be downloaded from &lt;a rel="nofollow" target="_blank" href="http://blogs.telerik.com/Photos/Storage/sdobrev/Posts/20080522/GenericAdorner.zip"&gt;here&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Have fun adorning your elements.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ligaz/~4/Cb62v6S9XU8" height="1" width="1"/&gt;</description>
         <author>Stefan Dobrev</author>
         <guid isPermaLink="false">2f3ea819-5eb8-4a11-b992-a85d8877f7c5</guid>
         <pubDate>Thu, 22 May 2008 03:35:56 -0700</pubDate>
      <feedburner:origLink>http://blogs.telerik.com/StefanDobrev/Posts/08-05-22/wpf_series_creating_generic_adorner.aspx</feedburner:origLink></item>
      <item>
         <title>WPF Series: Adorners, Commands and Logical Tree</title>
         <link>http://feedproxy.google.com/~r/ligaz/~3/GoZ_rwgQitA/wpf_series_adorners_commands_and_logical_tree.aspx</link>
         <description>&lt;p&gt;Today I'm going to tell you a WPF story. But before I start to dig deeper let me first introduce you the main characters in this post. Here they are:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Adorner - &lt;a rel="nofollow" target="_blank" href="http://msdn2.microsoft.com/en-us/library/ms743737.aspx"&gt;adorners&lt;/a&gt; are simple &lt;em&gt;UIElement&lt;/em&gt; decorators. Suppose that you have a &lt;em&gt;RichTextBox&lt;/em&gt; and you want to place a comment box over it, so that users can comment on the text in the box. This can be archived with adorners. Actually the WPF framework uses adorners internally for exactly the same purpose when you edit and annotate &lt;em&gt;FlowDocument&lt;/em&gt; in a &lt;em&gt;DocumentViewer&lt;/em&gt;. This is the reason why adorners are in &lt;strong&gt;System.Windows.Documents &lt;/strong&gt;namespace. &lt;/li&gt; &lt;li&gt;Command - &lt;a rel="nofollow" target="_blank" href="http://blogs.vertigo.com/personal/alanl/Blog/Lists/Posts/Post.aspx?ID=17"&gt;commands&lt;/a&gt; are UI flavored implementation of the &lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Command_pattern"&gt;command pattern&lt;/a&gt; in WPF. You can read about them &lt;a rel="nofollow" target="_blank" href="http://www.informit.com/articles/article.aspx?p=688529&amp;amp;seqNum=4"&gt;here&lt;/a&gt;. &lt;/li&gt; &lt;li&gt;Logical Tree - &lt;a rel="nofollow" target="_blank" href="http://blogs.telerik.com/Photos/Storage/sdobrev/Posts/20080416/Button.png"&gt;&lt;img width="244" height="113" border="0" align="right" src="http://blogs.telerik.com/Photos/Storage/sdobrev/Posts/20080416/Button.png" alt="Button" style="border-width:0px;"/&gt;&lt;/a&gt;There are two control trees in WPF. One is the visual one, the other is the logical one. Imagine a Button for example. The button as logical entity act as a single control, you can click on it etc. However the visual representation of the button contains different &lt;em&gt;UIElement&lt;/em&gt;s - borders, &lt;em&gt;TextBlock&lt;/em&gt;, etc. This means that WPF should maintain two separate control trees, one for the behavior elements - logical tree and one for the visual representation - visual tree. More info &lt;a rel="nofollow" target="_blank" href="http://www.informit.com/articles/article.aspx?p=688529&amp;amp;seqNum=1"&gt;here&lt;/a&gt;. &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;There are a bunch of WPF &lt;a rel="nofollow" target="_blank" href="http://www.codeproject.com/KB/WPF/ImageCropper.aspx"&gt;adorners&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://dvuyka.spaces.live.com/Blog/cns!305B02907E9BE19A!124.entry"&gt;samples&lt;/a&gt; out there (including the &lt;a rel="nofollow" target="_blank" href="http://msdn2.microsoft.com/en-us/library/ms771627(VS.85).aspx"&gt;SDK&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://msdn2.microsoft.com/en-us/library/ms771714.aspx"&gt;ones&lt;/a&gt; as &lt;a rel="nofollow" target="_blank" href="http://msdn2.microsoft.com/en-us/library/ms771344.aspx"&gt;well&lt;/a&gt;). But as usual when you try to create something more complex the standard samples break down. For example let say that we want to achieve something like the mini toolbar in Word 2007:&lt;/p&gt; &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://blogs.telerik.com/Photos/Storage/sdobrev/Posts/20080416/WordMiniToolbar.png"&gt;&lt;img width="244" height="91" border="0" src="http://blogs.telerik.com/Photos/Storage/sdobrev/Posts/20080416/WordMiniToolbar.png" alt="WordMiniToolbar" style="border-width:0px;"/&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Let's start our quest with a &lt;em&gt;TextBox&lt;/em&gt; that look like this:&lt;/p&gt; &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://blogs.telerik.com/Photos/Storage/sdobrev/Posts/20080416/FunkyTextBox.png"&gt;&lt;img width="235" height="98" border="0" src="http://blogs.telerik.com/Photos/Storage/sdobrev/Posts/20080416/FunkyTextBox.png" alt="FunkyTextBox" style="border-width:0px;"/&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;and you want to put a simple button next to it that will let say will open a hyperlink that is somehow related to the &lt;em&gt;TextBox&lt;/em&gt;. You could easily achieve this with adorners and end up with something which look like this:&lt;/p&gt; &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://blogs.telerik.com/Photos/Storage/sdobrev/Posts/20080416/FunkyTextBoxWithLink.png"&gt;&lt;img width="240" height="119" border="0" src="http://blogs.telerik.com/Photos/Storage/sdobrev/Posts/20080416/FunkyTextBoxWithLink.png" alt="FunkyTextBoxWithLink" style="border-width:0px;"/&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;How to do this? You could create something like &lt;em&gt;TextBoxAdorner&lt;/em&gt; that will derive from &lt;em&gt;Adorner&lt;/em&gt; and will look like this:&lt;/p&gt; &lt;div style="background:white none repeat scroll 0% 50%;font-size:10pt;color:black;font-family:consolas;"&gt; &lt;p style="margin:0px;"&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;TextBoxAdorner&lt;/span&gt; : &lt;span style="color:rgb(43, 145, 175);"&gt;Adorner&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;{&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;readonly&lt;/span&gt; &lt;span style="color:rgb(43, 145, 175);"&gt;UIElement&lt;/span&gt; adorningElement;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; TextBoxAdorner(&lt;span style="color:rgb(43, 145, 175);"&gt;TextBox&lt;/span&gt; textBox, &lt;span style="color:rgb(43, 145, 175);"&gt;UIElement&lt;/span&gt; adorningElement ) : &lt;span style="color:blue;"&gt;base&lt;/span&gt;( textBox )&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;this&lt;/span&gt;.adorningElement = adorningElement;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (adorningElement != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AddVisualChild(adorningElement);&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;protected&lt;/span&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt; VisualChildrenCount&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;get&lt;/span&gt; { &lt;span style="color:blue;"&gt;return&lt;/span&gt; adorningElement == &lt;span style="color:blue;"&gt;null&lt;/span&gt; ? 0 : 1; }&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &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;Size&lt;/span&gt; ArrangeOverride(&lt;span style="color:rgb(43, 145, 175);"&gt;Size&lt;/span&gt; finalSize)&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (adorningElement != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin:0px;"&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 style="color:rgb(43, 145, 175);"&gt;Point&lt;/span&gt; adorningPoint = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:rgb(43, 145, 175);"&gt;Point&lt;/span&gt;();&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin:0px;"&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 style="color:green;"&gt;//position at the end of the text box&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; adorningPoint.X = ((&lt;span style="color:rgb(43, 145, 175);"&gt;TextBox&lt;/span&gt;)AdornedElement).ActualWidth;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin:0px;"&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 style="color:green;"&gt;//position above the text box&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; adorningPoint.Y -= adorningElement.DesiredSize.Height;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; adorningElement.Arrange( &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:rgb(43, 145, 175);"&gt;Rect&lt;/span&gt;( adorningPoint, adorningElement.DesiredSize ) );&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;return&lt;/span&gt; finalSize;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &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;Visual&lt;/span&gt; GetVisualChild(&lt;span style="color:blue;"&gt;int&lt;/span&gt; index)&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (index == 0 &amp;amp;&amp;amp; adorningElement != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin:0px;"&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 style="color:blue;"&gt;return&lt;/span&gt; adorningElement;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;base&lt;/span&gt;.GetVisualChild(index);&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin:0px;"&gt;}&lt;/p&gt; &lt;/div&gt; &lt;p&gt;Note that we call &lt;em&gt;AddVisualChild() &lt;/em&gt;method so that the element that is passed to the constructor will be visible. It is also necessary &lt;em&gt;VisualChildrenCount&lt;/em&gt; to return count of 1 and &lt;em&gt;GetVisualChild()&lt;/em&gt; to return the &lt;em&gt;UIElement &lt;/em&gt;that is added to the visual tree - in our case this is the &lt;em&gt;adorningElement&lt;/em&gt;. &lt;/p&gt; &lt;p&gt;So far so good. Now imagine that the button that is added as adorner did not have a click handler, but have a command set. Let's name the command - "NavigateToLink". The command handler is added to &lt;em&gt;TextBox&lt;/em&gt;'s input bindings, because the &lt;em&gt;TextBox&lt;/em&gt; itself "knows" how to execute "NavigateToLink" command. (The sample is with &lt;em&gt;TextBox&lt;/em&gt;, but you could imagine have your own custom control that have that logic in it). But what happens when we do this:&lt;/p&gt; &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://blogs.telerik.com/Photos/Storage/sdobrev/Posts/20080416/FunkyTextBoxWithLinkDisabled.png"&gt;&lt;img width="240" height="119" border="0" src="http://blogs.telerik.com/Photos/Storage/sdobrev/Posts/20080416/FunkyTextBoxWithLinkDisabled.png" alt="FunkyTextBoxWithLinkDsiabled" style="border-width:0px;"/&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;As you can see the button is disabled, because the command infrastructure in WPF did not manage to find a handler for our "NavigateToLink" command. This causes the &lt;em&gt;Button &lt;/em&gt;to become disabled. Now what? &lt;/p&gt; &lt;p&gt;If you refer to the command readings in the links that were in the beginning of the post you will find our that the command mechanism in WPF uses the logical tree of controls to find handlers for particular commands. This bring us to point where we added the &lt;em&gt;Button &lt;/em&gt;to visual tree. In our case we will have to add it as a logical child of the &lt;em&gt;TextBox &lt;/em&gt;as well. This will automatically add it the logical tree of controls and the command handler will be correctly resolved and the &lt;em&gt;Button&lt;/em&gt; enabled. Here is the new constructor of &lt;em&gt;TextBoxAdorner&lt;/em&gt; class:&lt;/p&gt; &lt;div style="background:white none repeat scroll 0% 50%;font-size:10pt;color:black;font-family:consolas;"&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; TextBoxAdorner(&lt;span style="color:rgb(43, 145, 175);"&gt;TextBox&lt;/span&gt; textBox, &lt;span style="color:rgb(43, 145, 175);"&gt;UIElement&lt;/span&gt; adorningElement ) : &lt;span style="color:blue;"&gt;base&lt;/span&gt;( textBox )&lt;/p&gt; &lt;p style="margin:0px;"&gt;{&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;this&lt;/span&gt;.adorningElement = adorningElement;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (adorningElement != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AddVisualChild(adorningElement);&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; textBox.AddLogicalChild( adorningElement );&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin:0px;"&gt;}&lt;/p&gt; &lt;/div&gt; &lt;p&gt;Here comes the other problem. For encapsulation reasons the &lt;em&gt;AddLogicalChild()&lt;/em&gt; method of &lt;em&gt;FrameworkElement&lt;/em&gt; is marked as &lt;strong&gt;protected internal&lt;/strong&gt; and can not be called as we call it in the snippet above. One way to workaround this is to derive from &lt;em&gt;TextBox&lt;/em&gt; and make the method internal for your assembly. The other way is to use reflection and call the method. You can even create an extension method that will be available for all &lt;em&gt;FrameworkElement&lt;/em&gt;s. To make it even more extreme you can use expression trees to cache the method call and optimize the reflection. Here is the code:&lt;/p&gt; &lt;div style="background:white none repeat scroll 0% 50%;font-size:10pt;color:black;font-family:consolas;"&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;internal&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:rgb(43, 145, 175);"&gt;FrameworkElementExtensions&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;{&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;readonly&lt;/span&gt; &lt;span style="color:rgb(43, 145, 175);"&gt;Action&lt;/span&gt;&amp;lt;&lt;span style="color:rgb(43, 145, 175);"&gt;FrameworkElement&lt;/span&gt;, &lt;span style="color:blue;"&gt;object&lt;/span&gt;&amp;gt; AddLogicalChildMethod = CreateAddLogicalChildMethod();&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:rgb(43, 145, 175);"&gt;Action&lt;/span&gt;&amp;lt;&lt;span style="color:rgb(43, 145, 175);"&gt;FrameworkElement&lt;/span&gt;, &lt;span style="color:blue;"&gt;object&lt;/span&gt;&amp;gt; CreateAddLogicalChildMethod()&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:rgb(43, 145, 175);"&gt;ParameterExpression&lt;/span&gt; instance = &lt;span style="color:rgb(43, 145, 175);"&gt;Expression&lt;/span&gt;.Parameter( &lt;span style="color:blue;"&gt;typeof&lt;/span&gt; ( &lt;span style="color:rgb(43, 145, 175);"&gt;FrameworkElement&lt;/span&gt; ), &lt;span style="color:rgb(163, 21, 21);"&gt;"element"&lt;/span&gt; );&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:rgb(43, 145, 175);"&gt;ParameterExpression&lt;/span&gt; parameter = &lt;span style="color:rgb(43, 145, 175);"&gt;Expression&lt;/span&gt;.Parameter( &lt;span style="color:blue;"&gt;typeof&lt;/span&gt; ( &lt;span style="color:blue;"&gt;object&lt;/span&gt; ), &lt;span style="color:rgb(163, 21, 21);"&gt;"child"&lt;/span&gt; );&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:rgb(43, 145, 175);"&gt;MethodInfo&lt;/span&gt; methodInfo = &lt;span style="color:blue;"&gt;typeof&lt;/span&gt; ( &lt;span style="color:rgb(43, 145, 175);"&gt;FrameworkElement&lt;/span&gt; ).GetMethod(&lt;/p&gt; &lt;p style="margin:0px;"&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 style="color:rgb(163, 21, 21);"&gt;"AddLogicalChild"&lt;/span&gt;, &lt;span style="color:rgb(43, 145, 175);"&gt;BindingFlags&lt;/span&gt;.NonPublic | &lt;span style="color:rgb(43, 145, 175);"&gt;BindingFlags&lt;/span&gt;.Instance );&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:rgb(43, 145, 175);"&gt;MethodCallExpression&lt;/span&gt; method = &lt;span style="color:rgb(43, 145, 175);"&gt;Expression&lt;/span&gt;.Call( instance, methodInfo, parameter );&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:rgb(43, 145, 175);"&gt;Expression&lt;/span&gt;&amp;lt;&lt;span style="color:rgb(43, 145, 175);"&gt;Action&lt;/span&gt;&amp;lt;&lt;span style="color:rgb(43, 145, 175);"&gt;FrameworkElement&lt;/span&gt;, &lt;span style="color:blue;"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; lambda =&lt;/p&gt; &lt;p style="margin:0px;"&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 style="color:rgb(43, 145, 175);"&gt;Expression&lt;/span&gt;.Lambda&amp;lt;&lt;span style="color:rgb(43, 145, 175);"&gt;Action&lt;/span&gt;&amp;lt;&lt;span style="color:rgb(43, 145, 175);"&gt;FrameworkElement&lt;/span&gt;, &lt;span style="color:blue;"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;( method, instance, parameter );&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;return&lt;/span&gt; lambda.Compile();&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;internal&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; AddLogicalChild( &lt;span style="color:blue;"&gt;this&lt;/span&gt; &lt;span style="color:rgb(43, 145, 175);"&gt;FrameworkElement&lt;/span&gt; element, &lt;span style="color:blue;"&gt;object&lt;/span&gt; child )&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AddLogicalChildMethod( element, child );&lt;/p&gt; &lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p style="margin:0px;"&gt;}&lt;/p&gt; &lt;/div&gt; &lt;p&gt;You can find a sample solution &lt;a rel="nofollow" target="_blank" href="http://blogs.telerik.com/Photos/Storage/sdobrev/Posts/20080416/AdornerCommands.zip"&gt;here&lt;/a&gt;. Go play with it. &lt;/p&gt; &lt;p&gt;That its all for now folks. Next time I will show you how to create a generic adorner that can be used to decorate elements multiple times at different positions.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ligaz/~4/GoZ_rwgQitA" height="1" width="1"/&gt;</description>
         <author>Stefan Dobrev</author>
         <guid isPermaLink="false">fb2f510f-a14a-4345-bc4c-997434fb4d07</guid>
         <pubDate>Tue, 15 Apr 2008 23:04:40 -0700</pubDate>
      <feedburner:origLink>http://blogs.telerik.com/StefanDobrev/Posts/08-04-16/wpf_series_adorners_commands_and_logical_tree.aspx</feedburner:origLink></item>
   </channel>
</rss><!-- fe2.pipes.re3.yahoo.com uncompressed Mon Jul  6 17:33:30 PDT 2009 -->
