<?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:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Ryan Cromwell</title><link>http://cromwellhaus.com/blogs/ryanc/default.aspx</link><description>Aimless musings of a keyboard masher.</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><geo:lat>39.557096</geo:lat><geo:long>-84.22688</geo:long><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/RyanCromwell" type="application/rss+xml" /><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site, subject to copyright and fair use.</feedburner:browserFriendly><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item><title>Property Undo/Redo Support</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/PNnm10Ryeg8/property-undo-redo-support.aspx</link><pubDate>Sat, 04 Jul 2009 19:06:03 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:1513</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=1513</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=1513</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2009/07/04/property-undo-redo-support.aspx#comments</comments><description>&lt;p&gt;Undo/Redo support is one of those golden features that really differentiate a client app from many web apps.&amp;#160; There have been a number of methods/techniques to provide this support that I’ve run across from brute force, to the &lt;a href="http://www.codeproject.com/KB/cs/generic_undo_redo.aspx" target="_blank"&gt;memento pattern&lt;/a&gt;, but none that lit any fire for me.&lt;/p&gt;  &lt;p&gt;Here’s my answer to the problem using Anonymous methods and my first real attempt at creating (versus using) a Fluent Api.&lt;/p&gt;  &lt;p&gt;The most common scenario for Undo/Redu support is form completion.&amp;#160; In your Domain or View Model this is often tied to Two Way bound properties.&amp;#160; Take the simple Person class:&lt;/p&gt;  &lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;   &lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;     &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; Person&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;{&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Name { get; set; }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; DateTime BirthDate { get; set; }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;}&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;The question is how to provide undo/redo support for a form (WPF often in my case) bound to a Person.&amp;#160; First, I create a ViewModel or Presenter for the Person class:&lt;/p&gt;

&lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;
  &lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;
    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; PersonViewModel : ViewModelBase&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;{&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;readonly&lt;/span&gt; Person _person;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; PersonViewModel(Person person)&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        _person = person;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Name&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        get { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; _person.Name; }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        set&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            _person.Name = &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            OnPropertyChanged(&lt;span style="color:#006080;"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; DateTime BirthDate&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        get { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; _person.BirthDate; }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        set&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            _person.BirthDate = &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            OnPropertyChanged(&lt;span style="color:#006080;"&gt;&amp;quot;BirthDate&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            OnPropertyChanged(&lt;span style="color:#006080;"&gt;&amp;quot;Age&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; Age&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        get&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            var now = DateTime.Now;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            var age = now.Year - _person.BirthDate.Year;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (now &amp;lt; _person.BirthDate.AddYears(age))&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                age--;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; age;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;}&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Notice that we have a calculated property Age based on the BirthDate.&amp;#160; Any time we change BirthDate we want to make sure to notify that the Age is also changed, obviously.&amp;#160; &lt;/p&gt;

&lt;p&gt;Here is the Fluent way to register Undo/Redo support for our PersonViewModel.Name property:&lt;/p&gt;

&lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;
  &lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;
    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Name&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;     get { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; _person.Name; }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;     set&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt;         var oldName = _person.Name;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt;         _undoRedoManager&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   9:&lt;/span&gt;             .WithUndo(() =&amp;gt; _person.Name = oldName)&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  10:&lt;/span&gt;             .RepeatAfterBoth(() =&amp;gt; OnPropertyChanged(&lt;span style="color:#006080;"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;))&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  11:&lt;/span&gt;             .Do(() =&amp;gt; _person.Name = &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  12:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  13:&lt;/span&gt; }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Cool, but what is that doing?&amp;#160; Well, it’s pretty simply.&amp;#160; We are simply maintaining two queues; An Undo and a Redo queue.&amp;#160; Here is the longer syntax, without the Fluent helper Api that makes that a little clearer:&lt;/p&gt;

&lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;
  &lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;
    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Name&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;{&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    get { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; _person.Name; }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    set&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        var oldName = _person.Name;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        _undoRedoManager.Push(() =&amp;gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                                  {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                                      _person.Name = oldName;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                                      OnPropertyChanged(&lt;span style="color:#006080;"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                                  },&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                                  () =&amp;gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                                  {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                                      _person.Name = &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                                      OnPropertyChanged(&lt;span style="color:#006080;"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                                  });&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;}&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;
  &lt;p&gt;&lt;/p&gt;

  &lt;p&gt;&lt;/p&gt;

  &lt;p&gt;&lt;/p&gt;

  &lt;p&gt;This may not seem like much more, but if your Repeat part is more than one line, it gets a bit fragile.&amp;#160; Being able to specify the “After” stuff once is important.&lt;/p&gt;

  &lt;p&gt;From here you can use the IUndoRedoManager.CanUndo(), IUndoRedoManager.CanRedo(), IUndoRedoManager.Redo() methods to go back and forth.&amp;#160; Hook this up to your favorite ICommand implementation and you have most of what you might need. &lt;/p&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;p&gt;&lt;a href="http://code.cromwellhaus.com/cromwell.undoredo.zip" target="_blank"&gt;Here is the full project&lt;/a&gt; with a WPF Sample and a VB sample.&amp;#160; The VB version is a little ugly since it doesn’t support anonymous methods without a return, but it works.&lt;/p&gt;

  &lt;p&gt;If you have suggestions (on the Fluent Api especially) let me know.&amp;#160; I’d really like to hear them.&lt;/p&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=1513" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RyanCromwell?a=PNnm10Ryeg8:g8dxtHL8kZI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RyanCromwell?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RyanCromwell?a=PNnm10Ryeg8:g8dxtHL8kZI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RyanCromwell?i=PNnm10Ryeg8:g8dxtHL8kZI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RyanCromwell?a=PNnm10Ryeg8:g8dxtHL8kZI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RyanCromwell?i=PNnm10Ryeg8:g8dxtHL8kZI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/PNnm10Ryeg8" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/.Net/default.aspx">.Net</category><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/WPF/default.aspx">WPF</category><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Code/default.aspx">Code</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2009/07/04/property-undo-redo-support.aspx</feedburner:origLink></item><item><title>Cin-Day Nerd Dinner Reminder</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/_qcKI8ATzhI/cin-day-nerd-dinner-reminder.aspx</link><pubDate>Thu, 02 Apr 2009 01:50:27 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:894</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=894</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=894</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2009/04/01/cin-day-nerd-dinner-reminder.aspx#comments</comments><description>&lt;p&gt;This is just a quick reminder that tomorrow (April 2nd) we will be having our first &lt;a href="http://tinyurl.com/cinday" target="_blank"&gt;Cin-Day Nerd Dinner&lt;/a&gt;.&amp;#160; If you are planning on coming, but haven’t RSVP’ed please do so &lt;a href="http://tinyurl.com/cinday" target="_blank"&gt;here&lt;/a&gt; so that I can warn &lt;a href="http://deweyspizza.com/cincinnati/westchester" target="_blank"&gt;Dewey’s Pizza in West Chester&lt;/a&gt; of the raucous crowd to be expected.&amp;#160; Can’t wait to see everyone.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=894" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RyanCromwell?a=_qcKI8ATzhI:Ur_J5cUz43g:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RyanCromwell?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RyanCromwell?a=_qcKI8ATzhI:Ur_J5cUz43g:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RyanCromwell?i=_qcKI8ATzhI:Ur_J5cUz43g:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RyanCromwell?a=_qcKI8ATzhI:Ur_J5cUz43g:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RyanCromwell?i=_qcKI8ATzhI:Ur_J5cUz43g:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/_qcKI8ATzhI" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Nerd+Dinner/default.aspx">Nerd Dinner</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2009/04/01/cin-day-nerd-dinner-reminder.aspx</feedburner:origLink></item><item><title>Action(Of T) Lambdas in VB</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/J-4NVD3iC1k/action-of-t-lambdas-in-vb.aspx</link><pubDate>Mon, 30 Mar 2009 17:49:03 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:892</guid><dc:creator>cromwellryan</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=892</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=892</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2009/03/30/action-of-t-lambdas-in-vb.aspx#comments</comments><description>&lt;p&gt;Until VB catches up with C# in the lambda support realm, here is how you can accomplish those &lt;a href="http://code.google.com/p/moq/" target="_blank"&gt;Moq&lt;/a&gt; or &lt;a href="http://ayende.com/projects/rhino-mocks.aspx" target="_blank"&gt;Rhino.Mocks&lt;/a&gt; style verifications in VB:&lt;/p&gt;  &lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;width:640px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;dim&lt;/span&gt; someSub &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; Action(&lt;span style="color:#0000ff;"&gt;Of&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;double&lt;/span&gt;) = &lt;span style="color:#0000ff;"&gt;AddressOf&lt;/span&gt; mockObject.SomeSub
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;Rhino.Mocks.Expect.&lt;span style="color:#0000ff;"&gt;Call&lt;/span&gt;( someSub)
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;It’s very frustrating going from the full support in C# to VB, but I’m finding sufficient workaround for most items.&amp;#160; I shouldn’t be so hard on VB.&amp;#160; C# doesn’t support inline of Xml which is pretty friggin’ sweet.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=892" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RyanCromwell?a=J-4NVD3iC1k:ZB-MQWE7xhI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RyanCromwell?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RyanCromwell?a=J-4NVD3iC1k:ZB-MQWE7xhI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RyanCromwell?i=J-4NVD3iC1k:ZB-MQWE7xhI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RyanCromwell?a=J-4NVD3iC1k:ZB-MQWE7xhI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RyanCromwell?i=J-4NVD3iC1k:ZB-MQWE7xhI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/J-4NVD3iC1k" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Languages/default.aspx">Languages</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2009/03/30/action-of-t-lambdas-in-vb.aspx</feedburner:origLink></item><item><title>Outlook 2007 Huge Performance Improvement</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/RIu_KLHmDu4/outlook-2007-huge-performance-improvement.aspx</link><pubDate>Thu, 26 Mar 2009 17:32:44 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:887</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=887</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=887</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2009/03/26/outlook-2007-huge-performance-improvement.aspx#comments</comments><description>&lt;p&gt;If you use Outlook 2007 go get &lt;a href="http://msexchangeteam.com/archive/2009/03/24/450881.aspx" target="_blank"&gt;this hotfix&lt;/a&gt; (&lt;a href="http://support.microsoft.com/hotfix/KBHotfix.aspx?kbnum=961752&amp;amp;kbln=en-us" target="_blank"&gt;download here&lt;/a&gt;) now.&amp;#160; It’s crazy faster after this update.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Hurry!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=887" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RyanCromwell?a=RIu_KLHmDu4:RofVty5vCWk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RyanCromwell?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RyanCromwell?a=RIu_KLHmDu4:RofVty5vCWk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RyanCromwell?i=RIu_KLHmDu4:RofVty5vCWk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RyanCromwell?a=RIu_KLHmDu4:RofVty5vCWk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RyanCromwell?i=RIu_KLHmDu4:RofVty5vCWk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/RIu_KLHmDu4" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Software+Reviews/default.aspx">Software Reviews</category><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Performance/default.aspx">Performance</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2009/03/26/outlook-2007-huge-performance-improvement.aspx</feedburner:origLink></item><item><title>Cin-Day Nerd Dinner</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/d1aznKcQSw0/cin-day-nerd-dinner.aspx</link><pubDate>Sun, 15 Mar 2009 03:00:37 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:880</guid><dc:creator>cromwellryan</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=880</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=880</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2009/03/15/cin-day-nerd-dinner.aspx#comments</comments><description>&lt;p&gt;I’m jumping on the bandwagon and you’re all invited to follow.&amp;nbsp; I’ve scheduled a &lt;a href="http://tinyurl.com/cinday" target="_blank"&gt;Nerd Dinner&lt;/a&gt; at &lt;a href="http://www.deweyspizza.com/" target="_blank"&gt;Dewey’s Pizza&lt;/a&gt; in West Chester on April 2nd.&amp;nbsp; It’s just off the Tylersville exit on I75.&amp;nbsp; &lt;/p&gt; &lt;p&gt;I’ll have both the Dayton and Cincinnati User Groups announce the event at their upcoming meetings.&amp;nbsp; Please try to &lt;a href="http://tinyurl.com/cinday" target="_blank"&gt;RSVP&lt;/a&gt; so I can warn Dewey’s of the wild crowd.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=880" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RyanCromwell?a=d1aznKcQSw0:vNBb6PBjmy0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RyanCromwell?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RyanCromwell?a=d1aznKcQSw0:vNBb6PBjmy0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RyanCromwell?i=d1aznKcQSw0:vNBb6PBjmy0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RyanCromwell?a=d1aznKcQSw0:vNBb6PBjmy0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RyanCromwell?i=d1aznKcQSw0:vNBb6PBjmy0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/d1aznKcQSw0" height="1" width="1"/&gt;</description><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2009/03/15/cin-day-nerd-dinner.aspx</feedburner:origLink></item><item><title>Scaling ItemsControl Items for Explicit Visible Items in WPF</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/HJY9_ZtGMz0/scaling-itemscontrol-items-for-explicit-visible-items-in-wpf.aspx</link><pubDate>Thu, 12 Mar 2009 13:05:04 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:876</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=876</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=876</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2009/03/12/scaling-itemscontrol-items-for-explicit-visible-items-in-wpf.aspx#comments</comments><description>&lt;p&gt;Another part of the overall solution we were trying to come up with in conjunction my previous post on &lt;a href="http://cromwellhaus.com/blogs/ryanc/archive/2009/03/12/scrolling-multiple-content-areas-with-a-single-scrollbar-in-wpf.aspx"&gt;Scrolling Multiple Content Areas&lt;/a&gt;, we also needed to come up with a way to only show X number of items in the visible region of an ItemsControl wrapped in a ScrollViewer.&amp;#160; This was more tricky than I had initially anticipated, but the solution seems to work for us and its got relatively few moving parts.&amp;#160; &lt;/p&gt;  &lt;p&gt;The end result of the concept can be visualize in &lt;a href="http://code.cromwellhaus.com/ShowingOnlyXVisibleItemsInItemsControl/ShowingOnlyXVisibleItemsInItemsControl.xbap" target="_blank"&gt;this Xbap example&lt;/a&gt;.&amp;#160; By moving the slider at the bottom, you effectively change the width of the ItemsControl containing the colored Ellipses.&amp;#160; In order to do this as a reflection of the number of items contained within, you need another &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.data.imultivalueconverter.aspx" target="_blank"&gt;IMultiValueConverter&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Here is the meat of the code for the RelativeSizeConverter I came up with:&lt;/p&gt;  &lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;width:640px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; RelativeSizeConverter : IMultiValueConverter
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;{
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; Convert(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;[] values, Type targetType, &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; parameter, CultureInfo culture)
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    {
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;( values.Length != 3 )
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;            &lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; InvalidOperationException(&amp;quot;&lt;span style="color:#8b0000;"&gt;Don&amp;#39;t do that!&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        &lt;span style="color:#0000ff;"&gt;double&lt;/span&gt; containerSize = System.Convert.ToDouble(values[0]);
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; totalItems = System.Convert.ToInt32(values[1]);
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; visibleItems = System.Convert.ToInt32(values[2]);
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        var visibleSubgroupSize = containerSize / visibleItems;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; totalItems * visibleSubgroupSize;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    }
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;}
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;Basically we figure out how wide things would be if we only had the visible items and then we apply that to all the items return.&amp;#160; In order for this to work, there cannot be any sizing between the ItemsControl and the ScrollViewer, but its a small price to pay.&amp;#160; That would look odd any way in my opinion, but maybe I am simply justifying the solution!&lt;/p&gt;

&lt;p&gt;Anyways, putting this RelativeSizeConverter to use, we get:&lt;/p&gt;

&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;width:640px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;ScrollViewer&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;x&lt;/span&gt;:&lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;container&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;HorizontalScrollBarVisibility&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;Auto&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;VerticalScrollBarVisibility&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;Auto&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;ItemsControl&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;x&lt;/span&gt;:&lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;itemsToScale&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;ItemsControl.Width&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;MultiBinding&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Converter&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;{StaticResource sizeConverter}&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Binding&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;ElementName&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;container&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Path&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;ActualWidth&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Binding&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;ElementName&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;itemsToScale&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Path&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;Items.Count&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Binding&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;ElementName&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;scaleSize&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Path&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;Value&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;MultiBinding&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;ItemsControl.Width&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;ItemsControl&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;ScrollViewer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Slider&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;x&lt;/span&gt;:&lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;scaleSize&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Width&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;100&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;HorizontalAlignment&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;Center&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        &lt;span style="color:#ff0000;"&gt;Minimum&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;2&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Maximum&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;{Binding ElementName=itemsToScale, Path=Items.Count}&amp;quot;&lt;/span&gt; 
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        &lt;span style="color:#ff0000;"&gt;Value&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;{Binding ElementName=itemsToScale, Path=Items.Count, Mode=OneWay}&amp;quot;&lt;/span&gt; 
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        &lt;span style="color:#ff0000;"&gt;IsSnapToTickEnabled&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;True&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;TickFrequency&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;1&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;Notice we use the ScrollViewer’s ActualWidth as our “containerSize”.&amp;#160; The ItemsControl itself has the “totalItems” count, and finally we are using a Slider with the name “scaleSize” to adjust the “visibleItems” count.&lt;/p&gt;

&lt;p&gt;Code for the &lt;a href="http://code.cromwellhaus.com/ShowingOnlyXVisibleItemsInItemsControl/ShowingOnlyXVisibleItemsInItemsControl.xbap" target="_blank"&gt;Xbap sample&lt;/a&gt; at the top can be downloaded &lt;a href="http://code.cromwellhaus.com/ShowingOnlyXVisibleItemsInItemsControl/ShowingOnlyXVisibleItemsInItemsControl.zip"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=876" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RyanCromwell?a=HJY9_ZtGMz0:07WhWeyUF40:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RyanCromwell?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RyanCromwell?a=HJY9_ZtGMz0:07WhWeyUF40:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RyanCromwell?i=HJY9_ZtGMz0:07WhWeyUF40:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RyanCromwell?a=HJY9_ZtGMz0:07WhWeyUF40:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RyanCromwell?i=HJY9_ZtGMz0:07WhWeyUF40:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/HJY9_ZtGMz0" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/WPF/default.aspx">WPF</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2009/03/12/scaling-itemscontrol-items-for-explicit-visible-items-in-wpf.aspx</feedburner:origLink></item><item><title>Scrolling Multiple Content Areas with a single ScrollBar in WPF</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/_jSHoS5UW_4/scrolling-multiple-content-areas-with-a-single-scrollbar-in-wpf.aspx</link><pubDate>Thu, 12 Mar 2009 04:21:26 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:875</guid><dc:creator>cromwellryan</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=875</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=875</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2009/03/12/scrolling-multiple-content-areas-with-a-single-scrollbar-in-wpf.aspx#comments</comments><description>&lt;p&gt;I struggled to solve a UI dilemma while at my current client.&amp;#160; For various reasons, we came across a situation in which we needed to scroll two areas of the view based on a single Scrollbar.&amp;#160; You can see what we were attempting and finally achieved &lt;a href="http://code.cromwellhaus.com/ScrollingMultipleAreasWithOneScrollbar/ScrollingMultipleAreasWithOneScrollbar.xbap" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;The end result is smooth, yet not quite intuitive so I thought I would share the results and steps taken.&amp;#160; The idea is to use a surrogate &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.scrollviewer.aspx"&gt;ScrollViewer&lt;/a&gt; as the source for the offset of a &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.translatetransform.aspx"&gt;TranslateTransform&lt;/a&gt; being applied to content within a seperate &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.scrollviewer.aspx"&gt;ScrollViewer&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Unfortunately, the offset values exposed by the ScrollViewer are both readonly and opposite in force to which we would need to apply to the surrogate.&amp;#160; That is, if we scroll 20 units to the right on our ScrollViewer, we would need to offset the surrogate ScrollViewer by that amount in the opposite direction.&amp;#160; To resolve this problem, we use an IValueConverter to multiple the offset by –1.&lt;/p&gt;  &lt;p&gt;Here we can see the Xaml used to layout and hookup this scenario:&lt;/p&gt;  &lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;width:640px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;StackPanel&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;ScrollViewer&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;HorizontalScrollBarVisibility&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;Hidden&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;VerticalScrollBarVisibility&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;Hidden&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Grid&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Grid.RenderTransform&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;TranslateTransform&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;X&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;{Binding ElementName=mainScroller, Path=HorizontalOffset, Converter={StaticResource multiplyConv}, ConverterParameter=-1}&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Grid.RenderTransform&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;            &lt;span style="color:#008000;"&gt;&amp;lt;!-- Content Scrolled by another goes here --&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Grid&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;ScrollViewer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;ScrollViewer&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;x&lt;/span&gt;:&lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;mainScroller&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;HorizontalScrollBarVisibility&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;Auto&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;VerticalScrollBarVisibility&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;Auto&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        &lt;span style="color:#008000;"&gt;&amp;lt;!-- Content Scrolled on its own accord goes here--&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;ScrollViewer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;StackPanel&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;You can see that we have two ScrollViewers and the one which will be controlled (versus the controller) has a container element with a &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.translatetransform.aspx"&gt;TranslateTransform&lt;/a&gt; applied to its RenderTransform property.&amp;#160; This is what we will be using to move the controlled content in the opposite direction of the ScrollBar.&lt;/p&gt;

&lt;p&gt;If you find that your content for each are not the same size, you can always use a &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.data.multibinding.aspx"&gt;MultiBinding&lt;/a&gt; to accomodate the relative scrolling distance as applied to the offset.&lt;/p&gt;

&lt;p&gt;You can find the source to the sample Xbap &lt;a href="http://code.cromwellhaus.com/ScrollingMultipleAreasWithOneScrollbar/ScrollingMultipleAreasWithOneScrollbar.zip"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=875" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RyanCromwell?a=_jSHoS5UW_4:WHETXbQoNfc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RyanCromwell?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RyanCromwell?a=_jSHoS5UW_4:WHETXbQoNfc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RyanCromwell?i=_jSHoS5UW_4:WHETXbQoNfc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RyanCromwell?a=_jSHoS5UW_4:WHETXbQoNfc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RyanCromwell?i=_jSHoS5UW_4:WHETXbQoNfc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/_jSHoS5UW_4" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/WPF/default.aspx">WPF</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2009/03/12/scrolling-multiple-content-areas-with-a-single-scrollbar-in-wpf.aspx</feedburner:origLink></item><item><title>STUFF &amp; FOR XML PATH</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/3w_iH7gwWLM/stuff-amp-for-xml-path.aspx</link><pubDate>Mon, 02 Mar 2009 15:15:31 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:866</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=866</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=866</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2009/03/02/stuff-amp-for-xml-path.aspx#comments</comments><description>&lt;p&gt;On the get the job done front, my client had a question today that, while it makes me cringe a little to answer the way I did, it got him moving again.&lt;/p&gt;  &lt;p&gt;[Thanks to &lt;a href="http://twitter.com/malevy"&gt;Mike Levy&lt;/a&gt; for pointing me in the right direction]&lt;/p&gt;  &lt;p&gt;My client has a small administrative utility that displays Things.&amp;#160; Things can be applied to 0 or more categories.&amp;#160; Looks kinda’ like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://cromwellhaus.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ryanc/image_5F00_201FA719.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:block;float:none;margin-left:auto;border-top:0px;margin-right:auto;border-right:0px;" title="image" border="0" alt="image" src="http://cromwellhaus.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ryanc/image_5F00_thumb_5F00_064B70EA.png" width="308" height="101" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;He’s using a 3rd party control for the grid itself which provides really easy filtering, but it wouldn’t work with the data structures to which he had been binding.&amp;#160; So he wanted to know how he could return the category listing as a delimited string directly from the T-SQL.&lt;/p&gt;  &lt;p&gt;Here’s the gist of his schema (nothing fancy):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://cromwellhaus.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ryanc/image_5F00_25FA4AB2.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="Schema" border="0" alt="Schema" src="http://cromwellhaus.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ryanc/image_5F00_thumb_5F00_1E02A850.png" width="240" height="142" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;How we solved it:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;SELECT Id, Name, STUFF(      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (SELECT cat.Name + &amp;#39;; &amp;#39; AS [text()]      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; FROM Category AS cat       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; INNER JOIN ItemCategories AS ic ON cat.Id = ic.CategoryId      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WHERE (ic.ItemId = Item.Id) FOR XML PATH(&amp;#39;&amp;#39;)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ), 1, 0, &amp;#39;&amp;#39;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; )      &lt;br /&gt;FROM Item&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Obviously we would like to move the UI junk out of the DB, but he can deal with that when he understands the 3rd party control a little better.&amp;#160; Right now, he’s giving his customers some more features.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=866" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RyanCromwell?a=3w_iH7gwWLM:2pLSOKHEHTY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RyanCromwell?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RyanCromwell?a=3w_iH7gwWLM:2pLSOKHEHTY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RyanCromwell?i=3w_iH7gwWLM:2pLSOKHEHTY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RyanCromwell?a=3w_iH7gwWLM:2pLSOKHEHTY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RyanCromwell?i=3w_iH7gwWLM:2pLSOKHEHTY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/3w_iH7gwWLM" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/SQL+Server/default.aspx">SQL Server</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2009/03/02/stuff-amp-for-xml-path.aspx</feedburner:origLink></item><item><title>The WPF Mindset</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/zukM3ig66Zw/the-wpf-mindset.aspx</link><pubDate>Mon, 03 Nov 2008 15:38:00 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:765</guid><dc:creator>cromwellryan</dc:creator><slash:comments>6</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=765</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=765</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2008/11/03/the-wpf-mindset.aspx#comments</comments><description>&lt;p&gt;WPF is awesome, but it requires the developer to make a pretty big shift in their thinking of UI.&amp;#160; I’ve had a hard time explaining this to people, but last week, I had an opportunity to work through an example with &lt;a href="http://blogger.forgottenskies.com/"&gt;Steve Gentile&lt;/a&gt;.&amp;#160; That’s the basis of this walkthrough.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;The Scenerio&lt;/h2&gt;  &lt;p&gt;Steve has an ASP.Net website he maintains called &lt;a href="http://www.forgottenskies.com/"&gt;ForgottenSkies.com&lt;/a&gt;.&amp;#160; One of the pages displays a map from the game with events that were captured from the server.&amp;#160; You can see the ASP.Net version &lt;a href="http://www.forgottenskies.com/ForgottenWars/FSWarMap.aspx"&gt;here&lt;/a&gt;.&amp;#160; Steve was looking to create a Silverlight version of this page.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;The Wrong Mindset&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The initial response from most developers would be to put an image on the “form” and then figure out a way to place some composite control or other image that would denote each event’s location.&amp;#160; If they had the inclination they might use the DataContext, but they likely would also iterate each Event in some collection and manually place these controls within some container.&amp;#160; I believe Steve was trying to place them into a really big grid with lots of Rows and Columns to represent the Latitude and Longitude of the map.&lt;/p&gt;  &lt;h2&gt;The WPF Mindset&lt;/h2&gt;  &lt;p&gt;Decomposing this scenario is vital to using WPF properly.&amp;#160; When it comes down to it, the map is really just a way to visualize a collection of Events. If we wanted we could easily make this a list, couldn’t we?&amp;#160; So lets start there:&lt;/p&gt;  &lt;p&gt;For the purposes of this demo, the Window.DataContext is set to an instance of an AttackService, which looks like the following:&lt;/p&gt;  &lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;width:650px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; AttackService
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;{
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; ObservableCollection&amp;lt;Attack&amp;gt; Attacks { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; MapSize { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; AttackService()
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    {
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.MapSize = 160;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.Attacks = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ObservableCollection&amp;lt;Attack&amp;gt;();
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        Random random = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Random();
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; index =0; index &amp;lt; 10;index++)
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        {
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;            var attack = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Attack
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;            {
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;                Description = &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Format(&amp;quot;&lt;span style="color:#8b0000;"&gt;Attack {0}&lt;/span&gt;&amp;quot;, index),
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;                Latitude = random.Next(0, MapSize),
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;                Longitude = random.Next(0, MapSize),
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;                Type = (AttackType)random.Next(0, 2)
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;            };
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;            &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.Attacks.Add(attack);
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        }
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    }
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;}&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Our goal is to display the Attacks collection, so let’s do that:&lt;/p&gt;

&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;width:650px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Window&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;x&lt;/span&gt;:&lt;span style="color:#ff0000;"&gt;Class&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;WpfApplication1.Window1&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#ff0000;"&gt;xmlns&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#ff0000;"&gt;xmlns&lt;/span&gt;:&lt;span style="color:#ff0000;"&gt;x&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Grid&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;        
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;ListView&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;ItemsSource&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;{Binding Attacks}&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Grid&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Window&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://cromwellhaus.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ryanc/image_5F00_357ED79C.png"&gt;&lt;img style="display:inline;margin-left:0px;margin-right:0px;" title="image" border="0" alt="image" align="left" src="http://cromwellhaus.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ryanc/image_5F00_thumb_5F00_4616D28A.png" width="160" height="171" /&gt;&lt;/a&gt;We have a ListView which has it’s ItemsSource bound to our Attacks collection.&amp;#160; Nothing special.&amp;#160; WPF doesn’t know how to display an Attack class so if we would just see a 10 instances of our class name listed.&amp;#160; We’ll get there though.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;For starters, lets look at these as if they were listed in a table (or GridView). To do this, we’ll tell the ListView to use a style, &lt;em&gt;attacksList&lt;/em&gt;.&amp;#160; We’ll place this style definition in our Window’s Resources collection for convenience of our demo. &lt;/p&gt;

&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;width:650px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Window&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;x&lt;/span&gt;:&lt;span style="color:#ff0000;"&gt;Class&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;WpfApplication1.Window1&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#ff0000;"&gt;xmlns&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#ff0000;"&gt;xmlns&lt;/span&gt;:&lt;span style="color:#ff0000;"&gt;x&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Window.Resources&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;        
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Style&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;x&lt;/span&gt;:&lt;span style="color:#ff0000;"&gt;Key&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;attacksList&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;TargetType&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;ListView&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Setter&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Property&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;View&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Setter.Value&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;                    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;GridView&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;                        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;GridViewColumn&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;DisplayMemberBinding&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;{Binding Description}&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;                        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;GridViewColumn&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Header&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;Latitude&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;DisplayMemberBinding&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;{Binding Latitude}&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;                        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;GridViewColumn&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Header&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;Longitude&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;DisplayMemberBinding&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;{Binding Longitude}&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;                    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;GridView&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Setter.Value&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Setter&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Style&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;        
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Window.Resources&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Grid&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;        
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;ListView&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;x&lt;/span&gt;:&lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;attacksList&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;ItemsSource&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;{Binding Attacks}&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Style&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;{StaticResource attacksList}&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Grid&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Window&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;What we’ve done is given ourselves a way to set values or properties on the ListView.&amp;#160; &lt;a href="http://cromwellhaus.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ryanc/image6_5F00_7253596E.png"&gt;&lt;img style="display:inline;margin-left:0px;margin-right:0px;" title="image" border="0" alt="image" align="right" src="http://cromwellhaus.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ryanc/image6_5F00_thumb_5F00_74ACDB6C.png" width="149" height="183" /&gt;&lt;/a&gt;For the sample you see here, we set the type of View for the ListView to be a GridView.&amp;#160; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;The Map&lt;/h2&gt;

&lt;p&gt;The ultimate visualization of this information is to display it contextually in a map.&amp;#160; It’s important to remember that this is still a list, we just want to visualize the list differently.&amp;#160; To do this we need to change our &lt;em&gt;attacksListStyle&lt;/em&gt;.&lt;/p&gt;

&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;width:674px;padding-right:5px;height:454px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Style&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;x&lt;/span&gt;:&lt;span style="color:#ff0000;"&gt;Key&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;attacksList&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;TargetType&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;ListView&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Setter&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Property&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;ItemsPanel&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Setter.Value&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;ItemsPanelTemplate&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Canvas&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;                    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Canvas.Background&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;                        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;ImageBrush&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;ImageSource&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;Images\Map.jpg&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;                    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Canvas.Background&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Canvas&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;ItemsPanelTemplate&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Setter.Value&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Setter&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Setter&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Property&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;ItemContainerStyle&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Value&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;{StaticResource attackContainerStyle}&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Style&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;Instead of setting the View of our ListView, we are now setting the ItemsPanel to a Canvas.&amp;#160; This tells the ListView to place all of the items its charged with listing into the Canvas.&amp;#160; We have chosen canvas, because we will want to place each item via coordinates (X/Y, Left/Type) rather than stacking, row/column, etc.&amp;#160; The background of our Canvas is going to be a JPG version of our map.&amp;#160; Backgrounds and Foregrounds are always brushes, so we are using an ImageBrush to draw our map on the Canvas background.&lt;/p&gt;

&lt;p&gt;The second property we are setting is the &lt;em&gt;ItemContainerStyle &lt;/em&gt;to the &lt;em&gt;attackContainerStyle&lt;/em&gt;.&amp;#160; The ListView places each item into a container rather than displaying it directly.&amp;#160; In order to place it correctly, we need to set the Top and Left properties of this ItemContainer.&lt;/p&gt;

&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;width:650px;padding-right:5px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Style&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;x&lt;/span&gt;:&lt;span style="color:#ff0000;"&gt;Key&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;attackContainerStyle&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Setter&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Property&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;Canvas.Top&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Value&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;{Binding Latitude}&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Setter&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Property&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;Canvas.Left&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Value&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;{Binding Longitude}&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Style&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;This binds the Canvas.Top and Canvas.Left &lt;a href="http://msdn.microsoft.com/en-us/library/ms752914.aspx"&gt;DependencyProperties&lt;/a&gt; to the Attack.Latitude and Attack.Longitude properties respectively.&amp;#160; To bring this together, we have our ListView bound to a collection of Attacks and the ItemContainer contains each Attack and has its DataContext set to that Attack it is meant to contain.&lt;/p&gt;

&lt;p&gt;At this point we have most of what we want.&amp;#160; &lt;a href="http://cromwellhaus.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ryanc/image_5F00_33322913.png"&gt;&lt;img style="display:inline;" title="image" border="0" alt="image" src="http://cromwellhaus.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ryanc/image_5F00_thumb_5F00_4BA17AC9.png" width="310" height="214" /&gt;&lt;/a&gt;Each little black image you see below represents an attack.&amp;#160; This is done by setting the DataTemplate for the Attack type.&lt;/p&gt;

&lt;pre style="border-bottom:#cecece 1px solid;border-left:#cecece 1px solid;padding-bottom:5px;background-color:#fbfbfb;min-height:40px;padding-left:5px;width:379px;padding-right:5px;height:105px;overflow:auto;border-top:#cecece 1px solid;border-right:#cecece 1px solid;padding-top:5px;"&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;DataTemplate&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;DataType&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;{x:Type local:Attack}&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Image&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Source&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;Images\AlliedTerritory.gif&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#fbfbfb;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;DataTemplate&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;The problem you will find is that if you allow the Window to be scaled beyond the size of the map size as it existed when creating the Attack Latitude and Longitude, the points on the map will not scale or move with the map.&amp;#160; I dealt with this by implementing an &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.data.imultivalueconverter.aspx"&gt;IMultiValueConverter&lt;/a&gt;.&amp;#160; I won’t go into it here as it doesn’t pertain to our Mindset discussion, but I’ve included it in the attacked source code.&lt;/p&gt;

&lt;h2&gt;Summary&lt;/h2&gt;

&lt;p&gt;If you come into WPF trying to create cool graphics or visualizations from the outset, you will miss the power and productivity of the platform.&amp;#160; WPF and the oft-sited Designer/Developer scenario actually thrive when you begin to simplify your application into the basics and then apply visualizations.&lt;/p&gt;

&lt;p&gt;Get the source for this project here:&amp;#160; &lt;a href="http://cromwellhaus.com/samples/mapaslistview.zip"&gt;Source Code&lt;/a&gt;.&amp;#160; The Xaml for this is literally only 67 lines with spaces.&amp;#160; There is 1 line of custom code in code behind, and you saw the AttackService above.&amp;#160; It’s dead simple.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=765" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=G9wIJan3"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=D3RVwzKG"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=D3RVwzKG" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=eJh2JgCj"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=eJh2JgCj" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/zukM3ig66Zw" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/WPF/default.aspx">WPF</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2008/11/03/the-wpf-mindset.aspx</feedburner:origLink></item><item><title>Why VMWare over Virtual PC</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/PD_tKLXOrKg/why-vmware-over-virtual-pc.aspx</link><pubDate>Tue, 21 Oct 2008 16:41:17 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:761</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=761</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=761</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2008/10/21/why-vmware-over-virtual-pc.aspx#comments</comments><description>&lt;p&gt;I just found the reason why I’m going to slap down almost $200 bucks for VMWare Workstation over Virtual PC: Unity.&amp;#160; I am using a coworkers VM to help on a project he’s been working on, but he uses VMWare and I use Virtual PC.&amp;#160; Instead of buy a license I’m using &lt;a href="http://www.vmware.com/products/player/"&gt;VMWare Player&lt;/a&gt;.&amp;#160; Well I found option under VMWare called Unity so of course I clicked it.&amp;#160;&amp;#160; Well it’s possibly the coolest thing I’ve seen ever.&amp;#160; &lt;/p&gt;  &lt;p&gt;Here is my desktop with VMWare running as normal:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://cromwellhaus.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ryanc/image_5F00_1A338E68.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="VMWare Normal" border="0" alt="VMWare Normal" src="http://cromwellhaus.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ryanc/image_5F00_thumb_5F00_6B212CC3.png" width="640" height="404" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;and here it is with Unity:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://cromwellhaus.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ryanc/image_5F00_67BF951B.png"&gt;&lt;img style="display:inline;" title="image" border="0" alt="image" src="http://cromwellhaus.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ryanc/image_5F00_thumb_5F00_14389F35.png" width="640" height="404" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;All of the windows/applications that were active inside the VM are now native windows in my host.&amp;#160; Also, when you go down to the start button, a second Start Button with the name of the VM becomes visible that allows you to start other apps in this same mode.&amp;#160; I don’t care what you say, that’s just awesome.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=761" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=Ran82K7H"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=m5S5nGmd"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=m5S5nGmd" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=glAJXwp8"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=glAJXwp8" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/PD_tKLXOrKg" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Software+Reviews/default.aspx">Software Reviews</category><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Virtual+PC/default.aspx">Virtual PC</category><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/VMWare/default.aspx">VMWare</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2008/10/21/why-vmware-over-virtual-pc.aspx</feedburner:origLink></item><item><title>Gates/Seinfeld Commercial</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/wP3Yl8hcGDs/gates-seinfeld-commercial.aspx</link><pubDate>Fri, 05 Sep 2008 13:39:16 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:743</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=743</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=743</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2008/09/05/gates-seinfeld-commercial.aspx#comments</comments><description>&lt;p&gt;So everyone is hating on the new Gates/Seinfeld commercial (you can see it on &lt;a target="_blank" href="http://www.microsoft.com/windows/default.aspx?icid=winvan"&gt;Windows.com&lt;/a&gt;).&amp;nbsp; Maybe I like Seinfeld humor too much, but I think it&amp;#39;s hilarious.&amp;nbsp; It doesn&amp;#39;t inundate me with Windows or Vista glare, it&amp;#39;s not over the top, it&amp;#39;s just funny.&amp;nbsp; I mean, Bill Gates just wiggled his rear end on &lt;em&gt;national television!&lt;/em&gt;&lt;/p&gt; &lt;p&gt;I guess I&amp;#39;m just easy to please.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=743" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=oT40rX29"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=J6mV5FkW"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=J6mV5FkW" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=NbNvfY33"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=NbNvfY33" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/wP3Yl8hcGDs" height="1" width="1"/&gt;</description><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2008/09/05/gates-seinfeld-commercial.aspx</feedburner:origLink></item><item><title>TFS Screencasts - Part 2 - Scrum For Team System Features</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/MUfgw3w-ce4/tfs-screencasts-part-2-scrum-for-team-system-features.aspx</link><pubDate>Thu, 04 Sep 2008 18:44:05 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:742</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=742</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=742</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2008/09/04/tfs-screencasts-part-2-scrum-for-team-system-features.aspx#comments</comments><description>&lt;p&gt;One of the things we are using here at &lt;a target="_blank" href="http://www.sds-consulting.com/"&gt;SDS&lt;/a&gt; for our TFS installation and projects is the &lt;a target="_blank" href="http://www.scrumforteamsystem.com/"&gt;Scrum for Team System&lt;/a&gt; which provides a new Sharepoint Portal layout, Reporting Services reports and graphs, Work Item Templates, and an awesome &lt;a target="_blank" href="http://www.scrumforteamsystem.com/processguidance/v2/Process/Process.aspx"&gt;Process Guidance reference&lt;/a&gt;.&amp;nbsp; &lt;/p&gt; &lt;p&gt;In this screencast, I try to point out some of these features and how to get to them.&amp;nbsp; It&amp;#39;s short (just over 2 minutes) and I&amp;#39;ll dive into each as we continue our storyline.&lt;/p&gt; &lt;p&gt; &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;padding-top:0px;" id="scid:{7D7E1B1B-BB15-44b5-AC22-DF49F6B00FD3}:c69597b0-566d-4041-afd3-ee3b41f02b98" class="wlWriterSmartContent"&gt;   &lt;iframe src="http://silverlight.services.live.com/invoke/77629/SDS%20TFS%20-%20Part%202%20-%20Scrum%20Template%20Features/iframe.html" scrolling="no" frameborder="0" style="width:320px;height:240px;"&gt;&lt;/iframe&gt; &lt;/div&gt;&lt;/p&gt; &lt;p&gt;Shoutout to Camtasia which is sooo simple to use.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=742" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=IBmSosqm"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=NmXzpA2Z"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=NmXzpA2Z" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=BpKDAQmw"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=BpKDAQmw" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/MUfgw3w-ce4" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/TFS/default.aspx">TFS</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2008/09/04/tfs-screencasts-part-2-scrum-for-team-system-features.aspx</feedburner:origLink></item><item><title>TFS Screencasts - Part 1 - Create a Team Project</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/J6deC9OFW14/tfs-screencasts-part-1-create-a-team-project.aspx</link><pubDate>Wed, 27 Aug 2008 22:54:00 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:738</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=738</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=738</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2008/08/27/tfs-screencasts-part-1-create-a-team-project.aspx#comments</comments><description>&lt;p&gt;One of the projects I&amp;#39;m working on for my company, &lt;a target="_blank" href="http://www.sds-consulting.com/"&gt;Strategic Data Systems&lt;/a&gt;, is our internal Team Foundation Server 2008 solution.&amp;nbsp; I&amp;#39;m working with some of the guys who head up our Agile Development Center to make sure things fit well with what they are doing.&amp;nbsp; It&amp;#39;s been difficult to find overlapping free time, so I have started putting together screencasts to highlight our procedures and what I consider best-practices.&amp;nbsp; We&amp;#39;ve published written documentation internally, but these are so much more palatable.&lt;/p&gt; &lt;p&gt;These are geared toward our organization in content, but should be generally relevant to anyone interested in TFS.&amp;nbsp; This particular screencast walks through creating a Team Project and specifying permissions for implementing Scrum roles.&lt;/p&gt; &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;padding-top:0px;" id="scid:{7D7E1B1B-BB15-44b5-AC22-DF49F6B00FD3}:7057f11d-5025-4496-98a7-3de06b928709" class="wlWriterSmartContent"&gt;   &lt;iframe src="http://silverlight.services.live.com/invoke/77629/SDS%20Team%20Foundation%20Server%20-%20Part%201%20-%20Create%20a%20Team%20Project/iframe.html" scrolling="no" frameborder="0" style="width:320px;height:240px;"&gt;&lt;/iframe&gt; &lt;/div&gt; &lt;p&gt;&amp;nbsp;&lt;a target="_blank" href="http://silverlight.services.live.com/77629/SDS%20Team%20Foundation%20Server%20-%20Part%201%20-%20Create%20a%20Team%20Project/video.wmv"&gt;Direct Link&lt;/a&gt;&lt;/p&gt; &lt;p&gt;p.s This is hosted, for free (as in beer), by &lt;a target="_blank" href="http://silverlight.live.com/"&gt;Silverlight Streaming Services&lt;/a&gt;.&amp;nbsp; It took all of 20 seconds to sign up and 5 minutes to upload the video made with &lt;a target="_blank" href="http://www.camtasia.com/camtasia.asp"&gt;Camtasia&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=738" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=UmlabhMn"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=jpjbxMmw"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=jpjbxMmw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=xLipXDOZ"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=xLipXDOZ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/J6deC9OFW14" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/TFS/default.aspx">TFS</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2008/08/27/tfs-screencasts-part-1-create-a-team-project.aspx</feedburner:origLink></item><item><title>Outlook 2007 does the little things</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/Xs1CHUyhoME/outlook-2007-does-the-little-things.aspx</link><pubDate>Tue, 26 Aug 2008 20:23:40 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:735</guid><dc:creator>cromwellryan</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=735</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=735</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2008/08/26/outlook-2007-does-the-little-things.aspx#comments</comments><description>&lt;p&gt;People give Microsoft Outlook a lot of crap, but if you&amp;#39;re willing to think outside the box, you&amp;#39;ll realize they did all the little things that make life easy.&amp;nbsp; For instance, I rarely use the calendar popup for creating new appointments.&amp;nbsp; No, if I have a meeting next Wednesday, I type &amp;quot;&lt;em&gt;next wed&amp;quot;&lt;/em&gt; and hit tab.&amp;nbsp; It&amp;#39;s at 1pm, well, type 1 and hit tab.&lt;/p&gt; &lt;p&gt;Done.&lt;/p&gt; &lt;p&gt;&lt;a href="http://cromwellhaus.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ryanc/image_5F00_2.png"&gt;&lt;img height="413" alt="New Appt. Screenshot" src="http://cromwellhaus.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ryanc/image_5F00_thumb.png" width="640" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=735" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=v5G9a4OJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=jHSaJuwe"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=jHSaJuwe" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=2ESnUZ8L"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=2ESnUZ8L" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/Xs1CHUyhoME" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Software+Reviews/default.aspx">Software Reviews</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2008/08/26/outlook-2007-does-the-little-things.aspx</feedburner:origLink></item><item><title>SQL Server 2000 vs 2005 Lazy XML Validation</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/ZyjeQrfi-14/sql-server-2000-vs-2005-lazy-xml-validation.aspx</link><pubDate>Tue, 19 Aug 2008 16:55:39 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:730</guid><dc:creator>cromwellryan</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=730</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=730</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2008/08/19/sql-server-2000-vs-2005-lazy-xml-validation.aspx#comments</comments><description>&lt;p&gt;Someone was looking to do quick-and-dirty validation of an Xml document inside a SQL Server procedure today.&amp;nbsp; I assumed, and regretted, that he meant 2005, which would have looked like this:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;declare @xml1 xml&amp;nbsp; &lt;br /&gt;declare @xml2 xml&amp;nbsp; &lt;br /&gt;set @xml1 = &amp;#39;&amp;lt;Node1&amp;gt;&amp;lt;Node2 attrib=&amp;quot;This is it.&amp;quot; /&amp;gt;&amp;lt;/Node1&amp;gt;&amp;#39;&lt;br /&gt;set @xml2 = &amp;#39;&amp;lt;Node1&amp;gt;&amp;lt;Node2 /&amp;gt;&amp;lt;/Node1&amp;gt;&amp;#39;&lt;br /&gt;select Col.value(&amp;#39;count(./@attrib)&amp;#39;, &amp;#39;int&amp;#39;) as count&lt;br /&gt;from @xml1.nodes(&amp;#39;Node1/Node2&amp;#39;) as Tbl(Col)  &lt;p&gt;select Col.value(&amp;#39;count(./@attrib)&amp;#39;, &amp;#39;int&amp;#39;) as count&lt;br /&gt;from @xml2.nodes(&amp;#39;Node1/Node2&amp;#39;) as Tbl(Col)&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;After being told, &amp;quot;that blows up&amp;quot;, I jogged the memory a bit and came up with this mess:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;/* THE STUPID WAY */&lt;br /&gt;DECLARE @hdoc int&lt;br /&gt;DECLARE @doc1 varchar(MAX)&lt;br /&gt;DECLARE @doc2 varchar(MAX)&lt;br /&gt;set @doc1 = &amp;#39;&amp;lt;Node1&amp;gt;&amp;lt;Node2 attrib=&amp;quot;This is it.&amp;quot; /&amp;gt;&amp;lt;/Node1&amp;gt;&amp;#39;&lt;br /&gt;set @doc2 = &amp;#39;&amp;lt;Node1&amp;gt;&amp;lt;Node2 /&amp;gt;&amp;lt;/Node1&amp;gt;&amp;#39;&lt;br /&gt;/* DOC 1 */&lt;br /&gt;EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc1  &lt;p&gt;IF EXISTS( SELECT&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;br /&gt;FROM&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OPENXML (@hdoc, &amp;#39;/Node1/Node2/@attrib&amp;#39;,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; WITH (attrib&amp;nbsp; varchar(20)))&lt;br /&gt;BEGIN&lt;br /&gt;PRINT &amp;#39;Dumb ass&amp;#39;&lt;br /&gt;END&lt;br /&gt;exec sp_xml_removedocument @hdoc  &lt;p&gt;/* DOC 2 */&lt;br /&gt;EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc2  &lt;p&gt;IF EXISTS( SELECT&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;br /&gt;FROM&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OPENXML (@hdoc, &amp;#39;/Node1/Node2/@attrib&amp;#39;,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; WITH (attrib&amp;nbsp; varchar(20)))&lt;br /&gt;BEGIN&lt;br /&gt;PRINT &amp;#39;Dumb ass&amp;#39;&lt;br /&gt;END&lt;br /&gt;exec sp_xml_removedocument @hdoc &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Moral of the store?&amp;nbsp; UPGRADE!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=730" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=4Qy5WlAE"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=bie4IdVa"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=bie4IdVa" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=6qlDdhjw"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=6qlDdhjw" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/ZyjeQrfi-14" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/SQL+Server/default.aspx">SQL Server</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2008/08/19/sql-server-2000-vs-2005-lazy-xml-validation.aspx</feedburner:origLink></item><item><title>Installation Guides</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/kzONCqfvMYU/installation-guides.aspx</link><pubDate>Wed, 06 Aug 2008 03:25:31 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:717</guid><dc:creator>cromwellryan</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=717</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=717</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2008/08/06/installation-guides.aspx#comments</comments><description>&lt;p&gt;This evening I completed my first split-server (or dual server as it&amp;#39;s called in the guide) installation of Team Foundation Server 2008.&amp;nbsp; I&amp;#39;ve installed TFS a few times now in single-server mode which is pretty crazy easy when you consider what you get (way more than SVN or CVS by themselves).&amp;nbsp; Throughout the entire process I actually found myself RTFM step -by-step.&amp;nbsp; For all the grief that Microsoft receives, you have to give them a ton of credit for their manuals, guides, and walk-throughs.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=717" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=XytSY1vV"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=6eXINs8L"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=6eXINs8L" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=gynATDSY"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=gynATDSY" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/kzONCqfvMYU" height="1" width="1"/&gt;</description><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2008/08/06/installation-guides.aspx</feedburner:origLink></item><item><title>Reason #29 for using Virtual Machines</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/05NTbPEaQKg/reason-29-for-using-virtual-machines.aspx</link><pubDate>Wed, 06 Aug 2008 02:47:14 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:715</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=715</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=715</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2008/08/06/reason-29-for-using-virtual-machines.aspx#comments</comments><description>&lt;p&gt;Today I blew up a server.&amp;nbsp; Couldn&amp;#39;t figure something out so I pushed every button I could find, flipped every switch and changed every setting.&amp;nbsp; Nothing.&amp;nbsp; So you know what I did, I deleted it, copied over a new &lt;a href="http://cromwellhaus.com/blogs/ryanc/archive/2008/06/13/sysprep-your-virtual-pc-images.aspx" target="_blank"&gt;Sysprepped Hard Drive&lt;/a&gt; and had a clean slate in about 5 minutes.&lt;/p&gt; &lt;p&gt;I figured out my problem, by the way.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=715" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=zZc46cjH"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=DDCa2AFN"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=DDCa2AFN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=7nzscTMu"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=7nzscTMu" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/05NTbPEaQKg" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Virtual+PC/default.aspx">Virtual PC</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2008/08/06/reason-29-for-using-virtual-machines.aspx</feedburner:origLink></item><item><title>Why Plain Old LINQ is so powerful</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/hQPIFAkp8fQ/why-plain-old-linq-is-so-powerful.aspx</link><pubDate>Thu, 31 Jul 2008 19:04:20 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:711</guid><dc:creator>cromwellryan</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=711</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=711</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2008/07/31/why-plain-old-linq-is-so-powerful.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://www.interact-sw.co.uk/iangblog/" target="_blank"&gt;Ian Griffiths&lt;/a&gt; posted a &lt;a href="http://www.interact-sw.co.uk/iangblog/2008/07/30/linq-box-aggregation" target="_blank"&gt;great example&lt;/a&gt; of how powerful and cool LINQ is when used in everyday code (it&amp;#39;s not all about databases people).&lt;/p&gt; &lt;p&gt;If you haven&amp;#39;t started to learn how to incorporate this awesome toolset into your daily coding life, you&amp;#39;re killing yourself.&amp;nbsp; No excuses.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=711" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=JIRn7jG6"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=Da0ZtsvW"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=Da0ZtsvW" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=RoJcCXTA"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=RoJcCXTA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/hQPIFAkp8fQ" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/.Net/default.aspx">.Net</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2008/07/31/why-plain-old-linq-is-so-powerful.aspx</feedburner:origLink></item><item><title>Roadblock to Mocking Unit Tests</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/4D1zkBEc5vo/roadblock-to-mocking-unit-tests.aspx</link><pubDate>Tue, 15 Jul 2008 13:58:51 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:692</guid><dc:creator>cromwellryan</dc:creator><slash:comments>14</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=692</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=692</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2008/07/15/roadblock-to-mocking-unit-tests.aspx#comments</comments><description>&lt;p&gt;I&amp;#39;ve been a faithful unit tester for a few years now.&amp;nbsp; I may not do everything by the book (I think end-to-end unit tests are helpful), but I do get good coverage most of the time.&amp;nbsp; That said, I&amp;#39;ve found myself unable to use any of the Mock frameworks out there, because I don&amp;#39;t use your typical Dependency Injection pattern.&amp;nbsp; That is, I don&amp;#39;t like &amp;quot;building up&amp;quot; very freaking instance with all the &amp;quot;Provider&amp;quot; or &amp;quot;Service&amp;quot; interfaces I&amp;#39;m might need in the possible life of a business object.&amp;nbsp; Yes, if your Customer class is only going to create or save an Order, it feels OK, but my objects are busy dude, so I&amp;#39;d need the longest constructor of all time.&lt;/p&gt; &lt;p&gt;I prefer &lt;a href="http://search.live.com/results.aspx?q=dependency+resolution+mock&amp;amp;form=QBRE" target="_blank"&gt;Dependency Resolution&lt;/a&gt;.&amp;nbsp; I don&amp;#39;t use any fancy framework, I just use a good old, DI.Resolve&amp;lt;IBusyBee&amp;gt;() and go about my business.&amp;nbsp; It works wonderfully, it&amp;#39;s light-weight (cause I don&amp;#39;t use configuration based DI frameworks), and it&amp;#39;s my baby.&lt;/p&gt; &lt;p&gt;That said, it&amp;#39;s also been the roadblock to my mocking foray.&amp;nbsp; That was, until I &amp;quot;got it&amp;quot; today.&amp;nbsp; Long story short, here&amp;#39;s how I roll:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Create a Mock DI Container...&lt;/strong&gt;&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color:#2b91af;"&gt;Mock&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;IDIContainer&lt;/span&gt;&amp;gt; mockContainer = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Mock&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;IDIContainer&lt;/span&gt;&amp;gt;();&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Create the Injected Mock instances...&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#2b91af;"&gt;Mock&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;INotificationManager&lt;/span&gt;&amp;gt; mockNotifMgr = &lt;span style="color:blue;"&gt;new&lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Mock&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;INotificationManager&lt;/span&gt;&amp;gt;();&lt;br /&gt;&lt;span style="color:#2b91af;"&gt;Mock&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;IRepository&lt;/span&gt;&amp;gt; mockRepository = &lt;span style="color:blue;"&gt;new&lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Mock&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;IRepository&lt;/span&gt;&amp;gt;();&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tell the mock IDIContainer to return the mock instances when asked...&lt;/strong&gt;&lt;/p&gt;&lt;pre class="code"&gt;mockContainer.Expect(c =&amp;gt; c.Resolve&amp;lt;&lt;span style="color:#2b91af;"&gt;INotificationManager&lt;/span&gt;&amp;gt;(&lt;span style="color:blue;"&gt;null&lt;/span&gt;)).Returns(mockNotifMgr.Object);
mockContainer.Expect(c =&amp;gt; c.Resolve&amp;lt;&lt;span style="color:#2b91af;"&gt;IRepository&lt;/span&gt;&amp;gt;(&lt;span style="color:blue;"&gt;null&lt;/span&gt;)).Returns(mockRepository.Object);
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Mock your heart out...&lt;/strong&gt;&lt;/p&gt;&lt;pre class="code"&gt;mockNotifMgr.Expect(mgr =&amp;gt; mgr.NotifyEmailConfirmation(&lt;span style="color:#2b91af;"&gt;It&lt;/span&gt;.IsAny&amp;lt;&lt;span style="color:#2b91af;"&gt;Member&lt;/span&gt;&amp;gt;())).AtMostOnce();
&lt;/pre&gt;&lt;pre class="code"&gt;&lt;span style="color:#2b91af;"&gt;Member&lt;/span&gt;.Register(&lt;span style="color:#a31515;"&gt;&amp;quot;username&amp;quot;&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;&amp;quot;firstname&amp;quot;&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;&amp;quot;lastname&amp;quot;&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;&amp;quot;ryan@myus.com&amp;quot;&lt;/span&gt;);

mockContainer.VerifyAll();
mockNotifMgr.VerifyAll();
&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;I&amp;#39;m very happy to have finally jumped on the Moq bandwagon as it will certainly make some unit tests much easier to write.&amp;nbsp; Maybe I&amp;#39;ll even do the test first part more faithfully now.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;FYI, I use my own DI framework which is just a glorified HashTable.&amp;nbsp; It works for me and it is quick.&amp;nbsp; &lt;a href="http://moq.googlecode.com/" target="_blank"&gt;Moq&lt;/a&gt; has also become my Mock framework of choice for no good reason other than I downloaded it first.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=692" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=R7atnKnK"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=4Km9I7i9"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=4Km9I7i9" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=rAbRSahz"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=rAbRSahz" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/4D1zkBEc5vo" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/.Net/default.aspx">.Net</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2008/07/15/roadblock-to-mocking-unit-tests.aspx</feedburner:origLink></item><item><title>Video Conferencing Code of Conduct</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/OEpUblluLmY/video-conferencing-code-of-conduct.aspx</link><pubDate>Mon, 07 Jul 2008 19:01:18 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:690</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=690</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=690</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2008/07/07/video-conferencing-code-of-conduct.aspx#comments</comments><description>&lt;p&gt;My team uses &lt;a href="http://www.oovoo.com/"&gt;ooVoo&lt;/a&gt; for video conferencing our Daily Scrum.&amp;nbsp; It&amp;#39;s been great and very reliable.&amp;nbsp; My only complaint is a lack of whiteboard or desktop sharing, but we&amp;#39;ve overcome these obstacles with other tools (see &lt;a href="https://connect.microsoft.com/site/sitehome.aspx?SiteID=94&amp;amp;wa=wsignin1.0"&gt;SharedView&lt;/a&gt;).&amp;nbsp; Over the months, I&amp;#39;ve come to acquire an expectation of what the experience should be like and, from that, a Code of Conduct.&amp;nbsp; Here it is:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Don&amp;#39;t Be a Slob&lt;/strong&gt; - Just cause you&amp;#39;re in your bedroom or PJ&amp;#39;s doesn&amp;#39;t mean I want to know about it.&amp;nbsp; Put a decent shirt on and brush your hair.&amp;nbsp; Same goes for yawning, coughing, and every other table manner.&amp;nbsp; Cover your mouth, mute the Mic, whatever.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Have a Headset&lt;/strong&gt; - I&amp;#39;m sure some guy out there is ecstatic about the next step in the evolution of the speaker phone, but they still suck in comparison to a headset and Mic that are placed against their corresponding body part.&amp;nbsp; You&amp;#39;re laptop&amp;#39;s built in speaker and Mic are no better, so fork out the 10 bucks and get a cheap headset you cheap-***.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Go Full or Go Home&lt;/strong&gt; - I&amp;#39;m glad your torrents are racing, but your video looks like the corner of your head just entered the Atari zone.&amp;nbsp; Stop downloading the latest SUSE iso for a few minutes and give me your full bandwidth attention.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=690" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=x5VmxJlM"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=EwxVKPs1"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=EwxVKPs1" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=mnmgvM40"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=mnmgvM40" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/OEpUblluLmY" height="1" width="1"/&gt;</description><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2008/07/07/video-conferencing-code-of-conduct.aspx</feedburner:origLink></item><item><title>Setting up a Virtual PC Domain</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/sfkTYHSlWzM/setting-up-a-virtual-pc-domain.aspx</link><pubDate>Mon, 07 Jul 2008 18:38:30 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:688</guid><dc:creator>cromwellryan</dc:creator><slash:comments>3</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=688</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=688</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2008/07/07/setting-up-a-virtual-pc-domain.aspx#comments</comments><description>&lt;p&gt;I do a lot of demos and Virtual PC 2007 is a mainstay in my arsenal for those demos.&amp;nbsp; I&amp;#39;ve used VMWare Server (the free one) and it is very nice, but I run an x64 OS and VMWare had neglected to sign certain emulation drives which caused me enough headache that I ditched it for the easy of VPC.&amp;nbsp; &lt;/p&gt; &lt;p&gt;I mentioned using &lt;a href="http://cromwellhaus.com/blogs/ryanc/archive/2008/06/13/sysprep-your-virtual-pc-images.aspx"&gt;Syspreping&lt;/a&gt; for my VPC library prior which saves me a ton of time, but one of the things I&amp;#39;ve always started but never finished was setting up a Virtual Domain.&amp;nbsp; Well this weekend, I finished things up and I&amp;#39;m happy to say, it wasn&amp;#39;t that bad.&amp;nbsp; &lt;/p&gt; &lt;p&gt;Here&amp;#39;s what I did:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Create My Domain Controller Machine&lt;/strong&gt; by copying a Syspreped Window 2008 Server harddrive image and creating a new Virtual PC using an existing hard drive.&amp;nbsp; About 120 seconds later I have a free standing vanilla server ready to roll.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;a href="http://cromwellhaus.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ryanc/image_5F00_8.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="174" alt="image" src="http://cromwellhaus.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ryanc/image_5F00_thumb_5F00_3.png" width="240" align="right" border="0" /&gt;&lt;/a&gt;Configure Network Adapter(s) &lt;/strong&gt;by specifying &lt;em&gt;Local Only&lt;/em&gt; in the VPC&amp;#39;s Network Settings.&amp;nbsp; &lt;/p&gt; &lt;p&gt;At this point you&amp;#39;ll want to log into VPC if you haven&amp;#39;t already.&amp;nbsp; We&amp;#39;ll want to isolate our domain and let each of the workstation VPC&amp;#39;s communicate with the domain controller by going into the Network Adapter&amp;#39;s properties.&amp;nbsp; Our little domain network is going to be rather isolated.&amp;nbsp; To accomplish this, we will specify a specific Subnet and IP address range.&amp;nbsp; Here is what I&amp;#39;ve used for mine:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;IP Range: 192.168.8.1 - 254 (where 192.168.8.1 is my domain controller IP)&lt;br /&gt;Subnet Mask: 255.255.248.0&lt;br /&gt;Gateway: 192.168.8.1 (DC/DNS server)&lt;br /&gt;Primary DNS: 192.168.8.1 (DC/DNS server)&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;a href="http://cromwellhaus.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ryanc/image_5F00_4.png"&gt;&lt;strong&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="205" alt="image" src="http://cromwellhaus.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ryanc/image_5F00_thumb_5F00_1.png" width="244" align="right" border="0" /&gt;&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; Setting up Active Directory&lt;/strong&gt; is a breeze if you do it the easy way.&amp;nbsp; Of course, I did it the easy way the last time.&amp;nbsp; (Note to self: when just learning, take the defaults).&amp;nbsp; Windows Server 2003 and 2008 have this concept of Roles.&amp;nbsp; A server can fill one or more roles which are the conglomeration of settings, services, etc to do something more abstract... like be a DC.&amp;nbsp; We are going to add the role &lt;em&gt;Active Directory Domain Services&lt;/em&gt;.&amp;nbsp;&amp;nbsp; &lt;/p&gt; &lt;p&gt;After the Add Role wizard does it&amp;#39;s thing, you actually &amp;quot;promote&amp;quot; the machine to a DC by running dcpromo.exe (Start, dcpromo, Enter).&amp;nbsp; This is where you make your selections, which in this case, I&amp;#39;ve chosen:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Create a new domain in a new forest&lt;br /&gt;FQDN: vpc.com&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;You&amp;#39;ll want to let the machine also be a DNS server.&amp;nbsp; This is where I screwed up the first time.&amp;nbsp; Don&amp;#39;t get scared here, with our networking settings this domain we&amp;#39;re setting up won&amp;#39;t touch your corporate domain or anything crazy like that.&lt;/p&gt; &lt;p&gt;Let the Wizard do it&amp;#39;s thing and reboot when it is complete.&lt;/p&gt; &lt;p&gt;Your Active Directory Domain Controller is ready to roll.&amp;nbsp; Great job. &lt;/p&gt; &lt;p&gt;&lt;strong&gt;Adding Workstations &lt;/strong&gt;is a matter of adding a Computer entry into the &lt;em&gt;Active Directory Users and Computers&lt;/em&gt; console and then actually adding the computer to the domain.&amp;nbsp; You&amp;#39;ll find the AD Users and Computers MMC console in Administrative Tools.&amp;nbsp; Once you&amp;#39;ve added a computer entry, log into another VPC instance which has the same Network Adapter settings as above (different IP of course .2, .3, etc) and add the machine to the domain (vpc.com) in my case.&amp;nbsp; &lt;/p&gt; &lt;p&gt;&lt;a href="http://cromwellhaus.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ryanc/image_5F00_10.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="244" alt="image" src="http://cromwellhaus.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/ryanc/image_5F00_thumb_5F00_4.png" width="222" align="right" border="0" /&gt;&lt;/a&gt;Here&amp;#39;s a quick screen capture of my Network Adapter on the Workstation I added to the domain.&lt;/p&gt; &lt;p&gt;It&amp;#39;s great being able to demo Enterprise software this way or test things like integrated authentication for intranet applications. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=688" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=Qp9EPeJl"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=0Jg8EiEE"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=0Jg8EiEE" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=iG6zrvOl"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=iG6zrvOl" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/sfkTYHSlWzM" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Networking/default.aspx">Networking</category><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Virtual+PC/default.aspx">Virtual PC</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2008/07/07/setting-up-a-virtual-pc-domain.aspx</feedburner:origLink></item><item><title>Did you know?  Screenshots of Virtual PC Instances</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/JBXsou5f844/did-you-know-screenshots-of-virtual-pc-instances.aspx</link><pubDate>Mon, 07 Jul 2008 17:31:47 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:687</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=687</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=687</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2008/07/07/did-you-know-screenshots-of-virtual-pc-instances.aspx#comments</comments><description>&lt;p&gt;If you are running a VPC instance and you&amp;#39;d like to take a screenshot of something on the VPC, did you know you can do that without any photo editing hassle?&lt;/p&gt; &lt;p&gt;Simply make sure you aren&amp;#39;t &amp;quot;in&amp;quot; the VPC (hit the right Alt key if you are).&amp;nbsp; Now click and drag a square around the portion of the VM you want to capture.&amp;nbsp; CTRL+C or Edit -&amp;gt; Copy will capture the section to the clipboard and you can paste it wherever.&amp;nbsp; &lt;/p&gt; &lt;p&gt;Nice touch.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=687" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=4vo8V4VP"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=4O4PsLKM"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=4O4PsLKM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=kk9cDNMu"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=kk9cDNMu" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/JBXsou5f844" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Virtual+PC/default.aspx">Virtual PC</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2008/07/07/did-you-know-screenshots-of-virtual-pc-instances.aspx</feedburner:origLink></item><item><title>Why WPF?  This is why...</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/76doCPjzkSA/why-wpf-this-is-why.aspx</link><pubDate>Wed, 02 Jul 2008 21:08:53 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:686</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=686</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=686</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2008/07/02/why-wpf-this-is-why.aspx#comments</comments><description>&lt;p&gt;&lt;a title="http://dnrtv.com/default.aspx?showID=115" href="http://dnrtv.com/default.aspx?showID=115"&gt;http://dnrtv.com/default.aspx?showID=115&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Just awesome!&amp;nbsp; I didn&amp;#39;t see anything far fetched other than they must have a great designer on staff.&amp;nbsp; I wonder if the designer was doing the Blend work?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=686" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=tszvAGvY"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=IqHbvp7y"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=IqHbvp7y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=VwP4MeYm"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=VwP4MeYm" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/76doCPjzkSA" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/.Net/default.aspx">.Net</category><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/WPF/default.aspx">WPF</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2008/07/02/why-wpf-this-is-why.aspx</feedburner:origLink></item><item><title>Visitor Pattern with Anonymous Methods</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/3fIl8bykFPk/visitor-pattern-with-anonymous-methods.aspx</link><pubDate>Wed, 02 Jul 2008 13:35:00 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:685</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=685</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=685</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2008/07/02/visitor-pattern-with-anonymous-methods.aspx#comments</comments><description>&lt;p&gt;I don&amp;#39;t often have the need to implement the &lt;a href="http://www.dofactory.com/Patterns/PatternVisitor.aspx"&gt;Visitor Pattern&lt;/a&gt;, but today I was that day.&amp;nbsp; I looked around really quick for an example of how to do this with &lt;a href="http://msdn.microsoft.com/en-us/library/bb397687.aspx"&gt;Lambda Expressions&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/0yw3tz5k.aspx"&gt;Anonymous Methods&lt;/a&gt;, which seemed like they were the way to go.&amp;nbsp; It may be that my search skills have deteriorated right along with my sense of style, but I didn&amp;#39;t find much.&lt;/p&gt;
&lt;p&gt;I played around for a few minutes and here is what I came up with:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div class="csharpcode"&gt;
&lt;div class="csharpcode"&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="code"&gt;&lt;span style="color:#0000ff;"&gt;public abstract class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;CarBase
&lt;/span&gt;{
    &lt;span style="color:#0000ff;"&gt;public void &lt;/span&gt;Visit(&lt;span style="color:#2b91af;"&gt;Action&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;CarBase&lt;/span&gt;&amp;gt; action)
    {
        &lt;span style="color:#0000ff;"&gt;if &lt;/span&gt;(action != &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)
            action(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;);
    }
}

&lt;span style="color:#0000ff;"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;BigCar &lt;/span&gt;: &lt;span style="color:#2b91af;"&gt;CarBase
&lt;/span&gt;{
    &lt;span style="color:#0000ff;"&gt;public void &lt;/span&gt;RunOverLittleCar()
    {
        &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515;"&gt;&amp;quot;Me smash little car!&amp;quot;&lt;/span&gt;);
    }
}

&lt;span style="color:#0000ff;"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;LittleCar &lt;/span&gt;: &lt;span style="color:#2b91af;"&gt;CarBase
&lt;/span&gt;{
    &lt;span style="color:#0000ff;"&gt;public virtual void &lt;/span&gt;RunAwayFromBigCar()
    {
        &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515;"&gt;&amp;quot;Go Faster!&amp;quot;&lt;/span&gt;);
    }
}

&lt;span style="color:#0000ff;"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;EcoCar &lt;/span&gt;: &lt;span style="color:#2b91af;"&gt;LittleCar
&lt;/span&gt;{
    &lt;span style="color:#0000ff;"&gt;public override void &lt;/span&gt;RunAwayFromBigCar()
    {
        &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515;"&gt;&amp;quot;Ouch.&amp;quot;&lt;/span&gt;);
    }
}&lt;/pre&gt;
&lt;pre class="code"&gt;&lt;span style="color:#0000ff;"&gt;class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Program
&lt;/span&gt;{
    &lt;span style="color:#0000ff;"&gt;static void &lt;/span&gt;Main(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;[] args)
    {
        &lt;span style="color:#2b91af;"&gt;IList&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;CarBase&lt;/span&gt;&amp;gt; cars = &lt;span style="color:#0000ff;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;CarBase&lt;/span&gt;&amp;gt;(&lt;span style="color:#0000ff;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;CarBase&lt;/span&gt;[] {
                                                                &lt;span style="color:#0000ff;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;BigCar&lt;/span&gt;(), 
                                                                &lt;span style="color:#0000ff;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;LittleCar&lt;/span&gt;(), 
                                                                &lt;span style="color:#0000ff;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;EcoCar&lt;/span&gt;() 
                                                              });
        &lt;span style="color:#0000ff;"&gt;foreach &lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;CarBase &lt;/span&gt;car &lt;span style="color:#0000ff;"&gt;in &lt;/span&gt;cars)
        {
            car.Visit(&lt;span style="color:#0000ff;"&gt;delegate&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;CarBase &lt;/span&gt;c)
            {
                &lt;span style="color:#0000ff;"&gt;if &lt;/span&gt;(c &lt;span style="color:#0000ff;"&gt;is &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;BigCar&lt;/span&gt;)
                    ((&lt;span style="color:#2b91af;"&gt;BigCar&lt;/span&gt;)c).RunOverLittleCar();
                &lt;span style="color:#0000ff;"&gt;else if &lt;/span&gt;(c &lt;span style="color:#0000ff;"&gt;is &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;LittleCar&lt;/span&gt;)
                    ((&lt;span style="color:#2b91af;"&gt;LittleCar&lt;/span&gt;)c).RunAwayFromBigCar();
                &lt;span style="color:#0000ff;"&gt;else if &lt;/span&gt;(c &lt;span style="color:#0000ff;"&gt;is &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;EcoCar&lt;/span&gt;)
                    ((&lt;span style="color:#2b91af;"&gt;EcoCar&lt;/span&gt;)c).RunAwayFromBigCar();
            });
        }

        &lt;span style="color:#0000ff;"&gt;if &lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;Debugger&lt;/span&gt;.IsAttached)
            &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.ReadLine();
    }
}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;


&lt;/p&gt;
&lt;p&gt;In many implementations of the visitor pattern there is an adapter or actual Visitor interface and implementation class which is passed into the Visit() method.&amp;nbsp; This is just smooth.&lt;/p&gt;
&lt;p&gt;My visit method above is a little big to look good as a lambda expression, though maybe I just don&amp;#39;t have the eye for it.&amp;nbsp; &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=685" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=bNXANAy5"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=BLokBIu0"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=BLokBIu0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=PYYr6ats"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=PYYr6ats" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/3fIl8bykFPk" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/.Net/default.aspx">.Net</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2008/07/02/visitor-pattern-with-anonymous-methods.aspx</feedburner:origLink></item><item><title>Virtual Property C# Code Snippet</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/WdArGLLLFXo/virtual-property-c-code-snippet.aspx</link><pubDate>Wed, 02 Jul 2008 03:31:00 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:684</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=684</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=684</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2008/07/02/virtual-property-c-code-snippet.aspx#comments</comments><description>&lt;p&gt;For those of you who use NHibernate you may find this convenient, if you don&amp;#39;t already have your own.&amp;nbsp; Below is a C# code snippet for creating a public virtual property (code and file are both there).&amp;nbsp; Just put it in your &lt;em&gt;&amp;lt;Visual Studio 2005/2008&amp;gt;\Code Snippets\Visual C#\My Code Snippets&lt;/em&gt; folder and you&amp;#39;re off and running.&amp;nbsp; No restart required.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://cromwellhaus.com/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.00.06.84/propv.snippet"&gt;File&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a31515;"&gt;xml &lt;/span&gt;&lt;span style="color:red;"&gt;version&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;1.0&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;encoding&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;utf-8&lt;/span&gt;&amp;quot; &lt;span style="color:blue;"&gt;?&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;CodeSnippets  &lt;/span&gt;&lt;span style="color:red;"&gt;xmlns&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;CodeSnippet &lt;/span&gt;&lt;span style="color:red;"&gt;Format&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;1.0.0&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Header&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Title&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;propv&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Title&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Shortcut&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;propv&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Shortcut&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Description&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;Code snippet for an automatically implemented virtual property&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Description&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Author&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;Microsoft Corporation&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Author&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;SnippetTypes&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;SnippetType&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;Expansion&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;SnippetType&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;SnippetTypes&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Header&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Snippet&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Declarations&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Literal&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
                    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ID&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;type&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ID&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
                    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ToolTip&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;Property type&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ToolTip&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
                    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Default&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;int&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Default&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
                &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Literal&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
                &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Literal&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
                    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ID&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;property&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ID&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
                    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ToolTip&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;Property name&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ToolTip&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
                    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Default&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;MyProperty&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Default&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
                &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Literal&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Declarations&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Code &lt;/span&gt;&lt;span style="color:red;"&gt;Language&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;csharp&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;&amp;lt;![CDATA[&lt;/span&gt;&lt;span style="color:gray;"&gt;public virtual $type$ $property$ { get; set; }$end$&lt;/span&gt;&lt;span style="color:blue;"&gt;]]&amp;gt;
            &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Code&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Snippet&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;CodeSnippet&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;CodeSnippets&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&lt;/span&gt; &lt;/pre&gt;
&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&lt;/span&gt; &lt;/pre&gt;
&lt;/blockquote&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=684" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=VahPLjRd"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=kJmdoWa2"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=kJmdoWa2" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=iERYg5WL"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=iERYg5WL" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/WdArGLLLFXo" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/.Net/default.aspx">.Net</category><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2008/07/02/virtual-property-c-code-snippet.aspx</feedburner:origLink><enclosure url="http://feedproxy.google.com/~r/RyanCromwell/~5/NmMbszTJb7o/propv.snippet" length="909" type="application/xml" /><feedburner:origEnclosureLink>http://cromwellhaus.com/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.00.06.84/propv.snippet</feedburner:origEnclosureLink></item><item><title>Backup Your Site</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/lEtv5PUNDxM/backup-your-site.aspx</link><pubDate>Tue, 01 Jul 2008 17:25:15 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:682</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=682</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=682</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2008/07/01/backup-your-site.aspx#comments</comments><description>&lt;p&gt;So last night I was restructuring my hosting infrastructure (read: moving folders around) and managed to delete the folder that hosts most of my sites.&amp;nbsp; I got that nasty sinking feeling in the pit of my stomach.&amp;nbsp; I was able to get things back up, but my hosting provider, which is normally pretty responsive and helpful, took FOREVER to respond to my restore request.&amp;nbsp; &lt;/p&gt; &lt;p&gt;Immediately after that I set up a scheduled job on my home machine to pull down a rar of the site each night.&amp;nbsp; It&amp;#39;s hard to get good help these days.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=682" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=TyCkuzxh"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=sCRznt2M"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=sCRznt2M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=44miPDwY"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=44miPDwY" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/lEtv5PUNDxM" height="1" width="1"/&gt;</description><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2008/07/01/backup-your-site.aspx</feedburner:origLink></item><item><title>Jing</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/Bi2YplySCfI/jing.aspx</link><pubDate>Tue, 01 Jul 2008 08:29:00 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:683</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=683</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=683</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2008/07/01/jing.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://jing.cromwellhaus.com/2008-07-01_1427.swf"&gt;http://jing.cromwellhaus.com/2008-07-01_1427.swf&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=683" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=B7yBMnxm"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=VqH1anRS"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=VqH1anRS" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=hcKiUe9v"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=hcKiUe9v" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/Bi2YplySCfI" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Software+Reviews/default.aspx">Software Reviews</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2008/07/01/jing.aspx</feedburner:origLink></item><item><title>NHibernate Thinks Your Enum is Dirty</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/oIzqyywk4kc/nhibernate-thinks-your-enum-is-dirty.aspx</link><pubDate>Mon, 30 Jun 2008 17:18:20 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:681</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=681</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=681</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2008/06/30/nhibernate-thinks-your-enum-is-dirty.aspx#comments</comments><description>&lt;p&gt;Get your head out of the gutter.&lt;/p&gt; &lt;p&gt;It&amp;#39;s important to look at your mapping files closely when trying to diagnose unexpected results.&amp;nbsp; One of our developers had recently added two properties to our big honkin&amp;#39; CustomerOrder entity.&amp;nbsp; These both happened to be enumeration values, which are represented by Int values in the database.&amp;nbsp; Of course, NHibernate mapping files (hbm&amp;#39;s) are from the POCO perspective, which means the &amp;lt;property type=&amp;quot;...&amp;quot; /&amp;gt;&amp;nbsp; value should be the Enumeration&amp;#39;s themselves.&amp;nbsp; If you use Int32, though, things will appear to work, but you&amp;#39;re actually causing NHibernate to do an incompatible type comparison during it&amp;#39;s &amp;quot;Dirty&amp;quot; checks.&amp;nbsp; This will cause your lazily, loaded entities to be dirty as soon as you get them.&lt;/p&gt; &lt;p&gt;So, be careful in reviewing your mappings, because it doesn&amp;#39;t take much to screw up something small that has a big impact.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=681" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=Nf4glv8L"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=0p9oyPQo"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=0p9oyPQo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=lWbHHqpd"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=lWbHHqpd" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/oIzqyywk4kc" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/.Net/default.aspx">.Net</category><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/NHibernate/default.aspx">NHibernate</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2008/06/30/nhibernate-thinks-your-enum-is-dirty.aspx</feedburner:origLink></item><item><title>SysPrep Your Virtual PC Images</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/3Q6IecdKoxU/sysprep-your-virtual-pc-images.aspx</link><pubDate>Fri, 13 Jun 2008 18:14:55 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:638</guid><dc:creator>cromwellryan</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=638</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=638</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2008/06/13/sysprep-your-virtual-pc-images.aspx#comments</comments><description>&lt;p&gt;I create a lot of Virtual PC images, be they for demos, testing, or actual work.&amp;nbsp; If you haven&amp;#39;t started using Virtual PC all the time, start.&amp;nbsp; When you do, start syspreping your machines and you&amp;#39;ll save yourself a ton of time and find Virtual PC that much more useful.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.windowsnetworking.com/articles_tutorials/Creating-Sysprep-Image-Library-Virtual-PC.html"&gt;Here&lt;/a&gt; is a step-by-step guide.&amp;nbsp; Run, do it now.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=638" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=6ARiDrff"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=wG7pir6W"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=wG7pir6W" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=j01GPZkA"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=j01GPZkA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/3Q6IecdKoxU" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Virtual+PC/default.aspx">Virtual PC</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2008/06/13/sysprep-your-virtual-pc-images.aspx</feedburner:origLink></item><item><title>MiniMVC for WPF</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/ybW9WI27d4c/minimvc-for-wpf.aspx</link><pubDate>Thu, 24 Apr 2008 03:29:44 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:582</guid><dc:creator>cromwellryan</dc:creator><slash:comments>4</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=582</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=582</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2008/04/24/minimvc-for-wpf.aspx#comments</comments><description>&lt;p&gt;Tonight I presented for the &lt;a href="http://daytondevgroup.net/"&gt;Dayton .Net Developers Group&lt;/a&gt; on WPF.&amp;nbsp; Unlike my previous &lt;a href="http://cromwellhaus.com/blogs/ryanc/archive/2007/09/28/lap-around-wpf-codng.aspx"&gt;Lap Around WPF @ CONDG&lt;/a&gt; which was meant as a beginners guide to WPF, this time we were skipping the basics and plunging into a framework I&amp;#39;ve dubbed MiniMVC.&amp;nbsp; &lt;/p&gt; &lt;p&gt;MiniMVC is, primarily, a set of &lt;a href="http://msdn2.microsoft.com/en-us/library/system.windows.dependencyproperty.aspx"&gt;DependencyProperties&lt;/a&gt; and custom &lt;a href="http://msdn2.microsoft.com/en-us/library/system.windows.input.icommand.aspx"&gt;ICommand&lt;/a&gt;&amp;#39;s which allow you to specify a Controller for any &lt;a href="http://msdn2.microsoft.com/en-us/library/system.windows.frameworkelement.aspx"&gt;FrameworkElement&lt;/a&gt; and/or Action in the &lt;a href="http://msdn2.microsoft.com/en-us/library/ms753391.aspx#logical_tree"&gt;logical tree&lt;/a&gt;.&amp;nbsp; Unlike &lt;a href="http://blogs.msdn.com/dancre/archive/2006/10/11/datamodel-view-viewmodel-pattern-series.aspx"&gt;Dan Crevier&amp;#39;s D-V-VM&lt;/a&gt; pattern or &lt;a href="http://www.codeproject.com/KB/WPF/MVCtoUnitTestinWPF.aspx"&gt;Josh Smith&amp;#39;s MVC pattern&lt;/a&gt; implementations which rely on explicitly defining &lt;a href="http://msdn2.microsoft.com/en-us/library/system.windows.input.routedcommand.aspx"&gt;RoutedCommand&lt;/a&gt;s for each action, &lt;a href="http://msdn2.microsoft.com/en-us/library/ms752308.aspx"&gt;binding them up manually&lt;/a&gt;, and other unpleasantries (in my humble opinion - these guys still know more than I) with this framework you can use any old class, with any old method, and start executing actions immediately.&amp;nbsp; Here&amp;#39;s an example:&lt;/p&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Window &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;Class&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;PostDemo.Window1&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:red;"&gt;xmlns&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:red;"&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;=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:red;"&gt;xmlns&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:red;"&gt;mvc&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;http://cromwellhaus.com/wpf/minimvc&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:red;"&gt;xmlns&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:red;"&gt;demo&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;clr-namespace:PostDemo&amp;quot;&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;mvc&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;MiniMVC.Controller&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;demo&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Window1Controller&lt;/span&gt;&lt;span style="color:blue;"&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;mvc&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;MiniMVC.Controller&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;StackPanel&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;TextBox &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;=&amp;quot;txtMessage&amp;quot;&lt;/span&gt;&lt;span style="color:red;"&gt;Text&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Button&lt;/span&gt;&lt;span style="color:blue;"&gt;&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;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;mvc&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;MiniMVC.Action&lt;/span&gt;&lt;span style="color:blue;"&gt;&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;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;mvc&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ControllerAction &lt;/span&gt;&lt;span style="color:red;"&gt;Trigger&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;Click&amp;quot;&lt;/span&gt;&lt;span style="color:red;"&gt;Action&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;Echo&amp;quot; &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; &lt;/span&gt;&lt;span style="color:red;"&gt;Return&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color:red;"&gt;ElementName&lt;/span&gt;&lt;span style="color:blue;"&gt;=txtResult,&lt;/span&gt;&lt;span style="color:red;"&gt;Path&lt;/span&gt;&lt;span style="color:blue;"&gt;=Text}&amp;quot;&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;mvc&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Parameter&lt;/span&gt;&lt;span style="color:red;"&gt;ParameterName&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;message&amp;quot; &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; &lt;/span&gt;&lt;span style="color:red;"&gt;Value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;{&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color:red;"&gt;ElementName&lt;/span&gt;&lt;span style="color:blue;"&gt;=txtMessage,&lt;/span&gt;&lt;span style="color:red;"&gt;Path&lt;/span&gt;&lt;span style="color:blue;"&gt;=Text}&amp;quot; /&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;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;mvc&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ControllerAction&lt;/span&gt;&lt;span style="color:blue;"&gt;&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;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;mvc&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;MiniMVC.Action&lt;/span&gt;&lt;span style="color:blue;"&gt;&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; &lt;/span&gt;&lt;span style="color:#a31515;"&gt;Write Something&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Button&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;TextBlock &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;=&amp;quot;txtResult&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;StackPanel&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Window&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt; &lt;p&gt;&lt;span style="color:blue;"&gt;&lt;font color="#000000"&gt;Here&amp;#39;s what&amp;#39;s going on: &lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;span style="color:blue;"&gt;&lt;font color="#000000"&gt;First, we have this class, Window1Controller, which we are attaching to the Window&amp;#39;s MiniMVC.Controller property.&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color:blue;"&gt;&lt;font color="#000000"&gt;Second, we are setting the MiniMVC.Action property on the Button to a ControllerAction triggered by the button&amp;#39;s Click event.&amp;nbsp; When &lt;em&gt;Click&lt;/em&gt; occurs the Action to be taken on the Controller is &lt;em&gt;Echo&lt;/em&gt;.&amp;nbsp; We want to pass into Echo the value of the txtMessage TextBox Text value as parameter &lt;em&gt;message&lt;/em&gt;.&amp;nbsp; Also, we&amp;#39;re specifying that the Return value from Echo should be applied to the Text property of the txtResult TextBox controller.&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;span style="color:blue;"&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;&lt;font color="#000000"&gt;Cool?&amp;nbsp; So what&amp;#39;s &lt;em&gt;really&lt;/em&gt; going on?&amp;nbsp; Well, MiniMVC is handling the most importantly the OnChange event handler for the Action DependencyProperty and using that to dynamically create an ICommand class called ActionCommand.&amp;nbsp; It&amp;#39;s also looking up the Click RoutedEvent via Reflection and adding the ActionCommand&amp;#39;s Execute method as the event handler for the located Click RoutedEvent.&amp;nbsp; There is ZERO code in my code-behind.&amp;nbsp; The Designer has free-reign to apply the Controller and action to any RoutedEvent he/she chooses and we can all sleep well knowing our &lt;a href="http://en.wikipedia.org/wiki/Separation_of_concerns"&gt;concerns are separated&lt;/a&gt;.&amp;nbsp; A happy marriage in my book.&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color:blue;"&gt;&lt;font color="#000000"&gt;I must give a lot of credit to &lt;a href="http://devlicio.us/blogs/rob_eisenberg/default.aspx"&gt;Rob Eisenberg&lt;/a&gt;&amp;#39;s super-awesome &lt;a href="http://caliburn.tigris.org/"&gt;Caliburn&lt;/a&gt; project on which much of the Action dependency property is based.&amp;nbsp; His framework is full featured to the tilt, but is a little over done to my liking with the extensive use of Dependency Injection.&amp;nbsp; If you find MiniMVC useful, though, I highly recommend you watch for progress on Caliburn.&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color:blue;"&gt;&lt;font color="#000000"&gt;You can download the full solution, including demo&amp;#39;s, from the presentation, as well as the above example project &lt;a href="http://cromwellhaus.com/files/folders/wpf/entry581.aspx"&gt;here&lt;/a&gt;.&lt;/font&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt; &lt;blockquote&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/blockquote&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=582" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=z9q7AU31"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=QPOsb6zE"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=QPOsb6zE" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=Aa44m824"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=Aa44m824" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/ybW9WI27d4c" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/WPF/default.aspx">WPF</category><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/MVC/default.aspx">MVC</category><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/MiniMVC/default.aspx">MiniMVC</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2008/04/24/minimvc-for-wpf.aspx</feedburner:origLink></item><item><title>Quicky Visual Studio Projects you can Toss to the Curb</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/wJ0b97GCnzk/quicky-visual-studio-projects-ou-can-toss-to-the-curb.aspx</link><pubDate>Fri, 11 Apr 2008 15:16:25 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:565</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=565</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=565</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2008/04/11/quicky-visual-studio-projects-ou-can-toss-to-the-curb.aspx#comments</comments><description>&lt;p&gt;When I&amp;#39;m trying to explain things to people or just want to try something out really quick I&amp;#39;ll often create myself a temporary Visual Studio projects that I don&amp;#39;t intend to keep around.&amp;nbsp; In fact, I have an entire Temp folder full of them.&amp;nbsp; &lt;a href="http://cromwellhaus.com/blogs/ryanc/WindowsLiveWriter/QuickyVisualStudioProjectsoucanTosstothe_9E91/image_2.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="146" alt="image" src="http://cromwellhaus.com/blogs/ryanc/WindowsLiveWriter/QuickyVisualStudioProjectsoucanTosstothe_9E91/image_thumb.png" width="244" align="right" border="0" /&gt;&lt;/a&gt;I always loved that in the VB 6.0 IDE you could choose not to save your project at all and no remnant would exist if you chose not to save.&amp;nbsp; Apparently you can do this in Visual Studio 2005 and 2008.&amp;nbsp;&amp;nbsp; Go into Tools -&amp;gt; Options and select the &lt;em&gt;Projects and Solutions&lt;/em&gt; node.&amp;nbsp; Uncheck &lt;em&gt;Save ne&lt;u&gt;w&lt;/u&gt; projects when created.&lt;/em&gt;&amp;nbsp; &lt;/p&gt; &lt;p&gt;Bingo.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=565" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=vjVULrIJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=xHP695LK"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=xHP695LK" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=sj0jHHEc"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=sj0jHHEc" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/wJ0b97GCnzk" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/.Net/default.aspx">.Net</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2008/04/11/quicky-visual-studio-projects-ou-can-toss-to-the-curb.aspx</feedburner:origLink></item><item><title>Virtual PC and Network Places</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/d38na3jJido/virtual-pc-and-network-places.aspx</link><pubDate>Fri, 21 Mar 2008 14:46:28 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:520</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=520</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=520</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2008/03/21/virtual-pc-and-network-places.aspx#comments</comments><description>&lt;p&gt;I use Virtual PC a lot, especially for development.&amp;nbsp; I try to emulate a mini-infrastructure of how I&amp;#39;ll be deploying my solutions, so no SQL Server on my box, no IIS on my box, etc.&amp;nbsp; To support this I use &lt;a href="http://blogs.msdn.com/virtual_pc_guy/"&gt;Virtual PC Guy&amp;#39;s&lt;/a&gt;&amp;nbsp;&lt;a href="http://blogs.msdn.com/virtual_pc_guy/archive/2005/10/04/477195.aspx"&gt;steps&lt;/a&gt; for enabling communication between my host and the VPC&amp;#39;s.&amp;nbsp; If you are on an Active Directory environment this can have a pretty negative impact on name resolution, specifically when browsing through &amp;quot;My Network Places&amp;quot; (XP) or just &amp;quot;Network&amp;quot; (Vista).&amp;nbsp; &lt;a href="http://cromwellhaus.com/blogs/ryanc/WindowsLiveWriter/VirtualPCandNetworkPlaces_978C/image_4.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="244" alt="image" src="http://cromwellhaus.com/blogs/ryanc/WindowsLiveWriter/VirtualPCandNetworkPlaces_978C/image_thumb_1.png" width="198" align="right" border="0" /&gt;&lt;/a&gt;If you are running into this and it bugs you, go into your Microsoft Loopback Adapter properties and disable/uncheck &amp;quot;Client for Microsoft Networks&amp;quot;.&amp;nbsp; I personally disable everything except Virtual Machine Network Services and IPv4 since this just a small private network running on my computer.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=520" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=WN02UbFt"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=oawXpJOW"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=oawXpJOW" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=hnIlSNZ6"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=hnIlSNZ6" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/d38na3jJido" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Networking/default.aspx">Networking</category><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Virtual+PC/default.aspx">Virtual PC</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2008/03/21/virtual-pc-and-network-places.aspx</feedburner:origLink></item><item><title>So What's Your Windows Experience Score?</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/lxyEaPwuQVw/so-what-s-your-windows-experience-score.aspx</link><pubDate>Fri, 21 Mar 2008 02:13:20 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:519</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=519</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=519</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2008/03/21/so-what-s-your-windows-experience-score.aspx#comments</comments><description>&lt;p&gt;I realize this isn&amp;#39;t the MiniMVC post I promised, but that one is a monster and I wanted to feel like I accomplished something this evening.&lt;/p&gt; &lt;p&gt;&lt;a href="http://cromwellhaus.com/blogphotos/SoWhatsYourWindowsExperienceScore_87C2/image.png"&gt;&lt;img height="168" alt="image" src="http://cromwellhaus.com/blogphotos/SoWhatsYourWindowsExperienceScore_87C2/image_thumb.png" width="240" align="right" border="0" /&gt;&lt;/a&gt;Last week I was forced to replace a dying video card which was a piece-of-junk when I bought it, but, well, I&amp;#39;m cheap.&amp;nbsp; I picked up an &lt;a href="http://www.nvidia.com/object/geforce_8600.html" target="_blank"&gt;NVIDIA GeForce 8600 GT&lt;/a&gt; and while not &lt;em&gt;the&lt;/em&gt; best, it&amp;#39;s more than I&amp;#39;ll need.&amp;nbsp; &lt;/p&gt; &lt;p&gt;When I built this rig, I picked up about the best available at the time.&amp;nbsp; Looking at my latest Windows Experience Score, I&amp;#39;m sort of regretting not picking up the Intel 6800 Core 2 Duo, though it was significantly more expensive than the 6600 I&amp;nbsp; did choose.&amp;nbsp; I guess I can&amp;#39;t fault the decision based on the facts at the time.&amp;nbsp; That said, my &lt;a href="http://www.dell.com/content/products/productdetails.aspx/xpsnb_m1530?c=us&amp;amp;cs=19&amp;amp;l=en&amp;amp;s=dhs&amp;amp;~ck=mn" target="_blank"&gt;Dell M1530&lt;/a&gt; has the 6800 and I swear it&amp;#39;s a friggin&amp;#39; beast.&lt;/p&gt; &lt;p&gt;What&amp;#39;s your score?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=519" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=BBkO43oY"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=MLjpsc6U"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=MLjpsc6U" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=nkRSln2U"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=nkRSln2U" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/lxyEaPwuQVw" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Vista/default.aspx">Vista</category><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Hardware/default.aspx">Hardware</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2008/03/21/so-what-s-your-windows-experience-score.aspx</feedburner:origLink></item><item><title>IIS 7 is so cool</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/QcwA82gTI5Y/iis-7-is-so-cool.aspx</link><pubDate>Fri, 21 Mar 2008 01:33:47 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:518</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=518</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=518</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2008/03/20/iis-7-is-so-cool.aspx#comments</comments><description>&lt;p&gt;I&amp;#39;m so behind on IIS 7 it makes me sad.&amp;nbsp; I love HttpModules and HttpHandlers in ASP.Net (&lt;a href="http://www.speedyrewards.com" target="_blank"&gt;Speedy Rewards&lt;/a&gt; transaction processing is based on one I wrote), but &lt;a href="http://www.hanselman.com/blog/SqueezingTheMostOutOfIIS7MediaBitRateThrottling.aspx" target="_blank"&gt;this&lt;/a&gt; just takes the cake.&lt;/p&gt; &lt;p&gt;Up Next: MiniMVC&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=518" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=4hvYMxhQ"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=HbYYr6k1"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=HbYYr6k1" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=LIrlKnAG"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=LIrlKnAG" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/QcwA82gTI5Y" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/IIS/default.aspx">IIS</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2008/03/20/iis-7-is-so-cool.aspx</feedburner:origLink></item><item><title>New Year Indeed</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/6NHl09Vj1OU/new-year-indeed.aspx</link><pubDate>Tue, 15 Jan 2008 03:19:22 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:490</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=490</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=490</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2008/01/15/new-year-indeed.aspx#comments</comments><description>&lt;p&gt;It has been quite a New Year so far.&amp;nbsp; As of today, Monday January 14th 2008, I have left &lt;a href="http://www.speedway.com/" target="_blank"&gt;Speedway&lt;/a&gt; and the &lt;a href="http://www.speedyrewards.com" target="_blank"&gt;Speedy Rewards™&lt;/a&gt; team and found new employment with &lt;a href="http://www.sds-consulting.com/" target="_blank"&gt;SDS Consulting&lt;/a&gt; and I have new eyes courtesy of &lt;a href="http://www.lasikplus.com/lasik-center/lasik-dayton.asp" target="_blank"&gt;Lasik Plus of Dayton&lt;/a&gt;.&amp;nbsp; I&amp;#39;d say that&amp;#39;s a fairly ambitious first two weeks.&lt;/p&gt; &lt;p&gt;I&amp;#39;m still working on my side project, hoping to have it completed in the next few weeks or so.&amp;nbsp; I lost focus with all the holiday excitement, but I&amp;#39;ve picked back up again.&amp;nbsp; &lt;/p&gt; &lt;p&gt;I&amp;#39;ll also be giving another WPF presentation for the &lt;a href="http://daytondevgroup.net/" target="_blank"&gt;Dayton .Net Developers Group&lt;/a&gt;.&amp;nbsp; This one will be more in-depth than my &lt;a href="http://www.condg.org/" target="_blank"&gt;CONDG&lt;/a&gt; presentation which focused on some of the basics of templates, styles, and binding.&amp;nbsp; One of the big spots in this new version of the presentation will be implementing the MVC pattern within WPF.&amp;nbsp; Very cool.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=490" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=u6pWhHrA"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=DaOMly0e"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=DaOMly0e" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=JhNOtzrv"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=JhNOtzrv" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/6NHl09Vj1OU" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Personal/default.aspx">Personal</category><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/.Net/default.aspx">.Net</category><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/WPF/default.aspx">WPF</category><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/MVC/default.aspx">MVC</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2008/01/15/new-year-indeed.aspx</feedburner:origLink></item><item><title>ASP.Net MVC Checkbox/boolean Value Mapping</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/4Ui-SM7VZ1E/asp-net-mvc-checkbox-boolean-value-mapping.aspx</link><pubDate>Thu, 20 Dec 2007 03:14:38 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:473</guid><dc:creator>cromwellryan</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=473</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=473</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2007/12/20/asp-net-mvc-checkbox-boolean-value-mapping.aspx#comments</comments><description>&lt;p&gt;In my quest to get my &lt;a href="http://wpfstyle.com" target="_blank"&gt;wpfstyle.com&lt;/a&gt; site written in the new &lt;a href="http://asp.net/extensions" target="_blank"&gt;ASP.Net MVC&lt;/a&gt; framework (day 3) I&amp;#39;ve run across a little issue that I&amp;#39;m sure will come up again.&lt;/p&gt; &lt;p&gt;In my world, a checkbox always seemed to imply true/false or yes/no.&amp;nbsp; In reality, it can mean a lot of things in an Html Form.&amp;nbsp; It&amp;#39;s an input, remember, and inputs have a &lt;em&gt;value&lt;/em&gt;.&amp;nbsp; When your checkbox is checked, that value is posted back.&amp;nbsp; &lt;/p&gt; &lt;p&gt;Making it work as a boolean indicator in your MVC application, is possible though.&amp;nbsp; In keeping with the Membership/Authorization theme from &lt;a href="http://cromwellhaus.com/blogs/ryanc/archive/2007/12/19/asp-net-mvc-and-forms-authentication.aspx" target="_blank"&gt;yesterday&lt;/a&gt;, I have the following controller action:&lt;/p&gt; &lt;blockquote&gt;&lt;pre class="code"&gt;&lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; Authenticate(&lt;span&gt;string&lt;/span&gt; userName, &lt;span&gt;string&lt;/span&gt; password, &lt;span&gt;bool&lt;/span&gt;? rememberMe)&lt;/pre&gt;&lt;/blockquote&gt;&lt;pre class="code"&gt;[Hint: Notice the &amp;#39;?&amp;#39; after bool for the third parameter.  That&amp;#39;ll be important in a moment.]&lt;/pre&gt;&lt;pre class="code"&gt;Here is the corresponding Login.aspx View which contains a form posting to this action:&lt;/pre&gt;
&lt;blockquote&gt;&lt;pre class="code"&gt;&lt;span&gt;&amp;lt;%&lt;span&gt;&lt;/span&gt;using&lt;/span&gt; (Html.Form(&lt;span&gt;&amp;quot;Authenticate&amp;quot;&lt;/span&gt;, &lt;span&gt;&amp;quot;Account&amp;quot;&lt;/span&gt;))
  { &lt;span&gt;%&amp;gt;
&lt;/span&gt;    &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt; &lt;span&gt;style&lt;/span&gt;&lt;span&gt;=&amp;quot;&lt;/span&gt;&lt;span&gt;margin&lt;/span&gt;: &lt;span&gt;auto&lt;/span&gt; &lt;span&gt;auto&lt;/span&gt; &lt;span&gt;4px&lt;/span&gt; &lt;span&gt;auto&amp;quot;&amp;gt;&lt;/span&gt;Username 
        &lt;span&gt;&amp;lt;%&lt;span&gt;&lt;/span&gt;=&lt;/span&gt;Html.TextBox( &lt;span&gt;&amp;quot;username&amp;quot;&lt;/span&gt;) &lt;span&gt;%&amp;gt;&lt;/span&gt; &lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&amp;gt;
&lt;/span&gt;    &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt; &lt;span&gt;style&lt;/span&gt;&lt;span&gt;=&amp;quot;&lt;/span&gt;&lt;span&gt;margin&lt;/span&gt;: &lt;span&gt;auto&lt;/span&gt; &lt;span&gt;auto&lt;/span&gt; &lt;span&gt;4px&lt;/span&gt; &lt;span&gt;auto&amp;quot;&amp;gt;&lt;/span&gt;Password &lt;span&gt;&amp;amp;nbsp;
&lt;/span&gt;        &lt;span&gt;&amp;lt;%&lt;span&gt;&lt;/span&gt;=&lt;/span&gt;Html.Password( &lt;span&gt;&amp;quot;password&amp;quot;&lt;/span&gt;) &lt;span&gt;%&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&amp;gt;
&lt;/span&gt;            
    &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt; &lt;span&gt;style&lt;/span&gt;&lt;span&gt;=&amp;quot;&lt;/span&gt;&lt;span&gt;margin&lt;/span&gt;: &lt;span&gt;auto&lt;/span&gt; &lt;span&gt;auto&lt;/span&gt; &lt;span&gt;4px&lt;/span&gt; &lt;span&gt;auto&amp;quot;&amp;gt;
&lt;/span&gt;        &lt;span&gt;&amp;lt;%&lt;span&gt;&lt;/span&gt;=&lt;/span&gt;Html.CheckBox(&lt;span&gt;&amp;quot;rememberme&amp;quot;&lt;/span&gt;, &lt;span&gt;&amp;quot;Remember Me&amp;quot;&lt;/span&gt;, &lt;span&gt;&amp;quot;true&amp;quot;&lt;/span&gt;, &lt;span&gt;false&lt;/span&gt;)&lt;span&gt;%&amp;gt;
&lt;/span&gt;    &lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="code"&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/pre&gt;&lt;pre class="code"&gt;    &lt;span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;lt;%&lt;span&gt;&lt;/span&gt;=&lt;/span&gt;Html.SubmitButton( &lt;span&gt;&amp;quot;Log In&amp;quot;&lt;/span&gt;) &lt;span&gt;%&amp;gt;&lt;span&gt;&lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&amp;gt;
&lt;/span&gt;&lt;span&gt;&amp;lt;%&lt;/span&gt;} &lt;span&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;Looking at our intellisense for Html.Checkbox, we see&lt;a href="http://cromwellhaus.com/blogphotos/ASP.NetMVCCheckboxbooleanValueMapping_138C8/image.png"&gt;&lt;img height="106" alt="image" src="http://cromwellhaus.com/blogphotos/ASP.NetMVCCheckboxbooleanValueMapping_138C8/image_thumb.png" width="640" border="0" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;By setting the checkbox&amp;#39;s value to &amp;quot;true&amp;quot; we&amp;#39;re going to have that value sent back through the MVC pipeline to our Action which has a boolean parameter &lt;em&gt;rememberme&lt;/em&gt;.&amp;nbsp; It&amp;#39;s not just any boolean though, it&amp;#39;s a nullable boolean.&amp;nbsp; Remember when I meantion the distinction that the checkbox being checked causes the value to be posted back?&amp;nbsp; Well if the checkbox is *not* checked, the rememberme value will be null.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;The MVC pipeline is nice enough to implicitly convert the &amp;quot;true&amp;quot; string to a boolean, but null is not necessarily false in all cases.&amp;nbsp; To account for this, we must make our parameter a nullable boolean.&amp;nbsp; Does this maybe cross the line into mixing UI and Controller... eh - possibly?&lt;/p&gt;
&lt;p&gt;(NOTE: If you don&amp;#39;t see the Checkbox method in your intellisense, make sure you picked up and referenced the &lt;a href="http://asp.net/downloads/3.5-extensions/MVCToolkit.zip" target="_blank"&gt;MVC Toolkit&lt;/a&gt;)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=473" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=XCZW3Abn"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=UMUPV2Y7"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=UMUPV2Y7" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=bnwwa5sU"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=bnwwa5sU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/4Ui-SM7VZ1E" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/MVC/default.aspx">MVC</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2007/12/20/asp-net-mvc-checkbox-boolean-value-mapping.aspx</feedburner:origLink></item><item><title>ASP.Net MVC and Forms Authentication</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/UnK4v8Biy5A/asp-net-mvc-and-forms-authentication.aspx</link><pubDate>Wed, 19 Dec 2007 04:15:02 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:469</guid><dc:creator>cromwellryan</dc:creator><slash:comments>14</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=469</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=469</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2007/12/19/asp-net-mvc-and-forms-authentication.aspx#comments</comments><description>&lt;p&gt;So last weekend I picked up the new &lt;a href="http://asp.net/downloads/3.5-extensions/" target="_blank"&gt;ASP.Net 3.5 Extensions Preview CTP&lt;/a&gt; (and &lt;a href="http://asp.net/downloads/3.5-extensions/MVCToolkit.zip" target="_blank"&gt;MVC Toolkit&lt;/a&gt;) from the &lt;a href="http://asp.net/" target="_blank"&gt;ASP.Net&lt;/a&gt; team and I&amp;#39;m loving the MVC bits.&amp;nbsp; I never could get in to &lt;a href="http://www.castleproject.org/monorail/index.html" target="_blank"&gt;MonoRail&lt;/a&gt; mainly because I&amp;#39;m a developer diva.&amp;nbsp; I need intellisense, syntax highlighting, the whole deal.&amp;nbsp; For a CTP, this release packs quite a punch.&lt;/p&gt; &lt;p&gt;After running through Scott Hanselman&amp;#39;s &lt;a href="http://www.hanselman.com/blog/ASPNET35ExtensionsPlusMVCHowToScreencast.aspx" target="_blank"&gt;&lt;em&gt;MVC How-To Screencast&lt;/em&gt;&lt;/a&gt;&lt;em&gt;&amp;nbsp;&lt;/em&gt;and playing around I took to writing a full site I had already 90% completed with Community Server (wpfstyle.com - it&amp;#39;s coming).&amp;nbsp; Blew threw most of the functionality in the first 3 or 4 hours - awesome.&amp;nbsp; Then I tried to add Forms Authentication through the easy ASP.Net Configuration button of VS 2008.&amp;nbsp; Nada.&lt;/p&gt; &lt;p&gt;Long story short, I figured out how to get things working, but there are some manual steps.&amp;nbsp; Here they are:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;strong&gt;&lt;a href="http://cromwellhaus.com/blogphotos/ASP.NetMVCandFormsAuthentication_146AB/image.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="173" alt="image" src="http://cromwellhaus.com/blogphotos/ASP.NetMVCandFormsAuthentication_146AB/image_thumb.png" width="240" align="right" border="0" /&gt;&lt;/a&gt;&lt;/strong&gt;[Step 1]&lt;/strong&gt; Create a new ASP.Net MVC site.&amp;nbsp; I&amp;#39;ve called mine SecureMVCApplication.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;[Step 2] &lt;/strong&gt;Lets add a new controller called SecureController.&amp;nbsp; This will be our set of actions that only administrators can access.&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;a href="http://cromwellhaus.com/blogphotos/ASP.NetMVCandFormsAuthentication_146AB/image_3.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="148" alt="image" src="http://cromwellhaus.com/blogphotos/ASP.NetMVCandFormsAuthentication_146AB/image_thumb_3.png" width="240" align="left" border="0" /&gt;&lt;/a&gt; &lt;strong&gt;[Step 3] &lt;/strong&gt;We don&amp;#39;t need to add any new Actions, the Index action created for us is sufficient, but we will need to do something.&amp;nbsp; So add a call to RenderView(&lt;span&gt;&amp;quot;Index&amp;quot;&lt;/span&gt;) within the Index method.&amp;nbsp; You&amp;#39;ll also need to create the &lt;em&gt;index&lt;/em&gt; view, so add a folder called &lt;em&gt;Secure&lt;/em&gt; under the Views folder already in your project.&amp;nbsp; To this we will need to add a new MVC View Page item.&amp;nbsp; To make it clear, I&amp;#39;ve typed &amp;quot;This is for admin eyes only!!!&amp;quot; as the body of my view.&lt;/p&gt; &lt;p&gt;At this point we should make sure things are working.&amp;nbsp; Hitting F5 should take you to the root of the site, but you could well end up at /Views/Secure/Index.aspx or something like that.&amp;nbsp; Try browsing to &lt;a href="http://localhost:&amp;lt;port&amp;gt;/secure/index"&gt;http://localhost:&amp;lt;port&amp;gt;/secure/index&lt;/a&gt;.&amp;nbsp; You should see the &amp;quot;This is for admin eyes only!!!&amp;quot; text.&amp;nbsp; If not, go watch Scott&amp;#39;s screencast and come back.&lt;/p&gt; &lt;p&gt;&lt;a href="http://cromwellhaus.com/blogphotos/ASP.NetMVCandFormsAuthentication_146AB/image_4.png"&gt;&lt;img height="148" alt="image" src="http://cromwellhaus.com/blogphotos/ASP.NetMVCandFormsAuthentication_146AB/image_thumb_4.png" width="190" align="right" border="0" /&gt;&lt;/a&gt; &lt;strong&gt;[Step 4]&lt;/strong&gt; We&amp;#39;re ready to start securing things.&amp;nbsp; Use the ASP.Net Configuration button to set security to Internet, create a couple of users and at least 1 role called &lt;em&gt;Administrators&lt;/em&gt;.&amp;nbsp; This is for our example, you can call your roles whatever you want in your application.&lt;/p&gt; &lt;p&gt;At this point, you would normally use the &lt;em&gt;Create Access Rules &lt;/em&gt;link to specify the Adminstrators role has access to the secure directory.&amp;nbsp; Instead, we have to do this bit ourselves, because the MVC pattern will present us with a URL structure that does not map to physical directories.&amp;nbsp; At least, probably won&amp;#39;t.&amp;nbsp; In a normal site, the ASP.Net Configuration tool would add a web.config to each configured directory that specifies the authorization rules.&amp;nbsp; This brings us to the next step:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;[Step 5]&lt;/strong&gt; Open your projects root web.config and add the following: &lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&amp;lt;location path=&amp;quot;secure&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;system.web&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;authorization&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;allow roles=&amp;quot;Adminstrators&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;deny users=&amp;quot;*&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/authorization&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/system.web&amp;gt;&lt;br /&gt;&amp;lt;/location&amp;gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Assuming you are familiar with MVC URLs this is telling us that the &lt;a href="http://&amp;lt;site&amp;gt;/secure"&gt;http://&amp;lt;site&amp;gt;/secure&lt;/a&gt; path should allow access to users in the Adminstrators role and deny everyone else.&amp;nbsp; /secure is, of course, the controller.&amp;nbsp; Had this been a standard site, the stuff inside the &amp;lt;location /&amp;gt; element would have been found inside our secure\web.config.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;[Step 5]&lt;/strong&gt; We are now ready to authenticate our users, but we don&amp;#39;t have a normal login.aspx.&amp;nbsp; Instead, we&amp;#39;re going to create a controller called &lt;em&gt;UserController&lt;/em&gt; and add a Login and Authenticate action.&amp;nbsp; Here&amp;#39;s what I&amp;#39;ve added to my sample:&lt;/p&gt; &lt;blockquote&gt;&lt;pre class="code"&gt;&lt;span&gt;namespace&lt;/span&gt; SecureMvcApplication.Controllers
{
    &lt;span&gt;public&lt;/span&gt; &lt;span&gt;class&lt;/span&gt; &lt;span&gt;UserController&lt;/span&gt; : System.Web.Mvc.&lt;span&gt;Controller
&lt;/span&gt;    {
        [System.Web.Mvc.&lt;span&gt;ControllerAction&lt;/span&gt;]
        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; Login()
        {
            RenderView(&lt;span&gt;&amp;quot;Login&amp;quot;&lt;/span&gt;);
        }

        [System.Web.Mvc.&lt;span&gt;ControllerAction&lt;/span&gt;]
        &lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; Authenticate(&lt;span&gt;string&lt;/span&gt; username, &lt;span&gt;string&lt;/span&gt; password)
        {
            &lt;span&gt;if&lt;/span&gt; (System.Web.Security.&lt;span&gt;Membership&lt;/span&gt;.ValidateUser(username, password))
            {
                System.Web.Security.&lt;span&gt;FormsAuthentication&lt;/span&gt;.RedirectFromLoginPage(username, &lt;span&gt;false&lt;/span&gt;);
            }
        }
    }
}&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;Notice that my Login action is simply displaying a view.&amp;nbsp; This view has two textboxes (one marked password) and a submit button.&amp;nbsp; If you watch(ed) Scott&amp;#39;s &lt;a href="http://www.hanselman.com/blog/ASPNET35ExtensionsPlusMVCHowToScreencast.aspx" target="_blank"&gt;Screencast&lt;/a&gt;, I&amp;#39;ve used the &lt;a title="http://asp.net/downloads/3.5-extensions/MVCToolkit.zip" href="http://asp.net/downloads/3.5-extensions/MVCToolkit.zip"&gt;http://asp.net/downloads/3.5-extensions/MVCToolkit.zip&lt;/a&gt; to do this.&amp;nbsp; The form itself looks like this:&lt;/p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;blockquote&gt;&lt;pre class="code"&gt;&lt;span&gt;&amp;lt;%&lt;span&gt;&lt;/span&gt;using&lt;/span&gt; (Html.Form(&lt;span&gt;&amp;quot;Authenticate&lt;span&gt;?ReturnUrl=&amp;quot;&lt;/span&gt; + &lt;span&gt;this&lt;/span&gt;.Request[&lt;span&gt;&amp;quot;ReturnUrl&amp;quot;&lt;/span&gt;]&lt;/span&gt;, &lt;span&gt;&amp;quot;User&amp;quot;&lt;/span&gt;))
  {&lt;span&gt;%&amp;gt;
&lt;/span&gt;    &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;Username: &lt;span&gt;&amp;lt;%&lt;span&gt;&lt;/span&gt;=&lt;/span&gt;Html.TextBox(&lt;span&gt;&amp;quot;username&amp;quot;&lt;/span&gt;) &lt;span&gt;%&amp;gt;&lt;span&gt;&lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&amp;gt;
&lt;/span&gt;    &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;Password: &lt;span&gt;&amp;lt;%&lt;span&gt;&lt;/span&gt;=&lt;/span&gt;Html.Password(&lt;span&gt;&amp;quot;password&amp;quot;&lt;/span&gt;) &lt;span&gt;%&amp;gt;&lt;span&gt;&lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&amp;gt;
&lt;/span&gt;    &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;lt;%&lt;span&gt;&lt;/span&gt;=&lt;/span&gt;Html.SubmitButton(&lt;span&gt;&amp;quot;Login&amp;quot;&lt;/span&gt;) &lt;span&gt;%&amp;gt;&lt;span&gt;&lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&amp;gt;
&lt;/span&gt;&lt;span&gt;&amp;lt;%&lt;/span&gt;} &lt;span&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;Upon Submit/Login, we&amp;#39;re POSTing to the &lt;em&gt;Authenticate( string, string )&lt;/em&gt; Action in our UserController which implements the basic Forms Authentication (above).&amp;nbsp; The next step is optional, but it helped me watch the authorization status.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[Step 6]&lt;/strong&gt; (Optional)&amp;nbsp; Add this to your global.asax.cs to see the authorization status of your requests..&lt;/p&gt;
&lt;blockquote&gt;&lt;pre class="code"&gt;&lt;span&gt;protected&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; Application_AuthenticateRequest(&lt;span&gt;object&lt;/span&gt; sender, &lt;span&gt;EventArgs&lt;/span&gt; e)
{
    &lt;span&gt;HttpCookie&lt;/span&gt; authCookie = Context.Request.Cookies[&lt;span&gt;FormsAuthentication&lt;/span&gt;.FormsCookieName];

    &lt;span&gt;if&lt;/span&gt; (&lt;span&gt;null&lt;/span&gt; == authCookie)
    {&lt;span&gt;//There is no authentication cookie.
&lt;/span&gt;        &lt;span&gt;Debug&lt;/span&gt;.WriteLine(&lt;span&gt;&amp;quot;Don&amp;#39;t know you, dude.&amp;quot;&lt;/span&gt;);
    }
    &lt;span&gt;else
&lt;/span&gt;        &lt;span&gt;Debug&lt;/span&gt;.WriteLine(&lt;span&gt;&amp;quot;Enjoy the party!&amp;quot;&lt;/span&gt;);
}&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;Now F5 and browse to &lt;a href="http://localhost:&amp;lt;port&amp;gt;/secure/index"&gt;http://localhost:&amp;lt;port&amp;gt;/secure/index&lt;/a&gt; and you should be taken to the &lt;a href="http://localhost:&amp;lt;port&amp;gt;/user/login"&gt;http://localhost:&amp;lt;port&amp;gt;/user/login&lt;/a&gt; page.&amp;nbsp; Upon hitting login, you&amp;#39;re directed back to the root of the site.&amp;nbsp; In our form, we had to manually set the ReturnUrl, because Forms Authentication assumes you will be posting back to yourself (classic ASP.Net Web Form).&amp;nbsp; We&amp;#39;re posting across to the Authenticate action Url.&lt;/p&gt;
&lt;p&gt;You can download the completed VS 2008 project I used &lt;a href="http://cromwellhaus.com/files/folders/netcode/entry468.aspx" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Can you believe we&amp;#39;re already calling ASP.Net Web Forms &amp;quot;classic&amp;quot;?&amp;nbsp; Now we need to get MVC into the WPF platform.&amp;nbsp; How cool would that be!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=469" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=UbOR6lqM"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=hDKQxu5T"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=hDKQxu5T" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=MXEfBoFZ"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=MXEfBoFZ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/UnK4v8Biy5A" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/.Net/default.aspx">.Net</category><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/MVC/default.aspx">MVC</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2007/12/19/asp-net-mvc-and-forms-authentication.aspx</feedburner:origLink></item><item><title>NHibernate Query Generator Installer for Visual Studio 2008</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/ZSZyIbx392w/nhibernate-query-generator-installer-for-visual-studio-2008.aspx</link><pubDate>Fri, 07 Dec 2007 04:45:03 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:439</guid><dc:creator>cromwellryan</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=439</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=439</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2007/12/07/nhibernate-query-generator-installer-for-visual-studio-2008.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://cromwellhaus.com/blogphotos/NHibernateQueryGeneratorInstallerforVisu_14E01/image_3.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="235" alt="image" src="http://cromwellhaus.com/blogphotos/NHibernateQueryGeneratorInstallerforVisu_14E01/image_thumb_3.png" width="240" align="right" border="0" /&gt;&lt;/a&gt;I &lt;a href="http://cromwellhaus.com/blogs/ryanc/archive/2007/11/19/nhibernate-query-generator-with-visual-studio-2008.aspx" target="_blank"&gt;posted recently&lt;/a&gt; a manual .reg file for adding the NHibernate Query Generator custom tool to Visual Studio 2008.&amp;nbsp; I just sent &lt;a href="http://ayende.com/" target="_blank"&gt;Ayende&lt;/a&gt; an update to the .Setup Product.wxs, a &lt;a href="http://sourceforge.net/projects/wix/" target="_blank"&gt;WiX&lt;/a&gt; file, which adds a new fixture specifically for 2008.&amp;nbsp; &lt;/p&gt; &lt;p&gt;If you are interested in building the installer and running the trunk of NHQG, below is my batch script.&amp;nbsp; Obviously, you&amp;#39;ll have to change a couple of paths, but it should get you started.&amp;nbsp; &lt;/p&gt; &lt;p&gt;You can download the Product.wxs pending Ayende approving the new Product.wxs file &lt;a href="http://cromwellhaus.com/files/folders/nh/entry438.aspx" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Consolas"&gt;echo Off&lt;br /&gt;set path=%path%;c:\tools\svn-win32-1.4.4\bin &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Consolas"&gt;echo get Trunk (Non-Recursive)...&lt;br /&gt;svn co &lt;/font&gt;&lt;a href="https://rhino-tools.svn.sourceforge.net/svnroot/rhino-tools/trunk"&gt;&lt;font face="Consolas"&gt;https://rhino-tools.svn.sourceforge.net/svnroot/rhino-tools/trunk&lt;/font&gt;&lt;/a&gt;&lt;font face="Consolas"&gt; trunk -q -N&lt;br /&gt;echo done &lt;/font&gt; &lt;p&gt;&lt;font face="Consolas"&gt;echo get Art...&lt;br /&gt;svn co &lt;/font&gt;&lt;a href="https://rhino-tools.svn.sourceforge.net/svnroot/rhino-tools/trunk/Art"&gt;&lt;font face="Consolas"&gt;https://rhino-tools.svn.sourceforge.net/svnroot/rhino-tools/trunk/Art&lt;/font&gt;&lt;/a&gt;&lt;font face="Consolas"&gt; trunk/Art -q&lt;br /&gt;echo done &lt;/font&gt; &lt;p&gt;&lt;font face="Consolas"&gt;echo get SharedLibs...&lt;br /&gt;svn co &lt;/font&gt;&lt;a href="https://rhino-tools.svn.sourceforge.net/svnroot/rhino-tools/trunk/SharedLibs"&gt;&lt;font face="Consolas"&gt;https://rhino-tools.svn.sourceforge.net/svnroot/rhino-tools/trunk/SharedLibs&lt;/font&gt;&lt;/a&gt;&lt;font face="Consolas"&gt; trunk/SharedLibs -q&lt;br /&gt;echo done &lt;/font&gt; &lt;p&gt;&lt;font face="Consolas"&gt;echo get NHQG...&lt;br /&gt;svn co &lt;/font&gt;&lt;a href="https://rhino-tools.svn.sourceforge.net/svnroot/rhino-tools/trunk/NHibernate.Query.Generator"&gt;&lt;font face="Consolas"&gt;https://rhino-tools.svn.sourceforge.net/svnroot/rhino-tools/trunk/NHibernate.Query.Generator&lt;/font&gt;&lt;/a&gt;&lt;font face="Consolas"&gt; trunk/NHibernate.Query.Generator -q&lt;br /&gt;echo done &lt;/font&gt; &lt;p&gt;&lt;font face="Consolas"&gt;echo build NHQG...&lt;br /&gt;pushd .&lt;br /&gt;cd trunk\NHibernate.Query.Generator&lt;br /&gt;%windir%\Microsoft.NET\Framework64\v2.0.50727\msbuild.exe default.build &lt;br /&gt;echo done &lt;/font&gt; &lt;p&gt;&lt;font face="Consolas"&gt;echo build Installer&lt;br /&gt;cd NHibernate.Query.Generator.Setup&lt;br /&gt;%windir%\Microsoft.NET\Framework\v2.0.50727\msbuild.exe Setup.wixproj &lt;br /&gt;echo done&lt;br /&gt;popd&lt;br /&gt;PAUSE&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=439" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=mqfXqRhe"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=7J6AYIox"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=7J6AYIox" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=ldLQWRyl"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=ldLQWRyl" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/ZSZyIbx392w" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/.Net/default.aspx">.Net</category><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/NHibernate/default.aspx">NHibernate</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2007/12/07/nhibernate-query-generator-installer-for-visual-studio-2008.aspx</feedburner:origLink></item><item><title>NHibernate Query Generator with Visual Studio 2008</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/yLz7CBrXXz8/nhibernate-query-generator-with-visual-studio-2008.aspx</link><pubDate>Mon, 19 Nov 2007 16:31:00 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:387</guid><dc:creator>cromwellryan</dc:creator><slash:comments>8</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=387</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=387</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2007/11/19/nhibernate-query-generator-with-visual-studio-2008.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://cromwellhaus.com/blogs/ryanc/WindowsLiveWriter/NHibernateQueryGeneratorwithVisualStudio_9F3F/image_1.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="202" alt="Custom Tool Configuration" src="http://cromwellhaus.com/blogs/ryanc/WindowsLiveWriter/NHibernateQueryGeneratorwithVisualStudio_9F3F/image_thumb_1.png" width="240" align="right" border="0" /&gt;&lt;/a&gt; I&amp;#39;ve been using &lt;a href="http://www.ayende.com/Blog/"&gt;Ayende&amp;#39;s&lt;/a&gt; &lt;a href="http://ayende.com/projects/downloads/nhibernate-query-generator.aspx"&gt;NHibernate Query Generator&lt;/a&gt; (NHQG) to help type-ify my NHibernate repository queries.&amp;nbsp; One of the great +1&amp;#39;s of his tool is that you can apply it as a &lt;a href="http://msdn.microsoft.com/msdnmag/issues/02/10/NETTopTen/#S9"&gt;Custom Tool&lt;/a&gt; for your NHibernate mapping files right within Visual Studio.&amp;nbsp;&amp;nbsp; &lt;/p&gt; &lt;p&gt;With this setup, every change to my mapping file is reflected in my typed NHibernate ICriteria instances.&amp;nbsp; For those who work directly with Hibernate Expressions, look how clean my queries are:&lt;/p&gt; &lt;blockquote&gt;&lt;pre class="code"&gt;&lt;span&gt;// Get it using the Id&lt;br /&gt;&lt;/span&gt;&lt;span&gt;public&lt;/span&gt; &lt;span&gt;static&lt;/span&gt; &lt;span&gt;MyClass&lt;/span&gt; GetById(&lt;span&gt;long&lt;/span&gt; id)&lt;br /&gt;{&lt;br /&gt;    &lt;span&gt;return&lt;/span&gt; &lt;span&gt;Repository&lt;/span&gt;.Get&amp;lt;&lt;span&gt;&lt;span&gt;MyClass&lt;/span&gt;&lt;/span&gt;&amp;gt;(&lt;span&gt;Where&lt;/span&gt;.MyClass.Id == id);&lt;br /&gt;}&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;pre class="code"&gt;&lt;span&gt;// Get those updated today&lt;br /&gt;&lt;/span&gt;&lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; Example2()&lt;br /&gt;{&lt;br /&gt;    &lt;span&gt;IList&lt;/span&gt;&amp;lt;&lt;span&gt;&lt;span&gt;MyClass&lt;/span&gt;&lt;/span&gt;&amp;gt; cards = &lt;span&gt;Repository&lt;/span&gt;.Find&amp;lt;&lt;span&gt;&lt;span&gt;MyClass&lt;/span&gt;&lt;/span&gt;&amp;gt;(&lt;span&gt;Where&lt;/span&gt;.MyClass.LastUpdated &amp;gt;= &lt;span&gt;DateTime&lt;/span&gt;.Today);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/blockquote&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;That&amp;#39;s just awesome!&lt;/p&gt;
&lt;p&gt;There&amp;#39;s a slight glitch though, his installer only registers the tool for Visual Studio 2005.&amp;nbsp; I&amp;#39;m sure now that 2008 is RTM (I&amp;#39;ve been using Beta 2) he&amp;#39;ll soon have a new version out, but in the mean time, you can use these two .reg files:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://cromwellhaus.com/files/folders/software/entry385.aspx"&gt;NHQG C# Custom Tool Registration&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://cromwellhaus.com/files/folders/software/entry386.aspx"&gt;NHQG VB Custom Tool Registration&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=387" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=hkgRf3R5"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=ILn9fhwj"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=ILn9fhwj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=gji2OjuC"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=gji2OjuC" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/yLz7CBrXXz8" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/NHibernate/default.aspx">NHibernate</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2007/11/19/nhibernate-query-generator-with-visual-studio-2008.aspx</feedburner:origLink></item><item><title>Strangest Support Call... EVER</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/zhS5DDxc3OI/strangest-support-call-ever.aspx</link><pubDate>Sat, 03 Nov 2007 14:52:36 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:352</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=352</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=352</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2007/11/03/strangest-support-call-ever.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://cromwellhaus.com/blogphotos/StrangestSupportCall.EVER_9906/SRCard.png"&gt;&lt;img height="240" alt="SRCard" src="http://cromwellhaus.com/blogphotos/StrangestSupportCall.EVER_9906/SRCard_thumb.png" width="169" align="right" border="0" /&gt;&lt;/a&gt;Here at &lt;a href="http://www.speedway.com"&gt;Speedway&lt;/a&gt;&amp;nbsp;our &lt;a href="http://www.speedway.com/speedyrewards"&gt;Speedy Rewards&lt;/a&gt;&amp;nbsp;team rotates a support phone for any serious problems.&amp;nbsp; Usually it&amp;#39;s an &lt;a href="http://cromwellhaus.com/blogs/ryanc/archive/2007/03/27/bringing-down-an-oracle-9i-on-windows-instance.aspx"&gt;Oracle Split-Brain&lt;/a&gt;, though we have that under &lt;em&gt;some&lt;/em&gt; control.&amp;nbsp; Today it was a little different.&amp;nbsp; I received a call from one of our business clients asking for help in looking up a customer&amp;#39;s information and needed some help.&amp;nbsp; Didn&amp;#39;t seem a Level 3 support, urgent matter, but whatever.&amp;nbsp; Turns out there is a deceased individual somewhere in a bordering state and all he had on him was our Speedy Rewards card.&amp;nbsp; The police had contacted our office for help.&lt;/p&gt; &lt;p&gt;Just another reason never to leave home without your card.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=352" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=OI0LNiSe"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=G4JZMwnY"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=G4JZMwnY" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=6DcMZjoo"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=6DcMZjoo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/zhS5DDxc3OI" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Speedy+Rewards/default.aspx">Speedy Rewards</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2007/11/03/strangest-support-call-ever.aspx</feedburner:origLink></item><item><title>PerformanceHelper.cs Update: Perfmon, Console, and Debug Output options</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/kKFtTuxlRH8/performancehelper-cs-update-perfmon-console-and-debug-output-options.aspx</link><pubDate>Sat, 27 Oct 2007 00:36:59 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:329</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=329</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=329</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2007/10/26/performancehelper-cs-update-perfmon-console-and-debug-output-options.aspx#comments</comments><description>&lt;p&gt;I&amp;#39;ve updated my &lt;a href="http://cromwellhaus.com/files/folders/netcode/entry172.aspx"&gt;PerformanceHelper&lt;/a&gt;&amp;nbsp;class that I&amp;#39;ll throw around certain code blocks to help trend or monitor performance.&amp;nbsp; Before it was merely a &lt;a href="http://msdn2.microsoft.com/en-us/library/system.diagnostics.performancecounter.aspx"&gt;PerformanceCounter&lt;/a&gt;&amp;nbsp;wrapper with a few metrics, but now you can specify Console, Debug and/or Perfmon.&amp;nbsp; You do this by using an XOR (&amp;nbsp;&amp;#39;|&amp;#39; ) in a new Constructor.&amp;nbsp; Here&amp;#39;s an example which outputs to Debug.WriteLine and PerfMon:&lt;/p&gt; &lt;blockquote&gt;&lt;pre class="code"&gt;&lt;span&gt;for&lt;/span&gt; (&lt;span&gt;int&lt;/span&gt; index = 0; index &amp;lt; 10; index++)
{
    &lt;span&gt;using&lt;/span&gt; (&lt;span&gt;new&lt;/span&gt; &lt;span&gt;PerformanceHelper&lt;/span&gt;(&lt;span&gt;&amp;quot;ConsoleSample&amp;quot;&lt;/span&gt;,
        &lt;span&gt;&amp;quot;Perfmon Sample&amp;quot;&lt;/span&gt;, &lt;span&gt;OutputOptions&lt;/span&gt;.Debug | &lt;span&gt;OutputOptions&lt;/span&gt;.Perfmon))
    {
        &lt;span&gt;Thread&lt;/span&gt;.Sleep(500);
    }
}&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;The method that does the Output to Console and Debug is marked&amp;nbsp;as [&lt;span&gt;Conditional&lt;/span&gt;(&lt;span&gt;&amp;quot;DEBUG&amp;quot;&lt;/span&gt;)], because you really should have a better strategy for performance monitoring in production and you don&amp;#39;t want that hit for each block that you wrapped. &lt;/p&gt;
&lt;p&gt;Note to Vista Developers:&amp;nbsp; You will have problems creating custom performance counters at runtime based on registry access.&amp;nbsp; To support this in a client based app, you will need to specify an application manifest and mark it with the following: &amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;&lt;pre class="code"&gt;&lt;span&gt;&amp;lt;requestedExecutionLevel  level=&amp;quot;requireAdministrator&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;For more information on application manifests, &lt;a href="http://blogs.msdn.com/knom/archive/2007/06/11/vista-user-account-control-with-net.aspx"&gt;read this&lt;/a&gt;.&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=329" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=UwesHOnp"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=zVI8FSU3"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=zVI8FSU3" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=wA6ZZKfI"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=wA6ZZKfI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/kKFtTuxlRH8" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/.Net/default.aspx">.Net</category><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Performance/default.aspx">Performance</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2007/10/26/performancehelper-cs-update-perfmon-console-and-debug-output-options.aspx</feedburner:origLink></item><item><title>WPF Controls TabIndex: Moving to the First Input Control</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/mD6_ONwRsLs/wpf-controls-tabindex-moving-to-the-first-input-control.aspx</link><pubDate>Thu, 25 Oct 2007 03:07:58 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:328</guid><dc:creator>cromwellryan</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=328</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=328</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2007/10/25/wpf-controls-tabindex-moving-to-the-first-input-control.aspx#comments</comments><description>&lt;p&gt;Here&amp;#39;s one of those real-world situations that no one bothers to demo.&amp;nbsp; If you are building a form or have some sort of input your gathering from the user, you&amp;#39;ll likely want the first input control Focused initially.&amp;nbsp; You have a few ways to do this (in ascending order of recommendation):&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Call Focus() on the first control explicitly (meh).  &lt;li&gt;Iterate the controls collection and find the&amp;nbsp;lowest&amp;nbsp;TabIndex&amp;nbsp;(terrible &lt;a href="http://en.wikipedia.org/wiki/Code_smell"&gt;code smell&lt;/a&gt;).  &lt;li&gt;Do the following in the Load event:&lt;/li&gt;&lt;/ol&gt; &lt;blockquote&gt;&lt;pre class="code"&gt;&lt;span&gt;this&lt;/span&gt;.MoveFocus(&lt;span&gt;new&lt;/span&gt; &lt;span&gt;TraversalRequest&lt;/span&gt;(&lt;span&gt;FocusNavigationDirection&lt;/span&gt;.Next));&lt;/pre&gt;&lt;/blockquote&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=328" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=gKUHegTg"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=DQpqsiPi"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=DQpqsiPi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=WF1yacxm"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=WF1yacxm" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/mD6_ONwRsLs" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/.Net/default.aspx">.Net</category><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/WPF/default.aspx">WPF</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2007/10/25/wpf-controls-tabindex-moving-to-the-first-input-control.aspx</feedburner:origLink></item><item><title>Lap Around WPF @ CONDG</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/gXqTagwoZYY/lap-around-wpf-codng.aspx</link><pubDate>Fri, 28 Sep 2007 13:23:53 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:321</guid><dc:creator>cromwellryan</dc:creator><slash:comments>3</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=321</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=321</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2007/09/28/lap-around-wpf-codng.aspx#comments</comments><description>&lt;p&gt;This evening the &lt;a href="http://cromwellhaus.com/controlpanel/blogs/condg.org"&gt;Central Ohio .NET Developers Group&lt;/a&gt; was nice enough to let me present on WPF.&amp;nbsp; Everything went fairly well, though it was more a test of my efficiency in WPF development than I had planned; I managed to leave behind the external hard drive that had my code-snippets, slides (both of them), and project template.&amp;nbsp; So we went from nothing to code-kinda-complete in about an 1 hour and 45 minutes.&amp;nbsp; &lt;/p&gt; &lt;p&gt;I was very happy with the number of questions and that at least a few people stayed behind to talk afterwards.&amp;nbsp; If &lt;a href="http://frazzleddad.com/"&gt;Jim&lt;/a&gt; has an opening, I am hoping to give the same presentation again here in &lt;a href="http://daytondevgroup.net/default.aspx"&gt;Dayton&lt;/a&gt;&amp;nbsp;(hint, hint).&amp;nbsp; &lt;/p&gt; &lt;p&gt;For those that are interested I&amp;#39;ve posted the Demo project, &lt;a href="http://cromwellhaus.com/files/folders/wpf/entry320.aspx"&gt;Time Machine&lt;/a&gt;, for your general amusement.&amp;nbsp; If there are any questions or comments regarding the presentation or the demo, feel free to post them and I&amp;#39;ll do my best to answer them.&lt;/p&gt; &lt;p&gt;Thanks to everyone who showed up and for all your questions.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=321" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=XdSUlPbp"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=vDHzc654"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=vDHzc654" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=LZUzY4WJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=LZUzY4WJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/gXqTagwoZYY" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/.Net/default.aspx">.Net</category><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/WPF/default.aspx">WPF</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2007/09/28/lap-around-wpf-codng.aspx</feedburner:origLink></item><item><title>Awesome Tool of the Day: WorkRave</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/c-8TF6DmMM4/awesome-tool-of-the-day-workrave.aspx</link><pubDate>Wed, 26 Sep 2007 19:33:48 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:317</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=317</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=317</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2007/09/26/awesome-tool-of-the-day-workrave.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://cromwellhaus.com/blogs/ryanc/WindowsLiveWriter/AwesomeTooloftheDayWorkRave_7CDF/sshot-2.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="130" alt="Countdown to Micro-break, Rest-break, and get-out-of-there-break." src="http://cromwellhaus.com/blogs/ryanc/WindowsLiveWriter/AwesomeTooloftheDayWorkRave_7CDF/sshot-2_thumb.png" width="113" align="right" border="0" /&gt;&lt;/a&gt;I found this tool about 5 years ago and then lost it during a job move.&amp;nbsp; I&amp;#39;ve been looking for it ever since and finally found it through &lt;a href="http://cromwellhaus.com/blogs/ryanc/archive/2007/08/01/awesome-tool-of-the-day-stumbleupon-firefox-add-on.aspx"&gt;StumbleUpon&lt;/a&gt;&amp;nbsp;today.&amp;nbsp;&amp;nbsp;Most will find it a little annoying and kind of stupid, but it was great when I stuck with it.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.workrave.org/"&gt;WorkRave&lt;/a&gt;&amp;nbsp;is a little&amp;nbsp;status tray application that tells you when to take a break, gives you exercises to do, and locks your computer so you do them.&amp;nbsp; These aren&amp;#39;t &amp;quot;Pump you up!&amp;quot; exercises, but instead blink every-once-in-a-while, keep-your-body-from-atrophy exercises.&lt;/p&gt; &lt;p&gt;&lt;a href="http://cromwellhaus.com/blogs/ryanc/WindowsLiveWriter/AwesomeTooloftheDayWorkRave_7CDF/sshot-1.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="155" alt="One of many exercises presented during a rest break." src="http://cromwellhaus.com/blogs/ryanc/WindowsLiveWriter/AwesomeTooloftheDayWorkRave_7CDF/sshot-1_thumb.png" width="240" align="left" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;You might feel&amp;nbsp;like your doing less&amp;nbsp;at first, but I guarantee you&amp;#39;ll feel much better throughout the day and, in the end, be more productive.&amp;nbsp; Over time, I learned to do some of these things on my own, but this is just a gentle tap on the shoulder.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=317" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=GxOumNtt"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=gRvv7ti5"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=gRvv7ti5" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=QTvbMnQ6"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=QTvbMnQ6" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/c-8TF6DmMM4" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Software+Reviews/default.aspx">Software Reviews</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2007/09/26/awesome-tool-of-the-day-workrave.aspx</feedburner:origLink></item><item><title>Visual Studio 2008 Beta 2, Team Explorer, and Codeplex</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/3vF50uqChYk/visual-studio-2008-beta-2-team-explorer-and-codeplex.aspx</link><pubDate>Wed, 08 Aug 2007 03:21:23 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:225</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=225</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=225</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2007/08/08/visual-studio-2008-beta-2-team-explorer-and-codeplex.aspx#comments</comments><description>&lt;p&gt;If you happen to use &lt;a href="http://www.codeplex.com/"&gt;CodePlex&lt;/a&gt; as I do, I hope you found &lt;a href="http://www.codeplex.com/CodePlex/Wiki/View.aspx?title=Source%20control%20clients&amp;amp;referringTitle=CodePlex%20Help%20Wiki"&gt;Team Explorer for Visual Studio 2005&lt;/a&gt; to be a huge productivity boost.&amp;nbsp; With Visual Studio 2008 it wasn&amp;#39;t entirely obvious to me how to replicate this setup.&amp;nbsp; It turns out that Team Explorer can be installed individually from the &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=053E83D0-DEB4-4EBB-B4C8-CBFFE928B4AA&amp;amp;displaylang=en"&gt;Visual Studio Team Foundation Server 2008 Beta 2&lt;/a&gt; (what a mouthful) installer without all the extra gunk.&amp;nbsp; I figured this out when I noticed the Team Explorer for 2005 installer had a graphic for Team Foundation Server.&amp;nbsp; &lt;/p&gt; &lt;p&gt;So go grab the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=9a927cf6-16e4-4e21-9608-77f06d2156bb&amp;amp;displaylang=en"&gt;Microsoft Secure Content Downloader&lt;/a&gt;&amp;nbsp;and its a ridiculously quick 1.5gb download - about 45 minutes over my Timewarner cable connection.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=225" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=yQaszpl8"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=vPXKGfoX"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=vPXKGfoX" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=e9IQRtJu"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=e9IQRtJu" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/3vF50uqChYk" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/.Net/default.aspx">.Net</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2007/08/08/visual-studio-2008-beta-2-team-explorer-and-codeplex.aspx</feedburner:origLink></item><item><title>Exporting Adobe Illustrator resources to WPF</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/bUdHJNcOo9s/exporting-adobe-illustrator-resources-to-wpf.aspx</link><pubDate>Fri, 03 Aug 2007 14:52:49 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:222</guid><dc:creator>cromwellryan</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=222</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=222</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2007/08/03/exporting-adobe-illustrator-resources-to-wpf.aspx#comments</comments><description>&lt;p&gt;There are a lot of sites out there with great vector resources provided in &lt;a href="http://www.adobe.com/products/illustrator/"&gt;Adobe Illustrator&lt;/a&gt; files.&amp;nbsp; A few have taken a stab at creating exporters or converts, including &lt;a href="http://www.mikeswanson.com/xamlexport/"&gt;Mike Swanson&lt;/a&gt;&amp;nbsp;and a &lt;a href="http://www.codeplex.com"&gt;CodePlex.com&lt;/a&gt; project called &lt;a href="http://www.codeplex.com/xamlxporter"&gt;XamlXporter&lt;/a&gt;.&amp;nbsp; &lt;/p&gt; &lt;p&gt;I tried out Mike&amp;#39;s XamlExport plugin and it worked fairly well, but he has some &lt;a href="http://www.mikeswanson.com/xamlexport/Eye%20Candy.htm"&gt;well documented&lt;/a&gt; items that aren&amp;#39;t supported which seem to be pretty common in the AI world.&amp;nbsp; This lead me to try the XamlXporter which was built for Illustrator C2.&amp;nbsp; C3 is the latest version and I&amp;#39;m using the 30-day trial.&amp;nbsp; XamlXporter uses the Illustrator COM Type Library, but apparently Adobe changed the COM GUID for this release.&amp;nbsp; It was pretty easy to resolve and I&amp;#39;ve got another post&amp;nbsp;&lt;a href="http://cromwellhaus.com/blogs/ryanc/archive/2007/08/03/xamlxporter-comexception-fix.aspx"&gt;here&lt;/a&gt; showing you how to fix that.&lt;/p&gt; &lt;p&gt;Here are some pretty nice sites with some Illustrator Vector resources you can use, but beware of the conversion gotcha&amp;#39;s.&amp;nbsp; WPF is young and Illustrator is, err, mature, so not everything has a translation.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a title="http://www.vecteezy.com/" href="http://www.vecteezy.com/"&gt;http://www.vecteezy.com/&lt;/a&gt;  &lt;li&gt;&lt;a title="http://tutorialblog.org/free-vector-downloads/" href="http://tutorialblog.org/free-vector-downloads/"&gt;http://tutorialblog.org/free-vector-downloads/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;I think we really need a site where people can upload and share WPF resources.&amp;nbsp; This would be great for styles, templates, etc. which can be time consuming and difficult for non-design people like I.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=222" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=7Utxs8rW"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=EsrVHzJg"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=EsrVHzJg" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=xMfYNizS"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=xMfYNizS" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/bUdHJNcOo9s" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/WPF/default.aspx">WPF</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2007/08/03/exporting-adobe-illustrator-resources-to-wpf.aspx</feedburner:origLink></item><item><title>XamlXporter COMException Fix</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/APXr9RYU4H8/xamlxporter-comexception-fix.aspx</link><pubDate>Fri, 03 Aug 2007 14:51:27 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:221</guid><dc:creator>cromwellryan</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=221</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=221</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2007/08/03/xamlxporter-comexception-fix.aspx#comments</comments><description>&lt;p&gt;There is a pretty cool, but curiously quiet, &lt;a href="http://www.codeplex.com"&gt;CodePlex&lt;/a&gt;&amp;nbsp;project called &lt;a href="http://www.codeplex.com/xamlxporter"&gt;XamlXporter&lt;/a&gt; that allows you to export &lt;a href="http://www.adobe.com/products/illustrator"&gt;Adobe Illustrator&lt;/a&gt;&amp;nbsp;files/resources to WPF files.&amp;nbsp; This is a great thing since WPF is young and there are a&amp;nbsp;lot of free resources and tutorials for Adobe Illustrator out there, as well as, you will probably find that design firms are going to use Illustrator before &lt;a href="http://www.microsoft.com/expression/products/overview.aspx?key=blend"&gt;Blend&lt;/a&gt;&amp;nbsp;for quite while.&amp;nbsp; &lt;/p&gt; &lt;p&gt;The current version of Illustrator is C3, but the current/latest version of XamlXporter is built for C2.&amp;nbsp; Apparently Adobe has updated the GUID for Illustrator&amp;#39;s COM Type Library, so the XamlXporter won&amp;#39;t work with C3.&amp;nbsp; Here&amp;#39;s how I fixed it:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Install Illustrator.&amp;nbsp; There is a 30-day trial version &lt;a href="http://www.adobe.com/go/tryillustrator"&gt;here&lt;/a&gt;.&lt;/li&gt; &lt;li&gt;Download XamlXporter (0.2 Alpha is &lt;a href="http://www.codeplex.com/xamlxporter/Release/ProjectReleases.aspx?ReleaseId=1551"&gt;here&lt;/a&gt;).&lt;/li&gt; &lt;li&gt;Open Visual Studio 2005 (you can probably use 2008/Orcas, but I didn&amp;#39;t).&lt;/li&gt; &lt;li&gt;Create a new project (I used C# Console), but I&amp;#39;m sure VB WinForms, etc will work just as well.&lt;/li&gt; &lt;li&gt;Add a COM Reference to Adobe Illustrator C3 Type Library.&lt;/li&gt; &lt;li&gt;Browse to the &amp;lt;project&amp;gt;\bin\Debug|Release directory and copy the Interop.Illustrator.dll to the XamlXporter binary directory.&lt;/li&gt; &lt;li&gt;Start up the XamlXporter according to the instructions and Voila!&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;If you&amp;#39;re lazy, you can download the Interop assembly I created &lt;a href="http://cromwellhaus.com/files/folders/wpf/entry220.aspx"&gt;here&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=221" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=bPej3RPT"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=HdblziN9"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=HdblziN9" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=XwMYk0VK"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=XwMYk0VK" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/APXr9RYU4H8" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Software+Reviews/default.aspx">Software Reviews</category><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/WPF/default.aspx">WPF</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2007/08/03/xamlxporter-comexception-fix.aspx</feedburner:origLink></item><item><title>Awesome Tool of the Day: StumbleUpon Firefox Add-On</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/4gq4gBXIccU/awesome-tool-of-the-day-stumbleupon-firefox-add-on.aspx</link><pubDate>Wed, 01 Aug 2007 13:45:00 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:219</guid><dc:creator>cromwellryan</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;The other day&amp;nbsp;I happened&amp;nbsp;upon the &lt;a href="https://addons.mozilla.org/en-US/firefox/"&gt;Firefox Add-On page&lt;/a&gt; and decided to give the recommended Add-On a try.&amp;nbsp; I&amp;#39;ve been infatuated ever since.&lt;/p&gt; &lt;p&gt;Though there&amp;#39;s an inordinate number of buttons on the default toolbar layout, &lt;a href="http://www.stumbleupon.com/"&gt;StumbleUpon&lt;/a&gt;&amp;nbsp;is pretty simple: You/others browse the web and when you find something you like you give it a thumbs-up &lt;a href="http://cromwellhaus.com/blogs/ryanc/WindowsLiveWriter/AwesomeTooloftheDayStumbleUponFirefoxAdd_8956/image_2.png"&gt;&lt;img src="http://cromwellhaus.com/blogs/ryanc/WindowsLiveWriter/AwesomeTooloftheDayStumbleUponFirefoxAdd_8956/image_thumb_2.png" style="border:0px none;" alt="image" border="0" /&gt;&lt;/a&gt; or a thumbs-down &lt;a href="http://cromwellhaus.com/blogs/ryanc/WindowsLiveWriter/AwesomeTooloftheDayStumbleUponFirefoxAdd_8956/image_3.png"&gt;&lt;img src="http://cromwellhaus.com/blogs/ryanc/WindowsLiveWriter/AwesomeTooloftheDayStumbleUponFirefoxAdd_8956/image_thumb_3.png" style="border:0px none;" alt="image" border="0" height="17" width="16" /&gt;&lt;/a&gt; if you don&amp;#39;t.&amp;nbsp; Then there&amp;#39;s the magic button &lt;a href="http://cromwellhaus.com/blogs/ryanc/WindowsLiveWriter/AwesomeTooloftheDayStumbleUponFirefoxAdd_8956/image_4.png"&gt;&lt;img src="http://cromwellhaus.com/blogs/ryanc/WindowsLiveWriter/AwesomeTooloftheDayStumbleUponFirefoxAdd_8956/image_thumb_4.png" style="border:0px none;" alt="image" border="0" height="18" width="17" /&gt;&lt;/a&gt;&amp;nbsp;which randomly picks pages from the submitted pages that are recommended (thumbs-up).&amp;nbsp; Their pitch says it pretty well...&lt;i&gt;&amp;quot;Channel surf the internet.&amp;quot;&lt;/i&gt;&lt;/p&gt; &lt;p&gt;I warn you, it is very addictive, but if you choose topics you are actually interested in, you&amp;#39;ll find quite a few cool and relevant sites.&amp;nbsp; &lt;a href="http://cromwellryan.stumbleupon.com"&gt;Check out&lt;/a&gt; my recommended sites so far..&lt;/p&gt; &lt;p&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/138"&gt;Get the StumbleUpon Add-On&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=219" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=phhgMmqM"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=aKlxOI6R"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=aKlxOI6R" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=JoEGWi1B"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=JoEGWi1B" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/4gq4gBXIccU" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Software+Reviews/default.aspx">Software Reviews</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2007/08/01/awesome-tool-of-the-day-stumbleupon-firefox-add-on.aspx</feedburner:origLink></item><item><title>"This problem is being researched"</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/6TwjzGS_RT8/quot-this-problem-is-being-researched-quot.aspx</link><pubDate>Wed, 01 Aug 2007 02:16:29 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:218</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=218</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=218</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2007/08/01/quot-this-problem-is-being-researched-quot.aspx#comments</comments><description>&lt;p&gt;I&amp;#39;m a big fan of the Vista &lt;em&gt;Problem Reports and Solutions&lt;/em&gt; feature.&amp;nbsp; I&amp;#39;d say it&amp;#39;s had a satisfactory solution to real problems +50% of the time, which is better than I can say for any Support FAQ or Help file I can recall.&amp;nbsp; Today, though, I&amp;#39;ve been let down.&amp;nbsp; Here&amp;#39;s what I&amp;#39;ve got - see second screen shot for details:&lt;/p&gt; &lt;p&gt;&lt;a href="http://cromwellhaus.com/blogphotos/Thisproblemisbeingresearched_138E0/image.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="480" alt="image" src="http://cromwellhaus.com/blogphotos/Thisproblemisbeingresearched_138E0/image_thumb.png" width="631" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="480" alt="image" src="http://cromwellhaus.com/blogphotos/Thisproblemisbeingresearched_138E0/image_thumb_3.png" width="631" border="0" /&gt;&lt;/p&gt; &lt;p&gt;Thanks guys.&amp;nbsp; Appreciate the update. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=218" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=yDLSsCnr"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=mxBNpt3X"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=mxBNpt3X" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=hUq9wwZj"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=hUq9wwZj" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/6TwjzGS_RT8" height="1" width="1"/&gt;</description><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2007/08/01/quot-this-problem-is-being-researched-quot.aspx</feedburner:origLink></item><item><title>Binding to an Image Byte[] in WPF</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/3K9K7HnPeCg/binding-to-the-byte-of-an-image-in-wpf.aspx</link><pubDate>Thu, 26 Jul 2007 02:21:00 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:216</guid><dc:creator>cromwellryan</dc:creator><slash:comments>3</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=216</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=216</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2007/07/26/binding-to-the-byte-of-an-image-in-wpf.aspx#comments</comments><description>&lt;p&gt;I&amp;#39;m working on a&amp;nbsp;WPF app for my wife who coaches our local high school track team.&amp;nbsp; One of the features she wanted was to have some images for different players and teams and, religious debate aside, I have chosen to save these in SQL Server 2005.&amp;nbsp; I&amp;#39;m using &lt;a href="http://www.hibernate.org/343.html"&gt;NHibernate&lt;/a&gt;&amp;nbsp;for all my data access which has been a great experience (my first).&amp;nbsp; Impressively, NHibernate supports SQL Server &lt;i&gt;Image&lt;/i&gt; columns via the inherent &lt;i&gt;Byte[]&amp;nbsp;&lt;/i&gt; type (See Section 5.1.9 of the &lt;a href="http://www.hibernate.org/hib_docs/nhibernate/html/mapping.html"&gt;docs&lt;/a&gt;).&amp;nbsp; This made adding the Image to my classes &lt;b&gt;very&lt;/b&gt; easy.&amp;nbsp; &lt;/p&gt; &lt;p&gt;Here&amp;#39;s a snippet of my class with the corresponding NHibernate Mapping Xml File:&lt;/p&gt; &lt;blockquote&gt;&lt;pre class="code"&gt;&lt;span&gt;/* Class */&lt;br /&gt;&lt;/span&gt;[&lt;span&gt;Serializable&lt;/span&gt;]&lt;br /&gt;&lt;span&gt;public&lt;/span&gt; &lt;span&gt;class&lt;/span&gt; &lt;span&gt;Organization&lt;/span&gt; : &lt;span&gt;INotifyPropertyChanged&lt;br /&gt;&lt;/span&gt;{   &lt;br /&gt;    &lt;span&gt;//...&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span&gt;public&lt;/span&gt; &lt;span&gt;byte&lt;/span&gt;[] Image&lt;br /&gt;    {&lt;br /&gt;        &lt;span&gt;get&lt;/span&gt; { &lt;span&gt;return&lt;/span&gt; _image; }&lt;br /&gt;        &lt;span&gt;set&lt;br /&gt;&lt;/span&gt;        {&lt;br /&gt;            _image = &lt;span&gt;value&lt;/span&gt;;&lt;br /&gt;            OnPropertyChanged(&lt;span&gt;&amp;quot;Image&amp;quot;&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span&gt;//...&lt;br /&gt;&lt;/span&gt;}  &lt;br /&gt;&lt;/pre&gt;&lt;pre class="code"&gt;&lt;span&gt;&amp;lt;!--&lt;/span&gt;&lt;span&gt; Mapping &lt;/span&gt;&lt;span&gt;--&amp;gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;hibernate-mapping&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;xmlns&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;urn:nhibernate-mapping-2.2&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default-lazy&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;false&lt;/span&gt;&amp;quot;&lt;span&gt;&amp;gt;&lt;br /&gt;  &amp;lt;&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;Cromwell.MyApp.Organization, Cromwell.MyApp&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;br /&gt;         &lt;/span&gt;&lt;span&gt;table&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;dbo.Organization&lt;/span&gt;&amp;quot;&lt;span&gt;&amp;gt;&lt;br /&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;Id&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;Int32&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;column&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;Id&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;unsaved-value&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;0&lt;/span&gt;&amp;quot;&lt;span&gt;&amp;gt;&lt;br /&gt;      &amp;lt;&lt;/span&gt;&lt;span&gt;generator&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;native&lt;/span&gt;&amp;quot;&lt;span&gt; /&amp;gt;&lt;br /&gt;    &amp;lt;/&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;br /&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;many-to-one&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;Type&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;br /&gt;                 &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;Cromwell.MyApp.OrganizationType, Cromwell.MyApp&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;br /&gt;                 &lt;/span&gt;&lt;span&gt;column&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;Type&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;br /&gt;                 &lt;/span&gt;&lt;span&gt;not-null&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;true&lt;/span&gt;&amp;quot;&lt;span&gt;/&amp;gt;&lt;br /&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;property&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;Name&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;String&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;length&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;255&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;column&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;Name&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;not-null&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;true&lt;/span&gt;&amp;quot;&lt;span&gt;/&amp;gt;&lt;br /&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;property&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;Address1&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;String&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;length&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;255&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;column&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;Address1&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;not-null&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;false&lt;/span&gt;&amp;quot;&lt;span&gt;/&amp;gt;&lt;br /&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;property&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;Address2&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;String&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;length&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;255&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;column&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;Address2&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;not-null&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;false&lt;/span&gt;&amp;quot;&lt;span&gt;/&amp;gt;&lt;br /&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;property&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;City&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;String&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;length&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;255&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;column&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;City&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;not-null&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;false&lt;/span&gt;&amp;quot;&lt;span&gt;/&amp;gt;&lt;br /&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;property&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;State&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;String&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;length&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;2&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;column&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;State&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;not-null&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;false&lt;/span&gt;&amp;quot;&lt;span&gt;/&amp;gt;&lt;br /&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;property&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;PostalCode&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;String&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;length&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;7&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;column&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;PostalCode&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;not-null&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;false&lt;/span&gt;&amp;quot;&lt;span&gt;/&amp;gt;&lt;br /&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;property&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;Image&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;Byte[]&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;column&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;Image&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;not-null&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;false&lt;/span&gt;&amp;quot;&lt;span&gt; /&amp;gt;&lt;br /&gt;  &amp;lt;/&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;hibernate-mapping&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;The key to binding this Image property on my WPF forms is the Binding &lt;a href="http://cromwellhaus.com/controlpanel/blogs/I%27m%20working%20on%20a%20WPF%20app%20for%20my%20wife%20who%20coaches%20our%20local%20high%20school%20track%20team.%20%20One%20of%20the%20features%20she%20wanted%20was%20to%20have%20some%20images%20for%20different%20players%20and%20teams%20and,%20religious%20debate%20aside,%20I%20have%20chosen%20to%20save%20these%20in%20SQL%20Server%202005.%20%20I%27m%20using%20NHibernate%20for%20all%20my%20data%20access%20which%20has%20been%20a%20great%20experience%20%28my%20first%29.%20%20Impressively,%20NHibernate%20supports%20SQL%20Server%20Image%20columns%20via%20the%20inherent%20Byte%5B%5D%20%20type%20%28See%20Section%205.1.9%20of%20the%20docs%29.%20%20This%20made%20adding%20the%20Image%20to%20my%20classes%20very%20easy."&gt;Converter&lt;/a&gt; property.&amp;nbsp; This property allows you to specify any class which implements &lt;a href="http://msdn2.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx"&gt;System.Windows.Data.IValueConverter&lt;/a&gt;&amp;nbsp;to act as an intermediary between your bind data and WPF.&amp;nbsp; In my case, the goal was to turn a byte[] property, Image, into a &lt;a href="http://msdn2.microsoft.com/en-us/library/system.windows.media.imaging.bitmapimage.aspx"&gt;BitmapImage&lt;/a&gt; which the an &lt;a href="http://msdn2.microsoft.com/en-us/library/ms746717.aspx"&gt;&amp;lt;Image /&amp;gt;&lt;/a&gt; control/element can display.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;Here&amp;#39;s what I came up with:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre class="code"&gt;&lt;span&gt;class&lt;/span&gt; &lt;span&gt;BinaryImageConverter&lt;/span&gt; : &lt;span&gt;IValueConverter&lt;br /&gt;&lt;/span&gt;{&lt;br /&gt;    &lt;span&gt;object&lt;/span&gt; &lt;span&gt;IValueConverter&lt;/span&gt;.Convert( &lt;span&gt;object&lt;/span&gt; value, &lt;br /&gt;        &lt;span&gt;Type&lt;/span&gt; targetType, &lt;br /&gt;        &lt;span&gt;object&lt;/span&gt; parameter, &lt;br /&gt;        System.Globalization.&lt;span&gt;CultureInfo&lt;/span&gt; culture )&lt;br /&gt;    {&lt;br /&gt;        &lt;span&gt;if&lt;/span&gt;(value != &lt;span&gt;null&lt;/span&gt; &amp;amp;&amp;amp; value &lt;span&gt;is&lt;/span&gt; &lt;span&gt;byte&lt;/span&gt;[])&lt;br /&gt;        {&lt;br /&gt;            &lt;span&gt;byte&lt;/span&gt;[] bytes = value &lt;span&gt;as&lt;/span&gt; &lt;span&gt;byte&lt;/span&gt;[];&lt;br /&gt;&lt;br /&gt;            &lt;span&gt;MemoryStream&lt;/span&gt; stream = &lt;span&gt;new&lt;/span&gt; &lt;span&gt;MemoryStream&lt;/span&gt;( bytes );&lt;br /&gt;&lt;br /&gt;            &lt;span&gt;BitmapImage&lt;/span&gt; image = &lt;span&gt;new&lt;/span&gt; &lt;span&gt;BitmapImage&lt;/span&gt;();&lt;br /&gt;            image.BeginInit();&lt;br /&gt;            image.StreamSource = stream;&lt;br /&gt;            image.EndInit();&lt;br /&gt;&lt;br /&gt;            &lt;span&gt;return&lt;/span&gt; image;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span&gt;return&lt;/span&gt; &lt;span&gt;null&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span&gt;object&lt;/span&gt; &lt;span&gt;IValueConverter&lt;/span&gt;.ConvertBack( &lt;span&gt;object&lt;/span&gt; value, &lt;br /&gt;        &lt;span&gt;Type&lt;/span&gt; targetType, &lt;br /&gt;        &lt;span&gt;object&lt;/span&gt; parameter, &lt;br /&gt;        System.Globalization.&lt;span&gt;CultureInfo&lt;/span&gt; culture )&lt;br /&gt;    {&lt;br /&gt;        &lt;span&gt;throw&lt;/span&gt; &lt;span&gt;new&lt;/span&gt; &lt;span&gt;Exception&lt;/span&gt;( &lt;span&gt;&amp;quot;The method or operation is not implemented.&amp;quot;&lt;/span&gt; );&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/blockquote&gt;
&lt;p&gt;Here&amp;#39;s how I used it in my WPF Page:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre class="code"&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Page&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;x:Class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;Cromwell.MyApp.EditOrganization&lt;/span&gt;&amp;quot;&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;...&lt;br /&gt;&lt;/span&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;xmlns:converts&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;clr-namespace:Cromwell.MyApp.Converters&lt;/span&gt;&amp;quot;&lt;br /&gt;&lt;span&gt;    &amp;gt;&lt;br /&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;Page.Resources&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;br /&gt;      &amp;lt;&lt;/span&gt;&lt;span&gt;converts:BinaryImageConverter&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;x:Key&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;imgConverter&lt;/span&gt;&amp;quot;&lt;span&gt; /&amp;gt;&lt;br /&gt;    &amp;lt;/&lt;/span&gt;&lt;span&gt;Page.Resources&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;br /&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;Grid&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;br /&gt;    &amp;lt;!--&lt;/span&gt;&lt;span&gt; Image Control &lt;/span&gt;&lt;span&gt;--&amp;gt;&lt;br /&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;Image&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Source&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;{Binding Path=Image, &lt;br /&gt;                    Converter={StaticResource imgConverter}}&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;br /&gt;           &lt;/span&gt;&lt;span&gt;Stretch&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;UniformToFill&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;br /&gt;      &lt;/span&gt;&lt;span&gt;StretchDirection&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;Both&lt;/span&gt;&amp;quot;&lt;span&gt;&amp;gt;&lt;br /&gt;      &amp;lt;&lt;/span&gt;&lt;span&gt;Image.BitmapEffect&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;br /&gt;        &amp;lt;&lt;/span&gt;&lt;span&gt;DropShadowBitmapEffect&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Color&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;Black&lt;/span&gt;&amp;quot;&lt;span&gt; /&amp;gt;&lt;br /&gt;      &amp;lt;/&lt;/span&gt;&lt;span&gt;Image.BitmapEffect&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;br /&gt;    &amp;lt;/&lt;/span&gt;&lt;span&gt;Image&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;br /&gt;  &amp;lt;/&lt;/span&gt;&lt;span&gt;Grid&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;Page&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/blockquote&gt;
&lt;p&gt;I&amp;#39;m going to have to spend some time in the WPF profiler, but this is a big step.&amp;nbsp; Pretty cool how simple it was and very clean.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=216" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=uHDRVjSR"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=9TIA6d94"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=9TIA6d94" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=xAbCGcXC"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=xAbCGcXC" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/3K9K7HnPeCg" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/.Net/default.aspx">.Net</category><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/WPF/default.aspx">WPF</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2007/07/26/binding-to-the-byte-of-an-image-in-wpf.aspx</feedburner:origLink></item><item><title>WPF ScaleTransform Direction</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/_ARwJ_rxqAU/wpf-scaletransform-direction.aspx</link><pubDate>Thu, 28 Jun 2007 15:08:32 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:215</guid><dc:creator>cromwellryan</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=215</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=215</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2007/06/28/wpf-scaletransform-direction.aspx#comments</comments><description>&lt;p&gt;The key to scaling your WPF elements in a specific direction other than down and to the right are the CenterX and CenterY properties of the &lt;a href="http://www.google.com/url?sa=t&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Fmsdn2.microsoft.com%2Fen-us%2Flibrary%2Fsystem.windows.media.scaletransform.aspx&amp;amp;ei=x8yDRrPcA5_KetKXwe4B&amp;amp;usg=AFQjCNFexsnPG0flPExSE8V_uU4hCDxjyQ&amp;amp;sig2=4PL2OhCWOfTTeQ0dzQzBfA"&gt;ScaleTransform&lt;/a&gt;.&amp;nbsp; It&amp;#39;s easy enough to set these manually, but that&amp;#39;s just lazy and asking for long term trouble.&amp;nbsp; Instead, decide how you want it to animate and bind it to something.&amp;nbsp; For instance, I have a touch screen keyboard I&amp;#39;m working on that I&amp;#39;d like to animate Up and to the Right when you are holding down the key.&amp;nbsp; Here&amp;#39;s how I did it:&lt;/p&gt; &lt;blockquote&gt;&lt;pre class="code"&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Page&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;xmlns&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;#39;&lt;span&gt;http://schemas.microsoft.com/winfx/2006/xaml/presentation&lt;/span&gt;&amp;#39;&lt;span&gt; &lt;/span&gt;&lt;span&gt;xmlns:x&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;#39;&lt;span&gt;http://schemas.microsoft.com/winfx/2006/xaml&lt;/span&gt;&amp;#39;&lt;span&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span&gt;Button&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Margin&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;5,5,5,5&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Width&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;50&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Height&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;50&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;x:Name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;btnKey&lt;/span&gt;&amp;quot;&lt;span&gt;&amp;gt;
&lt;/span&gt;    My Button
&lt;span&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;Button.RenderTransform&lt;/span&gt;&lt;span&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span&gt;ScaleTransform&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;x:Name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;buttonscale&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ScaleX&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;1&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ScaleY&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;1&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;CenterX&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;0&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;CenterY&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;{Binding ElementName=btnKey, Path=ActualHeight}&lt;/span&gt;&amp;quot;&lt;span&gt; /&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span&gt;Button.RenderTransform&lt;/span&gt;&lt;span&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span&gt;Button.Triggers&lt;/span&gt;&lt;span&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span&gt;EventTrigger&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;RoutedEvent&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;Button.Click&lt;/span&gt;&amp;quot;&lt;span&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span&gt;BeginStoryboard&lt;/span&gt;&lt;span&gt;&amp;gt;
          &amp;lt;&lt;/span&gt;&lt;span&gt;Storyboard&lt;/span&gt;&lt;span&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span&gt;DoubleAnimation&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Storyboard.TargetName&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;buttonscale&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Storyboard.TargetProperty&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;(ScaleTransform.ScaleX)&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;To&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;1.5&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;0:0:0.25&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AutoReverse&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;True&lt;/span&gt;&amp;quot;&lt;span&gt;/&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span&gt;DoubleAnimation&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Storyboard.TargetName&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;buttonscale&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Storyboard.TargetProperty&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;(ScaleTransform.ScaleY)&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;To&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;1.5&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Duration&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;0:0:0.25&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AutoReverse&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;True&lt;/span&gt;&amp;quot;&lt;span&gt;/&amp;gt;
          &amp;lt;/&lt;/span&gt;&lt;span&gt;Storyboard&lt;/span&gt;&lt;span&gt;&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span&gt;BeginStoryboard&lt;/span&gt;&lt;span&gt;&amp;gt;
      &amp;lt;/&lt;/span&gt;&lt;span&gt;EventTrigger&lt;/span&gt;&lt;span&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span&gt;Button.Triggers&lt;/span&gt;&lt;span&gt;&amp;gt;
  &amp;lt;/&lt;/span&gt;&lt;span&gt;Button&lt;/span&gt;&lt;span&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span&gt;Page&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;The key is that I bound the CenterX proeprty to the button&amp;#39;s &lt;em&gt;ActualHeight &lt;/em&gt;property.&amp;nbsp; If you wanted to scale from some midpoint though, you&amp;#39;ll have to specify a Converter in your bind syntax.&amp;nbsp; This Converter technique is often cited in the ubiquitous &lt;a href="http://learnwpf.com/Posts/Post.aspx?postId=9b745fe8-7d51-4d01-a8c7-f31083c4be94"&gt;&amp;quot;Reflection trick&amp;quot;&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=215" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=znoNnjDB"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=Pu5VoyX2"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=Pu5VoyX2" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=7bbPp0xy"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=7bbPp0xy" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/_ARwJ_rxqAU" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/.Net/default.aspx">.Net</category><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/WPF/default.aspx">WPF</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2007/06/28/wpf-scaletransform-direction.aspx</feedburner:origLink></item><item><title>PowerShell Profile on Roaming Profile</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/k_m8XyF4tF8/powershell-profile-on-roaming-profile.aspx</link><pubDate>Wed, 27 Jun 2007 16:39:48 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:214</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=214</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=214</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2007/06/27/powershell-profile-on-roaming-profile.aspx#comments</comments><description>&lt;p&gt;NOTE:&amp;nbsp;Impatience&amp;nbsp;just leads to&amp;nbsp;frustration.&lt;/p&gt; &lt;p&gt;When I first starting playing with PowerShell here at the office, I was all excited to start adding little cmdlets to my personal profile and add to my stellar productivity (tongue firmly planted in check).&amp;nbsp; This would hopefully reduce the net loss incurred by my learning PowerShell in the first place.&amp;nbsp; &lt;/p&gt; &lt;p&gt;So I took the first step and created my empty profile:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;em&gt;ps&amp;gt; notepad $profile&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;and added a nice little cmdlet to send email.&amp;nbsp; This will replace that exe tool I&amp;#39;ve always used to send emails in batch files or just whenever I need to at the command prompt.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;em&gt;$defaultSendMailHost = &amp;quot;emcrs71&amp;quot;&lt;br /&gt;$defaultSendMailFrom = &lt;a href="mailto:email@email.com"&gt;email@email.com&lt;/a&gt; &lt;/em&gt; &lt;p&gt;&lt;em&gt;function send-mail( [string] $to, [string] $subject, [string] $body )&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $smtp = new-object System.Net.Mail.SmtpClient&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $smtp.Host = $defaultSendMailHost&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $email = new-object System.Net.Mail.MailMessage&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $email.From = $defaultSendMailFrom&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $email.To.Add( $to )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $email.Subject = $subject&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $email.Body = $body&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $smtp.Send( $email )&lt;br /&gt;}&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Start it up again and WHAM...&amp;nbsp;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Courier" color="#ff0000"&gt;File \\&amp;lt;server&amp;gt;\&amp;lt;username&amp;gt;\My Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1&amp;nbsp;cannot be loaded. The file \\&amp;lt;server&amp;gt;\&amp;lt;username&amp;gt;\My Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1 is not digitally signed. The script will not execute on the system. Please see &amp;quot;get-help about_signing&amp;quot; for more details.&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Sign &lt;em&gt;my &lt;/em&gt;scripts?!&amp;nbsp; How dare you!&amp;nbsp; I was too annoyed to deal with it and took the ever so appalling step of changing the PowerShell Short cut to point to a local folder on my C drive.&amp;nbsp; Please don&amp;#39;t stop reading as I&amp;#39;ve learned from my mistakes and have rectified my ways.&lt;/p&gt; &lt;p&gt;A few weeks later I ran across the &lt;a href="http://www.codeplex.com/PowerShellCX/"&gt;PowerShell Community Extensions&lt;/a&gt;, which I highly recommend PowerShell-er install and, in fact, replaced my send-mail cmdlet above.&amp;nbsp; PSCX has an option to install it&amp;#39;s own profile which I chose, but after that I started receiving the Digital Signing guff.&amp;nbsp; &lt;/p&gt; &lt;p&gt;In the end, I did what any good PowerShell-er with a growing Profile should do.&amp;nbsp; I created a cmdlet to sign my profile.&amp;nbsp; Now I can open PS, type edit-profile (or use my ep alias), save it, and hit sign-profile (sp alias) and I&amp;#39;m good to go.&amp;nbsp; Here it is: &lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;function edit-profile()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; notepad $profile&lt;br /&gt;}  &lt;p&gt;function sign-profile()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dir $Profiledir\*.ps1 | foreach-object { sign-script $_.FullName }&lt;br /&gt;}  &lt;p&gt;function sign-script( $scriptsource ) &lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; get-item $scriptsource &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set-AuthenticodeSignature $scriptsource @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0]&lt;br /&gt;}  &lt;p&gt;set-alias sm Send-SmtpMail&lt;br /&gt;set-alias ep edit-profile&lt;br /&gt;set-alias sp sign-profile&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Now there is a little part I left out and that&amp;#39;s creating yourself a certificate, but &lt;a href="http://www.hanselman.com/blog/"&gt;Scott Hanselman&lt;/a&gt; has a very good &lt;a href="http://www.hanselman.com/blog/SigningPowerShellScripts.aspx"&gt;post&lt;/a&gt; that will walk you through this.&lt;/p&gt;&lt;a href="http://technorati.com/claim/rgidkvtvc8" rel="me"&gt;Technorati Profile&lt;/a&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=214" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=Kuom3slz"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=sY1UYVMj"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=sY1UYVMj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=BxhOTql3"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=BxhOTql3" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/k_m8XyF4tF8" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Powershell/default.aspx">Powershell</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2007/06/27/powershell-profile-on-roaming-profile.aspx</feedburner:origLink></item><item><title>Bind to Method within a DataTemplate</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/B-UL-TkSodw/bind-to-method-within-a-datatemplate.aspx</link><pubDate>Tue, 12 Jun 2007 16:35:44 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:193</guid><dc:creator>cromwellryan</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=193</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=193</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2007/06/12/bind-to-method-within-a-datatemplate.aspx#comments</comments><description>&lt;p&gt;One of my play projects with WPF is a photo viewer for the &lt;a href="http://cromwellhaus.com/photos"&gt;pictures&lt;/a&gt; we put out on &lt;a href="http://cromwellhaus.com"&gt;http://cromwellhaus.com&lt;/a&gt;.&amp;nbsp; One of the views is a montage of the latest photos with a random&amp;nbsp;RotateTransform Angle&amp;nbsp;applied to each image&amp;#39;s RenderTransform.&amp;nbsp; Getting the view itself set up as cake, but when I attempted to apply the random angle to each image, it wasn&amp;#39;t so random.&lt;/p&gt; &lt;p&gt;Here&amp;#39;s what happened and how to actually accomplish such a task:&lt;/p&gt; &lt;p&gt;I started out with an ItemsControl, rather than a ListView as most examples show, using a UniformGrid as the ItemsPanel.&lt;/p&gt; &lt;blockquote&gt;&lt;pre class="code"&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;ItemsControl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ItemTemplate&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;{StaticResource photoItem}&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ItemsSource&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;{Binding Source={StaticResource dpPhotos}, XPath=/rss/channel/item}&lt;/span&gt;&amp;quot;&lt;span&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span&gt;ItemsControl.ItemsPanel&lt;/span&gt;&lt;span&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span&gt;ItemsPanelTemplate&lt;/span&gt;&lt;span&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span&gt;UniformGrid&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HorizontalAlignment&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;Stretch&lt;/span&gt;&amp;quot;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;VerticalAlignment&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;Stretch&lt;/span&gt;&amp;quot;&lt;span&gt; /&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span&gt;ItemsPanelTemplate&lt;/span&gt;&lt;span&gt;&amp;gt;
  &amp;lt;/&lt;/span&gt;&lt;span&gt;ItemsControl.ItemsPanel&lt;/span&gt;&lt;span&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span&gt;ItemsControl&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/blockquote&gt;
&lt;p&gt;I bound the ItemsSource to an XmlDataProvider pointing to the photos &lt;a href="http://cromwellhaus.com/photos/baby/pictures_rss.aspx?Tags=Ryan+Jr&amp;amp;AndTags=1"&gt;RSS feed for Ryan Jr. pictures&lt;/a&gt;.&amp;nbsp; 
&lt;blockquote&gt;&lt;pre class="code"&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;XmlDataProvider&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;x:Key&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;dpPhotos&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Source&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;http://cromwellhaus.com/photos/baby/pictures_rss.aspx?Tags=Ryan+Jr&lt;/span&gt;&lt;span&gt;&amp;amp;amp;&lt;/span&gt;&lt;span&gt;AndTags=1&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;XmlNamespaceManager&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;{StaticResource rssMapping}&lt;/span&gt;&amp;quot;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/blockquote&gt;
&lt;p&gt;I run our site using &lt;a href="http://get.communityserver.org/express.aspx"&gt;Community Server 2007 Express Edition&lt;/a&gt;&amp;nbsp;which provides&amp;nbsp;RSS meta extensions for more detailed feeds.&amp;nbsp; This required that I apply an &lt;a href="http://msdn2.microsoft.com/en-us/library/system.xml.xmlnamespacemanager.aspx"&gt;XmlNamespaceManager&lt;/a&gt; to define these extension namespaces.&amp;nbsp; That&amp;#39;s what this is for: 
&lt;blockquote&gt;&lt;pre class="code"&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;XmlNamespaceMappingCollection&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;x:Key&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;rssMapping&lt;/span&gt;&amp;quot;&lt;span&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span&gt;XmlNamespaceMapping&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Uri&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;http://search.yahoo.com/mrss&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Prefix&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;media&lt;/span&gt;&amp;quot;&lt;span&gt; /&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span&gt;XmlNamespaceMappingCollection&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/blockquote&gt;
&lt;p&gt;Here is the DataTemplate used by the ItemsControl to display/render each image.&amp;nbsp; You&amp;#39;ll see this referred to in above as {StaticResource photoItem}: 
&lt;blockquote&gt;&lt;pre class="code"&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;DataTemplate&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;x:Key&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;photoItem&lt;/span&gt;&amp;quot;&lt;span&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span&gt;Image&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Margin&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;12,12,12,12&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Source&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;{Binding Mode=Default, XPath=media:thumbnail/@url}&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ToolTip&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;{Binding XPath=title}&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Width&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;{Binding Mode=Default, XPath=media:thumbnail/@width}&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Height&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;{Binding Mode=Default, XPath=media:thumbnail/@height}&lt;/span&gt;&amp;quot;&lt;span&gt; /&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span&gt;DataTemplate&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;You can see the use of the XmlNamespaceMapping in the XPath=&lt;em&gt;media:&lt;/em&gt;thumbnail/@url.&amp;nbsp; That had me stumped for a few seconds, but opening the project up in &lt;a href="http://www.microsoft.com/Expression/products/overview.aspx?key=blend"&gt;Expression Blend&lt;/a&gt;&amp;nbsp;and re-adding the XmlDataProvider created the Mappings for me.&amp;nbsp; (Sidebar: VS 2008 does do this for you - thank goodness) 
&lt;p&gt;At this point, we are displaying thumbnails and we are certainly aware that I make poor color choices, but we&amp;#39;re on our way. 
&lt;p&gt;&lt;a href="http://cromwellhaus.com/blogs/ryanc/WindowsLiveWriter/BindtoMethodwithinaDataTemplate_CB86/image_2.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="480" alt="Almost there..." src="http://cromwellhaus.com/blogs/ryanc/WindowsLiveWriter/BindtoMethodwithinaDataTemplate_CB86/image_thumb_1.png" width="508" border="0" /&gt;&lt;/a&gt; 
&lt;p&gt;&lt;strong&gt;Applying the RotateTransform &lt;/strong&gt;is easy... 
&lt;blockquote&gt;&lt;pre class="code"&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Image&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Margin&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;12,12,12,12&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Source&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;{Binding Mode=Default, XPath=media:thumbnail/@url}&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ToolTip&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;{Binding XPath=title}&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Width&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;{Binding Mode=Default, XPath=media:thumbnail/@width}&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Height&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;{Binding Mode=Default, XPath=media:thumbnail/@height}&lt;/span&gt;&amp;quot;&lt;span&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span&gt;Image.RenderTransform&lt;/span&gt;&lt;span&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span&gt;RotateTransform&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Angle&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;10&lt;/span&gt;&amp;quot;&lt;span&gt; /&amp;gt;
  &amp;lt;/&lt;/span&gt;&lt;span&gt;Image.RenderTransform&lt;/span&gt;&lt;span&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span&gt;Image&lt;/span&gt;&lt;span&gt;&amp;gt;
&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;...and it&amp;#39;s almost as easy to use the &lt;a href="http://www.google.com/url?sa=t&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Fmsdn2.microsoft.com%2Fen-us%2Flibrary%2Fsystem.random.aspx&amp;amp;ei=I-BuRpy4K5TSgwSd7LzRBA&amp;amp;usg=AFQjCNH7kwYGhG5DHJPSH49s3FQbKjrKZA&amp;amp;sig2=fMHOOh5R2_XhBt2qEkxLPw"&gt;System.Random&lt;/a&gt;&amp;nbsp;class to generate the angle.&amp;nbsp; Just add the following ObjectDataProvider as a Window or&amp;nbsp;Application&amp;nbsp;Resource and bind the Angle property to it: 
&lt;blockquote&gt;&lt;pre class="code"&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;ObjectDataProvider&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;x:Key&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;randomAngle&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ObjectType&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;{x:Type system:Random}&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MethodName&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;Next&lt;/span&gt;&amp;quot;&lt;span&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span&gt;ObjectDataProvider.MethodParameters&lt;/span&gt;&lt;span&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span&gt;system:Int32&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;-12&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;system:Int32&lt;/span&gt;&lt;span&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span&gt;system:Int32&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;12&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;system:Int32&lt;/span&gt;&lt;span&gt;&amp;gt;
  &amp;lt;/&lt;/span&gt;&lt;span&gt;ObjectDataProvider.MethodParameters&lt;/span&gt;&lt;span&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span&gt;ObjectDataProvider&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;pre class="code"&gt;&lt;span&gt;...&lt;/span&gt;&lt;/pre&gt;&lt;pre class="code"&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;RotateTransform&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Angle&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;{Binding Source={StaticResource randomAngle}&lt;/span&gt;&amp;quot;&lt;span&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;Well when you do this, you&amp;#39;ll find that you get the same Angle for every image.&amp;nbsp; This is because you are actually binding to a single instance of the ObjectDataProvider.&amp;nbsp; To resolve this we actually have to embed the ODP in the transform itself as so:&lt;/p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;blockquote&gt;&lt;pre class="code"&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;RotateTransform&lt;/span&gt;&lt;span&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span&gt;RotateTransform.Angle&lt;/span&gt;&lt;span&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span&gt;Binding&lt;/span&gt;&lt;span&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span&gt;Binding.Source&lt;/span&gt;&lt;span&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span&gt;ObjectDataProvider&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ObjectType&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;{x:Type system:Random}&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MethodName&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;Next&lt;/span&gt;&amp;quot;&lt;span&gt;&amp;gt;
          &amp;lt;&lt;/span&gt;&lt;span&gt;ObjectDataProvider.MethodParameters&lt;/span&gt;&lt;span&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span&gt;system:Int32&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;-12&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;system:Int32&lt;/span&gt;&lt;span&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span&gt;system:Int32&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;12&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;system:Int32&lt;/span&gt;&lt;span&gt;&amp;gt;
          &amp;lt;/&lt;/span&gt;&lt;span&gt;ObjectDataProvider.MethodParameters&lt;/span&gt;&lt;span&gt;&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span&gt;ObjectDataProvider&lt;/span&gt;&lt;span&gt;&amp;gt;
      &amp;lt;/&lt;/span&gt;&lt;span&gt;Binding.Source&lt;/span&gt;&lt;span&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span&gt;Binding&lt;/span&gt;&lt;span&gt;&amp;gt;
  &amp;lt;/&lt;/span&gt;&lt;span&gt;RotateTransform.Angle&lt;/span&gt;&lt;span&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span&gt;RotateTransform&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;&lt;em&gt;Tada!&lt;/em&gt;&lt;a href="http://cromwellhaus.com/blogs/ryanc/WindowsLiveWriter/BindtoMethodwithinaDataTemplate_CB86/image_4.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="480" alt="image" src="http://cromwellhaus.com/blogs/ryanc/WindowsLiveWriter/BindtoMethodwithinaDataTemplate_CB86/image_thumb_3.png" width="508" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Now you will find that your angle&amp;#39;s aren&amp;#39;t terribly &amp;quot;Random&amp;quot;.&amp;nbsp; This is because you are actually asking for a new instance of the Random class each time.&amp;nbsp; You can tell the ODP within the DataTemplate to use the same instance each time by adding this to the Window Resources:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre class="code"&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;ObjectDataProvider&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;x:Key&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;randomAngle&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ObjectType&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;{x:Type system:Random}&lt;/span&gt;&amp;quot;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;and modifying the Angle binding to the following, telling the transform ODP to use a specific resource instance rather than just giving it a type to instantiate each time.&lt;/p&gt;
&lt;blockquote&gt;&lt;pre class="code"&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;ObjectDataProvider&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;strong&gt;&lt;u&gt;&lt;em&gt;ObjectInstance&lt;/em&gt;&lt;/u&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;{StaticResource randomAngle}&lt;/span&gt;&amp;quot;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MethodName&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&amp;quot;&lt;span&gt;Next&lt;/span&gt;&amp;quot;&lt;span&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span&gt;ObjectDataProvider.MethodParameters&lt;/span&gt;&lt;span&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span&gt;system:Int32&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;-12&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;system:Int32&lt;/span&gt;&lt;span&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span&gt;system:Int32&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;12&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;system:Int32&lt;/span&gt;&lt;span&gt;&amp;gt;
  &amp;lt;/&lt;/span&gt;&lt;span&gt;ObjectDataProvider.MethodParameters&lt;/span&gt;&lt;span&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span&gt;ObjectDataProvider&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;You can download a mini-version used to write this post &lt;a title="WPFBindToMethodExample" href="http://cromwellhaus.com/files/folders/wpf/entry192.aspx"&gt;here&lt;/a&gt;.&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=193" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=6uv0nmrG"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=rjNewsyf"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=rjNewsyf" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=ZjqLZ2fV"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=ZjqLZ2fV" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/B-UL-TkSodw" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/.Net/default.aspx">.Net</category><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/WPF/default.aspx">WPF</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2007/06/12/bind-to-method-within-a-datatemplate.aspx</feedburner:origLink></item><item><title>Google Gears</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/PDO3uOudndU/google-gears.aspx</link><pubDate>Thu, 31 May 2007 14:40:25 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:187</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=187</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=187</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2007/05/31/google-gears.aspx#comments</comments><description>&lt;p&gt;I&amp;#39;m not entirely sure what to think of &lt;a title="Google Gears" href="http://code.google.com/apis/gears/index.html"&gt;Google Gears&lt;/a&gt;.&amp;nbsp; It seems most people are focusing on the &lt;a href="http://code.google.com/apis/gears/api_database.html"&gt;Database&lt;/a&gt;&amp;nbsp;portion of the stack, but it&amp;#39;s the &lt;a href="http://code.google.com/apis/gears/api_localserver.html"&gt;LocalServer&lt;/a&gt;&amp;nbsp;portion that has me confused.&amp;nbsp; Does this not reek of complexity and severe duplication?&amp;nbsp; &lt;/p&gt; &lt;p&gt;After first reading through the &lt;a href="http://code.google.com/apis/gears/api_localserver.html#overview"&gt;LocalServer Overview&lt;/a&gt;&amp;nbsp;I thought, cool, this thing is going to serve up my server app when the client is offline.&amp;nbsp; That&amp;#39;s kind of sweet, but how do they know what pages people are going to need?&amp;nbsp; I sure hope they don&amp;#39;t cache on demand, because that breaks down with the first button I click?&amp;nbsp; Maybe they crawl my pages and pick up links, that &lt;em&gt;might&lt;/em&gt; work.&amp;nbsp; Well, it turns out you have to tell them up front what pages to cache either via a &lt;a href="http://code.google.com/apis/gears/api_localserver.html#manifest_file"&gt;Manifest file&lt;/a&gt; or via their &lt;a href="http://code.google.com/apis/gears/api_localserver.html#LocalServer"&gt;LocalServer API&lt;/a&gt;.&amp;nbsp; Manifest file is cool I guess, there will undoubtedly be server-side tools to generate these.&lt;/p&gt; &lt;p&gt;What happens if&amp;nbsp;my client&amp;#39;s browser&amp;nbsp;has caching disabled or your page&amp;#39;s client side cache expires?&amp;nbsp; How do you get to the first page that loads the Gears&amp;nbsp;API and starts loading the Gears Cache?&amp;nbsp; Maybe I&amp;#39;m missing something here.&lt;/p&gt; &lt;p&gt;I think I can handle all link activity and user actions requesting pages from the LocalServer.&amp;nbsp;&amp;nbsp;I&amp;#39;m sure that stuff can be wrapped into our AJAX frameworks; I&amp;#39;m sure &lt;a href="http://code.google.com/webtoolkit/"&gt;Google&amp;#39;s Web Toolkit&lt;/a&gt; will soon enough.&amp;nbsp; What about Mashups&amp;#39; though?&amp;nbsp; Aren&amp;#39;t we supposed to be pulling data from site A and displaying it with relevant information from our site?&amp;nbsp; Is everyone going to start caching everyone else&amp;#39;s data?&lt;/p&gt; &lt;p&gt;But, heck, it&amp;#39;s not like any of the &lt;a title="Rich Internet/Interactive Applications" href="http://www.google.com/search?hl=en&amp;amp;q=RIA+rich+application&amp;amp;btnG=Search"&gt;RIA&lt;/a&gt;&amp;nbsp;platforms out there today are doing any better at providing infrastructure to move the Internet App as is to the offline client.&amp;nbsp; This seems like a decent start.&amp;nbsp; I personally like the idea of having two different targets: client or web, while providing a different targeted experience for either.&amp;nbsp; We have too much horsepower and money invested in our personal computers to waste it on a serving local web pages.&lt;/p&gt; &lt;p&gt;We&amp;#39;ll see.&amp;nbsp; It&amp;#39;s still only beta.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=187" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=qfWIw6d3"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=CmXIz1zZ"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=CmXIz1zZ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=Aug68wxR"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=Aug68wxR" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/PDO3uOudndU" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Software+Reviews/default.aspx">Software Reviews</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2007/05/31/google-gears.aspx</feedburner:origLink></item><item><title>Classic Web 1.0...</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/w5n2-sPNTRo/classic-web-1-0.aspx</link><pubDate>Fri, 25 May 2007 13:51:40 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:186</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=186</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=186</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2007/05/25/classic-web-1-0.aspx#comments</comments><description>&lt;p&gt;You know you need to reevaluate your web site when you see the following:&lt;/p&gt; &lt;p&gt;&lt;a href="http://cromwellhaus.com/blogs/ryanc/WindowsLiveWriter/ClassicWeb1.0_8A5C/image%7B0%7D%5B11%5D.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="190" src="http://cromwellhaus.com/blogs/ryanc/WindowsLiveWriter/ClassicWeb1.0_8A5C/image%7B0%7D_thumb%5B7%5D.png" width="600" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=186" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=MahVtky1"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=sqzeMof9"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=sqzeMof9" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=KycIeD27"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=KycIeD27" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/w5n2-sPNTRo" height="1" width="1"/&gt;</description><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2007/05/25/classic-web-1-0.aspx</feedburner:origLink></item><item><title>Awesome Tool of the Day: Baretail</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/yPUt2mMIBXE/awesome-tool-of-the-day-baretail.aspx</link><pubDate>Tue, 15 May 2007 14:00:14 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:185</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=185</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=185</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2007/05/15/awesome-tool-of-the-day-baretail.aspx#comments</comments><description>&lt;p&gt;&amp;nbsp;Every now and again I find a tool that changes my life.&amp;nbsp; &lt;a href="http://www.baremetalsoft.com/baretail/"&gt;Baretail&lt;/a&gt;&amp;nbsp;is just such a tool.&amp;nbsp; I don&amp;#39;t know what I did before, but it couldn&amp;#39;t have been good.&amp;nbsp; Baretail is a log file reader/watcher that trails the end of your log files.&amp;nbsp; This may not be too exciting for you, but here in the &lt;a href="http://www.speedway.com/speedyrewards/"&gt;Speedy Rewards&lt;/a&gt;&amp;nbsp;team, we have some terribly verbose 3rd party log files that are our only real insight into activity.&amp;nbsp; This has made my week!&lt;/p&gt; &lt;p&gt;&lt;a href="http://cromwellhaus.com/blogs/ryanc/WindowsLiveWriter/AwesomeTooloftheDayBaretail_8BB6/baretail-screencap%5B1%5D.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="343" src="http://cromwellhaus.com/blogs/ryanc/WindowsLiveWriter/AwesomeTooloftheDayBaretail_8BB6/baretail-screencap_thumb%5B1%5D.png" width="425" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=185" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=igB3vxz8"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=TxRKLV62"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=TxRKLV62" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=evokOiWc"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=evokOiWc" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/yPUt2mMIBXE" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Software+Reviews/default.aspx">Software Reviews</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2007/05/15/awesome-tool-of-the-day-baretail.aspx</feedburner:origLink></item><item><title>Vista Sidebar Gadget Developer Experience</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/NbvhOJTKqHo/vista-sidebar-gadget-developer-experience.aspx</link><pubDate>Wed, 02 May 2007 02:58:18 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:181</guid><dc:creator>cromwellryan</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=181</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=181</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2007/05/02/vista-sidebar-gadget-developer-experience.aspx#comments</comments><description>&lt;p&gt;Vista Sidebar Gadgets can be cool, but the developer experience out of the box is severely lacking.&amp;nbsp; Microsoft doesn&amp;#39;t provide a Visual Studio project template, so &lt;a href="http://timheuer.com/blog"&gt;Tim Heuer&lt;/a&gt;&amp;nbsp;was nice enough to &lt;a title="Vista Sidebar Gadget Visual Studio Template" href="http://timheuer.com/blog/archive/2007/03/11/14010.aspx"&gt;provide one&lt;/a&gt; for us.&amp;nbsp; He does so via a Web Site template, which makes sense since a Sidebar gadget is nothing more than &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sidebar/sidebar/overviews/gdo.asp"&gt;an Html page with a splash of JavaScript&lt;/a&gt;, minimally, of course.&amp;nbsp; If you are like me, you like to be able to touch something up and then look at it, but I&amp;#39;m not about to edit, copy, run every time I want to see what my little icon change has affected.&amp;nbsp; Here&amp;#39;s a tip to help you out: create a symbolic link in your &lt;font face="Consolas"&gt;&lt;em&gt;%userprofile%\AppData\Local\Microsoft\Windows Sidebar\Gadgets&lt;/em&gt;&lt;/font&gt; directory.&amp;nbsp; Here&amp;#39;s how:&lt;/p&gt; &lt;ol&gt; &lt;ol&gt; &lt;li&gt;Run&amp;nbsp;Command Prompt as an Administrator  &lt;li&gt;mklink /D &amp;quot;%userprofile%\AppData\Local\Microsoft\Windows Sidebar\Gadgets\&amp;lt;gadgetname&amp;gt;.gadget&amp;quot; &amp;quot;%userprofile%\Documents\Visual Studio 2005\WebSites\&amp;lt;VisualStudioProjectDirectory&amp;gt;&amp;quot;&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt; &lt;p&gt;&lt;a href="http://cromwellhaus.com/blogphotos/VistaSidebarGadgetDeveloperExperience_14258/image031.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="180" src="http://cromwellhaus.com/blogphotos/VistaSidebarGadgetDeveloperExperience_14258/image0_thumb22.png" width="240" align="left" border="0" alt="" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;This allows you to keep your projects where they belong (VS won&amp;#39;t let you open a folder in AppData without jumping some hoops anyway) and still reload your Gadget in Sidebar whenever you make changes.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=181" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=k3Y7PVqn"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=M8RLma7E"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=M8RLma7E" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=5bjZ23NN"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=5bjZ23NN" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/NbvhOJTKqHo" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Vista+Sidebar/default.aspx">Vista Sidebar</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2007/05/02/vista-sidebar-gadget-developer-experience.aspx</feedburner:origLink></item><item><title>Silverlight: .Net for the masses</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/dt5LY8It3x4/silverlight-net-for-the-masses.aspx</link><pubDate>Tue, 01 May 2007 12:25:55 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:179</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=179</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=179</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2007/05/01/silverlight-net-for-the-masses.aspx#comments</comments><description>&lt;p&gt;While up in Redmond for the &lt;a href="http://cromwellhaus.com/blogs/ryanc/archive/2007/03/26/wpf-bootcamp-day-1.aspx"&gt;WPF Bootcamp&lt;/a&gt;, we had a short time to work with some of the WPF/E, now &lt;a title="Silverlight" href="http://msdn.microsoft.com/silverlight/"&gt;Silverlight&lt;/a&gt;,&amp;nbsp;team members.&amp;nbsp; At the time&amp;nbsp;Silverlight&amp;nbsp;didn&amp;#39;t make a whole lot of sense in our strategy.&amp;nbsp; That said, I hope everyone sees the great potential that comes from some of the features surrounding &lt;a href="http://go.microsoft.com/fwlink/?linkid=89145&amp;amp;clcid=0x409"&gt;Silverlight 1.1&lt;/a&gt;&amp;nbsp;specifically.&lt;/p&gt; &lt;p&gt;Let&amp;#39;s put this into context. Over the last couple of years, true web-based applications have really started to take shape.&amp;nbsp; I&amp;#39;m talking &lt;a href="http://docs.google.com/"&gt;Google Docs &amp;amp; Spreadsheets&lt;/a&gt;, &lt;a href="http://local.yahoo.com"&gt;Yahoo! Local&lt;/a&gt;, &lt;a href="http://pipes.yahoo.com/pipes/"&gt;Yahoo! Pipes&lt;/a&gt;&amp;nbsp;and not YouTube, which is a glorified photo sharing site.&amp;nbsp; A bevy of &lt;a href="http://ajaxpatterns.org/wiki/index.php?title=AJAXFrameworks"&gt;AJAX toolkits&lt;/a&gt;&amp;nbsp;have attempted to fill the enormous development gap between LCD-JavaScript and C#, Java, VB, Ruby, and Python, but there is only so much one can do with JavaScript before you go crazy.&lt;/p&gt; &lt;p&gt;Now imagine some &amp;quot;real&amp;quot; applications that actually attempt to provide a full feature set which accentuates an existing web model.&amp;nbsp; My favorite example is &lt;a href="http://www.shutterfly.com/studio/overviews.jsp"&gt;Shutterfly Studio&lt;/a&gt;.&amp;nbsp; They probably could have given you 20% of the Collage functionality with some goofy JavaScript or lots of uploading and postbacks, but how long would you wait around for your photos to upload while trying out different layouts?&amp;nbsp; Not long I&amp;#39;d imagine.&amp;nbsp; This is where Silverlight comes in.&lt;/p&gt; &lt;p&gt;Silverlight takes the untold story of Java and actually runs with it by providing a consolidated branch of the full .Net CLR, including JITter, Garbage-Collector, BCL, Threading namespace, Network stack and more.&amp;nbsp; Well this is all well and good, but why not just use Flash?&amp;nbsp; Well, if you want to deploy a Flash application, you are forced to use &lt;a href="http://en.wikipedia.org/wiki/Talk:ActionScript/rewrite"&gt;ActionScript&lt;/a&gt;, which doesn&amp;#39;t provide nearly the feature set of .Net nor is it useful in any other environment other than Flash, so your experience is isolated.&amp;nbsp; Flash also doesn&amp;#39;t provide the huge WCF communications platform for secure, transport independent communications, WPF for rich interactive media, and one of the most powerful IDE platforms in &lt;a href="http://msdn.microsoft.com/vstudio/eula.aspx?id=c8bf88e7-841c-43fd-c63d-379943617f36"&gt;Visual Studio.&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Imagine&amp;nbsp;starting your&amp;nbsp;family collage&amp;nbsp;with &lt;a href="http://www.shutterfly.com/studio/overviews.jsp"&gt;Shutterfly Studio&lt;/a&gt;&amp;nbsp;at home on your laptop, getting to work in the morning and flipping through real layouts with your pictures at work (lunch of course) and then sending your parents a link to the catalog of pictures where they can browse any layout and order their own version of the collage?&amp;nbsp; No Shutterfly Studio desktop icon or Start Menu shortcut.&amp;nbsp; Just a one time 20 second download of the Silverlight CLR - yeah the Silverlight CLR is only 4mb.&amp;nbsp; That&amp;#39;s what removing 90% of the&amp;nbsp;&lt;a href="http://msdn2.microsoft.com/en-us/library/system.drawing.color_members.aspx"&gt;named color members in System.Drawing.Color&lt;/a&gt; and asking people to look up the HEX value.&lt;/p&gt; &lt;p&gt;Have fun.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=179" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=WLaFfrFd"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=UWkLDjwB"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=UWkLDjwB" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=om70HaX8"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=om70HaX8" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/dt5LY8It3x4" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/.Net/default.aspx">.Net</category><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/WPF/default.aspx">WPF</category><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Silverlight/default.aspx">Silverlight</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2007/05/01/silverlight-net-for-the-masses.aspx</feedburner:origLink></item><item><title>Signing your Powershell Profile Scripts</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/QL3GqDdL3cA/signing-your-powershell-profile-scripts.aspx</link><pubDate>Mon, 23 Apr 2007 21:38:49 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:176</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=176</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=176</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2007/04/23/signing-your-powershell-profile-scripts.aspx#comments</comments><description>&lt;p&gt;Running with &lt;a href="http://www.microsoft.com/technet/scriptcenter/topics/msh/cmdlets/set-executionpolicy.mspx"&gt;Set-ExecutionPolicy&lt;/a&gt; as AllSigned or&amp;nbsp;Restricted with a roaming profile?&amp;nbsp; Here&amp;#39;s a cmdlet pair that will sign all the scripts in your profile directory.&amp;nbsp; Makes life easier on me as I include a number of scripts into my main profile for readability:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;em&gt;function sign-profile()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dir $Profiledir\*.ps1 | foreach-object { sign-script $_.FullName }&lt;br /&gt;} &lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;function sign-script( $scriptsource ) &lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; get-item $scriptsource &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set-AuthenticodeSignature $scriptsource @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0]&lt;br /&gt;}&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;And if you aren&amp;#39;t already using Powershell, stop wasting your time with the Command Prompt and &lt;a href="http://www.microsoft.com/powershell/download"&gt;go get it&lt;/a&gt;.&amp;nbsp; Don&amp;#39;t forget the &lt;a href="http://www.codeplex.com/PowerShellCX/"&gt;Powershell Community Extensions&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=176" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=MtBNqYtI"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=QDY54MK9"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=QDY54MK9" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=EuwUQNHb"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=EuwUQNHb" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/QL3GqDdL3cA" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Powershell/default.aspx">Powershell</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2007/04/23/signing-your-powershell-profile-scripts.aspx</feedburner:origLink></item><item><title>Visual Studio Orcas Beta 1</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/g6DiXjRK0Ys/visual-studio-orcas-beta-1.aspx</link><pubDate>Fri, 20 Apr 2007 02:32:59 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:174</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=174</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=174</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2007/04/20/visual-studio-orcas-beta-1.aspx#comments</comments><description>&lt;p&gt;The last few weeks I&amp;#39;ve felt like a&amp;nbsp;little intern&amp;nbsp;again.&amp;nbsp; With the &lt;a title="WPF Bootcamp" href="http://cromwellhaus.com/blogs/ryanc/archive/2007/03/26/wpf-bootcamp-day-1.aspx"&gt;WPF Bootcamp&lt;/a&gt;&amp;nbsp;and the&amp;nbsp;early stages&amp;nbsp;WCF integration into the Speedy Rewards messaging infrastructure (I&amp;#39;ll be posting on this soon), I&amp;#39;ve had lots of time to play with .Net 3.0 stuff.&amp;nbsp; &lt;/p&gt; &lt;p&gt;For those that have had a chance to fiddle, there are two feasible options at this point: 1) &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=F54F5537-CC86-4BF5-AE44-F5A1E805680D&amp;amp;displaylang=en"&gt;VS.Net Extensions for WCF &amp;amp; WPF&lt;/a&gt;&amp;nbsp;and 2) &lt;a href="http://msdn2.microsoft.com/en-us/vstudio/aa700831.aspx"&gt;Orcas CTP&amp;#39;s&lt;/a&gt;.&amp;nbsp; The Extensions, in my opinion, were a valiant stop-gap effort to get people started.&amp;nbsp; This is especially true for WCF, because there isn&amp;#39;t a whole lot of design time experience necessary for web services with the exception of those monstrous config sections.&amp;nbsp; The WPF extensions were OK, but it was basically like having &lt;a title="XamlPad" href="http://msdn2.microsoft.com/en-us/library/ms742398.aspx"&gt;XAMLPad&lt;/a&gt; embedded in VS.&amp;nbsp;&amp;nbsp;Orcas CTPS, on the other hand, have been virtually useless.&amp;nbsp; The WPF designer crashed regularly and was slower than&amp;nbsp;waiting for&amp;nbsp;me do math in my head.&amp;nbsp; This may be due to the Virtual PC requirements, since they hadn&amp;#39;t yet worked out the issue of Visual Studio 2005 and Orcas living happily side-by-side.&lt;/p&gt; &lt;p&gt;Anyway&amp;#39;s, as of today, there is a better #2.&amp;nbsp; Orcas has hit Beta 2.&amp;nbsp; &lt;a href="http://msdn2.microsoft.com/en-us/vstudio/aa700831.aspx"&gt;Go get it&lt;/a&gt;.&amp;nbsp; There are &lt;a title="Visual Studio &amp;quot;Orcas&amp;quot; downloads" href="http://msdn.microsoft.com/vstudio/express/future/default.aspx"&gt;Express SKU&amp;#39;s&lt;/a&gt; too, so don&amp;#39;t worry if you aren&amp;#39;t an MSDN Subscriber, you can join the party too.&lt;/p&gt; &lt;p&gt;Happy coding - go make something cool.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=174" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=m8NxQbto"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=APi7mSQe"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=APi7mSQe" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=mSTWlTjE"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=mSTWlTjE" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/g6DiXjRK0Ys" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/.Net/default.aspx">.Net</category><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/WPF/default.aspx">WPF</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2007/04/20/visual-studio-orcas-beta-1.aspx</feedburner:origLink></item><item><title>PerformanceHelper for easy PerformanceCounter integration</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/Q6KVv4VlU4Y/performancehelper-for-easy-performancecounter-integration.aspx</link><pubDate>Thu, 19 Apr 2007 14:26:11 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:171</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=171</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=171</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2007/04/19/performancehelper-for-easy-performancecounter-integration.aspx#comments</comments><description>&lt;p&gt;In the &lt;a title="Speedway SpeedyRewards&amp;trade;" href="http://www.speedyrewards.com"&gt;Speedy Rewards&lt;/a&gt;&amp;nbsp;team here we use custom&amp;nbsp;&lt;a href="http://msdn2.microsoft.com/en-us/library/system.diagnostics.performancecounter.aspx"&gt;PerformanceCounters&lt;/a&gt; quite extensively to monitor and trend our host systems.&amp;nbsp; You may not know, but our rewards program implements real-time host integration for transactions that are Id&amp;#39;ed as a &lt;a href="http://www.speedyrewards.com"&gt;SpeedyRewards&lt;/a&gt;&amp;nbsp;member such that systems like the in-store kiosk, &lt;a href="http://www.SpeedyRewards.com"&gt;www.SpeedyRewards.com&lt;/a&gt;, and any other store you may soon visit can accurately reflect balance updates immediately.&amp;nbsp; With 1600+ stores doing this and a sub-1 second response time, we need to keep a close eye on things.&lt;/p&gt; &lt;p&gt;Today I was trying to do some preliminary performance profiling on our new WCF based messaging infrastructure.&amp;nbsp; To make my life a little easier, I&amp;nbsp;put together&amp;nbsp;a PerformanceHelper&amp;nbsp;class that I actually modeling off the Tracer class found in the &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=a7d2a109-660e-444e-945a-6b32af1581b3&amp;amp;displaylang=en"&gt;Enterprise Library 1.1&lt;/a&gt;.&amp;nbsp; To use it, you wrap a section of code you wish to monitor performance for with the following:&lt;/p&gt; &lt;blockquote&gt;&lt;pre class="code"&gt;&lt;span&gt;using&lt;/span&gt;(&lt;span&gt;new&lt;/span&gt; &lt;span&gt;PerformanceHelper&lt;/span&gt;(CATEGORY, &lt;span&gt;&amp;quot;&amp;lt;BlockInstanceName&amp;gt;&amp;quot;&lt;/span&gt;) )
{
    &lt;span&gt;//...
&lt;/span&gt;}&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;This will provide you with a &lt;a href="http://msdn2.microsoft.com/en-us/library/system.diagnostics.performancecountertype.aspx"&gt;RateOfCountsPerSecond32&lt;/a&gt; counter and an &lt;a href="http://msdn2.microsoft.com/en-us/library/system.diagnostics.performancecountertype.aspx"&gt;AverageTimer32&lt;/a&gt; counter&amp;nbsp;called &amp;quot;Operations/sec\&amp;lt;BlockInstanceName&amp;gt;&amp;quot; and &amp;quot;Average Time/Operation\&amp;lt;BlockInstanceName&amp;gt;&amp;quot; respectively.&amp;nbsp; You can download the&amp;nbsp;&lt;a title="PerformanceHelper.cs" href="http://cromwellhaus.com/files/folders/netcode/entry172.aspx"&gt;PerformanceHelper class here&lt;/a&gt; and a &lt;a title="Performance Helper Sample Project" href="http://cromwellhaus.com/files/folders/netcode/entry173.aspx"&gt;sample project here&lt;/a&gt;.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;Feel free to use and abuse it, but be aware that this has not fully tested and may well contain bugs.&amp;nbsp; &lt;em&gt;I provide NO warranty or guarantees&lt;/em&gt;, so don&amp;#39;t come to me when your server blue-screens from a corrupt registry (not that I&amp;#39;ve ever done that).&amp;nbsp; Use at your own peril.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=171" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=0pIXxNec"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=sMIfxWSt"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=sMIfxWSt" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=lf9V6iyy"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=lf9V6iyy" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/Q6KVv4VlU4Y" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/.Net/default.aspx">.Net</category><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Performance/default.aspx">Performance</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2007/04/19/performancehelper-for-easy-performancecounter-integration.aspx</feedburner:origLink></item><item><title>Vacation at your own peril!</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/qWt5Z1ROJ6A/vacation-at-your-own-peril.aspx</link><pubDate>Mon, 16 Apr 2007 12:56:50 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:169</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=169</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=169</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2007/04/16/vacation-at-your-own-peril.aspx#comments</comments><description>&lt;p&gt;A co-worker of mine recently went on vacation for a week.&amp;nbsp; Here&amp;#39;s what he returned to:&lt;/p&gt; &lt;p&gt;We went with a &amp;quot;Little Tikes&amp;quot; theme.&lt;/p&gt; &lt;p&gt;&lt;a href="http://cromwellhaus.com/blogphotos/Vacationatyourownperil_7D79/DSC002504.jpg"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="180" src="http://cromwellhaus.com/blogphotos/Vacationatyourownperil_7D79/DSC00250_thumb2.jpg" width="240" border="0" alt="" /&gt;&lt;/a&gt;&lt;a href="http://cromwellhaus.com/blogphotos/Vacationatyourownperil_7D79/DSC002512.jpg"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="180" src="http://cromwellhaus.com/blogphotos/Vacationatyourownperil_7D79/DSC00251_thumb.jpg" width="240" align="right" border="0" alt="" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;a href="http://cromwellhaus.com/blogphotos/Vacationatyourownperil_7D79/DSC002521.jpg"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="180" src="http://cromwellhaus.com/blogphotos/Vacationatyourownperil_7D79/DSC00252.jpg" width="240" border="0" alt="" /&gt;&lt;/a&gt;Rickie is quite the artist.&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;a href="http://cromwellhaus.com/blogphotos/Vacationatyourownperil_7D79/DSC002536.jpg"&gt;&lt;img style="border-right:0px;border-top:0px;margin:0px 5px 0px 0px;border-left:0px;border-bottom:0px;" height="180" src="http://cromwellhaus.com/blogphotos/Vacationatyourownperil_7D79/DSC00253_thumb4.jpg" width="240" align="left" border="0" alt="" /&gt;&lt;/a&gt; We wanted Rick to feel special, so we gave him his very own POS!&lt;/p&gt; &lt;p&gt;&lt;a href="http://cromwellhaus.com/blogphotos/Vacationatyourownperil_7D79/DSC002543.jpg"&gt;&lt;img style="border-right:0px;border-top:0px;margin:0px 0px 0px 10px;border-left:0px;border-bottom:0px;" height="180" src="http://cromwellhaus.com/blogphotos/Vacationatyourownperil_7D79/DSC00254_thumb1.jpg" width="240" align="left" border="0" alt="" /&gt;&lt;/a&gt;&amp;nbsp;Meetings are going to be so much more&amp;nbsp;productive now!&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;This one should be in the Louvre!&amp;nbsp; &lt;a href="http://cromwellhaus.com/blogphotos/Vacationatyourownperil_7D79/DSC002551.jpg"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="180" src="http://cromwellhaus.com/blogphotos/Vacationatyourownperil_7D79/DSC00255.jpg" width="240" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=169" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=K5jTcpl1"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=1JQPMp00"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=1JQPMp00" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=s26ca1up"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=s26ca1up" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/qWt5Z1ROJ6A" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Personal/default.aspx">Personal</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2007/04/16/vacation-at-your-own-peril.aspx</feedburner:origLink></item><item><title>XSL Transforms applied to XML namespaces</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/Du0gu7W9Awc/xsl-transforms-applied-to-xml-namespaces.aspx</link><pubDate>Wed, 04 Apr 2007 16:22:54 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:163</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=163</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=163</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2007/04/04/xsl-transforms-applied-to-xml-namespaces.aspx#comments</comments><description>&lt;p&gt;I&amp;#39;m pretty sure I have run across this in the past, but apparently I&amp;#39;ve avoided complex XSL transforms successfully for long enough that my mind was purged of how namespaces impact your transforms.&amp;nbsp; Today I was working on our .Net 2.0 build process and was attempting to apply a transform to the *.xxproj file that Visual Studio generates, but I was getting anything but what I would have expected.&lt;/p&gt; &lt;p&gt;My goal was simply to copy everything into a new msbuild file, but swap out the &amp;lt;ProjectReference /&amp;gt; elements with &amp;lt;Reference /&amp;gt; elements that pointed to a&amp;nbsp;static version.&amp;nbsp; Our reasoning&amp;#39;s are a topic for another day, but suffice it to say we are control freaks and MSBuild&amp;#39;s apparent omniscience is not something we wish to rely on.&lt;/p&gt; &lt;p&gt;Most people tend to avoid namespace in their custom structures, because they are time consuming to get correct and, in many cases, people don&amp;#39;t understand XSD well enough (understandable).&amp;nbsp; We use them in many cases, but we rarely apply XSLT&amp;#39;s to these documents so the issue doesn&amp;#39;t commonly present itself.&amp;nbsp; Visual Studio on the other hand, does&amp;nbsp;specify the MSBuild namespace declaration at the &amp;lt;Project /&amp;gt; root.&amp;nbsp; This means I have to account for it in my XSLT.&amp;nbsp; Take the following snippet:&lt;/p&gt; &lt;blockquote&gt; &lt;div&gt;&lt;font color="#0000ff" size="3"&gt;&lt;font size="2"&gt;&amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font color="#800000"&gt;Books&lt;/font&gt;&lt;font color="#ff00ff"&gt; &lt;/font&gt;&lt;font color="#ff0000"&gt;xmlns&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;http://schemas.cromwellhaus.com/samples/books&amp;quot;&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;div style="margin-left:10px;"&gt;&lt;font size="2"&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;Book&lt;/font&gt;&lt;font color="#ff00ff"&gt; &lt;/font&gt;&lt;font color="#ff0000"&gt;title&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;Applications = Code + Markup&amp;quot;&lt;/font&gt;&lt;font color="#ff00ff"&gt; &lt;/font&gt;&lt;font color="#ff0000"&gt;author&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;Charles Petzold&amp;quot;&lt;/font&gt;&lt;font color="#ff00ff"&gt; &lt;/font&gt;&lt;font color="#0000ff"&gt;/&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;div style="margin-left:10px;"&gt;&lt;font size="2"&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;Book&lt;/font&gt;&lt;font color="#ff00ff"&gt; &lt;/font&gt;&lt;font color="#ff0000"&gt;title&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;SQL Server 2000 DTS&amp;quot;&lt;/font&gt;&lt;font color="#ff00ff"&gt; &lt;/font&gt;&lt;font color="#ff0000"&gt;author&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;Mark Chaffin&amp;quot;&lt;/font&gt;&lt;font color="#ff00ff"&gt; &lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;/&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;div&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;&amp;lt;/&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt;&lt;font size="2"&gt;&lt;font color="#800000"&gt;Books&lt;/font&gt;&lt;font color="#0000ff" size="3"&gt;&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt;&lt;font size="2"&gt;&lt;font color="#0000ff" size="3"&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt; &lt;p&gt;In this case, one would have to specify the &amp;lt;Books /&amp;gt; default namespace in their XSLT in order to reference the elements in their transform.&amp;nbsp; The corresponding XSLT:&lt;/p&gt; &lt;blockquote&gt;&lt;font color="#0000ff" size="3"&gt; &lt;div&gt;&lt;font size="2"&gt;&amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font color="#800000"&gt;xsl:stylesheet&lt;/font&gt;&lt;font color="#ff00ff"&gt; &lt;/font&gt;&lt;font color="#ff0000"&gt;version&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;1.0&amp;quot;&lt;/font&gt;&lt;font color="#ff00ff"&gt; &lt;/font&gt;&lt;font color="#800000"&gt;xmlns&lt;/font&gt;&lt;font color="#ff00ff"&gt;:&lt;/font&gt;&lt;font color="#ff0000"&gt;xsl&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;a href="http://www.w3.org/1999/XSL/Transform"&gt;http://www.w3.org/1999/XSL/Transform&lt;/a&gt; &lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font color="#800000"&gt;xmlns&lt;/font&gt;&lt;font color="#ff00ff"&gt;:&lt;/font&gt;&lt;font color="#ff0000"&gt;bks&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;http://schemas.cromwellhaus.com/samples/books&amp;quot;&amp;gt;&lt;/font&gt;&lt;/font&gt;&amp;nbsp;&lt;/div&gt;&lt;font size="3"&gt; &lt;div style="margin-left:10px;"&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;xsl:template&lt;/font&gt;&lt;font color="#ff00ff"&gt; &lt;/font&gt;&lt;font color="#ff0000"&gt;match&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;bks:Books&amp;quot;&lt;/font&gt;&lt;font color="#ff00ff"&gt; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;div style="margin-left:10px;"&gt;&lt;font size="2"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;xsl:apply-templates &lt;/font&gt;&lt;font color="#ff0000"&gt;select&lt;/font&gt;&lt;font color="#0000ff"&gt;=&amp;quot;./Book&amp;quot;&lt;/font&gt;&lt;font color="#ff00ff"&gt; &lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt;&lt;/font&gt;&lt;/font&gt; &lt;div style="margin-left:10px;"&gt;&lt;font size="2"&gt;&lt;font color="#0000ff"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="#800000"&gt;xsl:template&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="3"&gt;&lt;/div&gt;&lt;/font&gt; &lt;div&gt;&lt;font size="2"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;&amp;lt;/&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font color="#800000"&gt;xsl:stylesheet&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt;&lt;/font&gt;&lt;/blockquote&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=163" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=UqCfmpfw"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=1XqczZAh"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=1XqczZAh" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=A0nFzaJT"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=A0nFzaJT" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/Du0gu7W9Awc" height="1" width="1"/&gt;</description><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2007/04/04/xsl-transforms-applied-to-xml-namespaces.aspx</feedburner:origLink></item><item><title>Microsoft Expression Blend available to from MSDN</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/JGnEskG4V3Q/microsoft-expression-blend-available-to-from-msdn.aspx</link><pubDate>Tue, 03 Apr 2007 20:18:23 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:162</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=162</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=162</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2007/04/03/microsoft-expression-blend-available-to-from-msdn.aspx#comments</comments><description>&lt;p&gt;One of the cool tools we had a chance to use while up at the WPF Bootcamp in Redmond was &lt;a href="http://www.microsoft.com/expression/products/overview.aspx?key=blend"&gt;Expression Blend&lt;/a&gt;.&amp;nbsp; While there I became pretty engrossed in the ease with which you could create fairly cool animations without an intimate knowledge of Xaml.&amp;nbsp; This made it all that harder to leave seeing as we had the latest bits at the time (the &lt;a href="http://www.microsoft.com/products/expression/en/expression-blend/try.mspx"&gt;Release Candidate&lt;/a&gt;&amp;nbsp;is available as a 30 trial).&amp;nbsp; Fortunately, or gratefully?, Microsoft has &lt;a href="http://blogs.msdn.com/somasegar/archive/2007/04/03/listening-to-your-feedback-expression-and-msdn.aspx"&gt;decided&lt;/a&gt; to make it available on &lt;a href="http://msdn2.microsoft.com/subscriptions"&gt;MSDN&lt;/a&gt;.&amp;nbsp; That means me!&lt;/p&gt; &lt;p&gt;I will say though, while reading &lt;a href="http://www.charlespetzold.com/blog/blog.xml"&gt;Charles Petzold&lt;/a&gt;&amp;#39;s book &lt;a title="Application = Code + Markup" href="http://www.amazon.com/exec/obidos/redirect?path=ASIN/0735619573&amp;amp;link_code=as2&amp;amp;camp=1789&amp;amp;tag=ryancrom-20&amp;amp;creative=9325" target="_new"&gt;&lt;img hspace="5" src="http://images.amazon.com/images/P/0735619573.01._AA_SCTZZZZZZZ_.jpg" align="right" border="0" alt="" /&gt;&lt;/a&gt;&lt;a href="http://www.amazon.com/exec/obidos/redirect?path=ASIN/0735619573&amp;amp;link_code=as2&amp;amp;camp=1789&amp;amp;tag=ryancrom-20&amp;amp;creative=9325"&gt;Application = Code + Markup&lt;/a&gt;&amp;nbsp;which starts with Code and then moves to Xaml, I believe developers and designers alike will be fooled into trying to&amp;nbsp;generate a number of more complex animations with paths, triggers/timelines, etc. rather than implement new animations via code.&amp;nbsp; &lt;a href="http://blogs.msdn.com/karstenj/default.aspx"&gt;Karsten Januszewski&lt;/a&gt;, who we were lucky enough to meet last week, pointed this exact scenario out while I was attempting to mimic the &lt;a href="http://www.microsoft.com/casestudies/casestudy.aspx?casestudyid=201147"&gt;North Face kiosk carousel&lt;/a&gt;&amp;nbsp;via a path.&amp;nbsp; He referenced a&amp;nbsp;&lt;a href="http://blogs.msdn.com/karstenj/archive/2007/02/23/inspired-by-flash-math-creativity-2-wpf-planets.aspx"&gt;previous post&lt;/a&gt;&amp;nbsp;of his&amp;nbsp;which shows how to create a custom animation.&amp;nbsp; Until I grasp the animation framework in WPF, I&amp;#39;ll not risk embarrassing myself by attempting to better explain what Karsten already does much better than I.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=162" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=mZgTq01k"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=2xEC5H21"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=2xEC5H21" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=DvuYIm2r"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=DvuYIm2r" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/JGnEskG4V3Q" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/.Net/default.aspx">.Net</category><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/WPF/default.aspx">WPF</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2007/04/03/microsoft-expression-blend-available-to-from-msdn.aspx</feedburner:origLink></item><item><title>WPF Bootcamp Day 2 - Blend</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/ONYO0rpxZok/wpf-bootcamp-day-2-blend.aspx</link><pubDate>Sun, 01 Apr 2007 03:47:42 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:159</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=159</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=159</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2007/04/01/wpf-bootcamp-day-2-blend.aspx#comments</comments><description>&lt;p&gt;&lt;em&gt;[Update: These are being posted due to the &lt;a title="WPF Bootcamp Day 3 - FTP Problems from the Technology Center" href="http://cromwellhaus.com/blogs/ryanc/archive/2007/03/28/wpf-bootcamp-day-3-ftp-problems-from-the-technology-center.aspx"&gt;ftp access restrictions&lt;/a&gt; at the Microsoft Campus]&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Today has been pretty intense which has kept me away from blogging &amp;quot;live&amp;quot;.&amp;nbsp; Today started with &lt;a title="Kevin Moore" href="http://blogs.msdn.com/okoboji/"&gt;Kevin Moore&lt;/a&gt;, Program Manager for WPF/Blend(?),&amp;nbsp;and a lightning round with &lt;a title="Microsoft Express Blend&amp;trade;" href="http://www.microsoft.com/products/expression/en/expression-blend/default.mspx"&gt;Expression Blend&lt;/a&gt;.&amp;nbsp; As I mentioned &lt;a href="http://cromwellhaus.com/blogs/ryanc/archive/2007/03/26/wpf-bootcamp-day-1-expression.aspx"&gt;yesterday,&lt;/a&gt; I&amp;#39;m not a designer, so Kevin had my mind spinning before breakfast had even settled.&amp;nbsp; &lt;/p&gt; &lt;p&gt;For those dev-signers (developers who design out of necessity) Blend is initially a very overwhelming experience.&amp;nbsp; Don&amp;#39;t expect to create the &lt;a title="North Face WPF Demo at PDC" href="http://channel9.msdn.com/Showpost.aspx?postid=116327"&gt;North Face demo&lt;/a&gt; your first time out.&amp;nbsp; That said, I was able grasp the benefit of a few concepts including &lt;a href="http://msdn2.microsoft.com/en-us/library/ms742521.aspx"&gt;DataTemplates&lt;/a&gt; and &lt;a href="http://msdn2.microsoft.com/en-us/library/ms745683.aspx"&gt;Styles&lt;/a&gt;.&amp;nbsp; This stuff is like OO for UI.&amp;nbsp; Pretty cool.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;a href="http://cromwellhaus.com/blogphotos/WPFBootcampDay2Blend_DDDB/WPFBootcampBlendButton113.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="40" src="http://cromwellhaus.com/blogphotos/WPFBootcampDay2Blend_DDDB/WPFBootcampBlendButton11_thumb.png" width="129" border="0" alt="" /&gt;&lt;/a&gt; As soon as Kevin had lost me (quickly), I decided to start playing with Blend Styles and Templates.&amp;nbsp; At the same time, I decided I&amp;#39;d design my own button.&amp;nbsp; It turns out my reasoning for wanting to do this, super-rounded ends, were already possible in the standard button, but it was a good learning experience.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Styles&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Styles are pretty straight forward and many references to CSS have been made.&amp;nbsp; Styles seem to be a way to share design properties between elements, especially similar elements.&amp;nbsp; It seems pretty intuitive, but every time you change the visual appearance of a control, even via Visual Studio or XamlPad, you are styling your control/element.&amp;nbsp; It becomes really powerful as you share these styles across your project by including these styles in your App Resources section.&amp;nbsp; From within Blend this is pretty easy after you&amp;#39;ve gone through and stylized one of your controls by selecting that element and going to the Object -&amp;gt; Edit Style -&amp;gt; Edit Copy.&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt; &lt;p&gt;You can then Right Click your other elements, go to Edit Control Parts (Template) -&amp;gt; Apply Resource and Select the Style you just created.&amp;nbsp; You now have a sharable style across your WPF application.&amp;nbsp; I&amp;#39;m still curious about the ability of sharing these styles across multiple projects and applications if you have a suite of tools.&amp;nbsp; Are these considered&amp;nbsp;Assets for &lt;a href="http://www.microsoft.com/products/expression/en/Expression-Media/default.mspx"&gt;Expression Media&lt;/a&gt;?&amp;nbsp; That would be cool.&lt;/p&gt; &lt;p&gt;&lt;a href="http://cromwellhaus.com/blogphotos/WPFBootcampDay2Blend_DDDB/WPFBootcampBlendButton1CreateEmptySt.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="207" src="http://cromwellhaus.com/blogphotos/WPFBootcampDay2Blend_DDDB/WPFBootcampBlendButton1CreateEmptySt1.png" width="240" border="0" alt="" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;strong&gt;Templates&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;The way I feel Templating is best described in relationship to Styling is to say that Styling helps describe the visual appearance of one or more elements, while templating describes the Element tree that makes up a visual entity.&amp;nbsp; For instance, my button above used a template to combine two Ellipses and a Rectangle.&amp;nbsp; But an ellipse on each end of the Rectangle and you&amp;#39;ve got a rounded edge button.&lt;/p&gt; &lt;p&gt;To get started with templating, I right click on the standard button and drilled down to Edit Control Parts (Template) -&amp;gt; Create Empty.&amp;nbsp; If you&amp;#39;ve done cool stuff with your element already, you can Edit Copy and apply that to other elements rather than start over.&amp;nbsp; I&amp;#39;ll go over a demo to create a pretty cool button that uses lots of composite elements to have rollover effects (glow), transition effects, etc.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;a href="http://cromwellhaus.com/blogphotos/WPFBootcampDay2Blend_DDDB/WPFBootcampBlendButton1CreateEmptyTe.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="240" src="http://cromwellhaus.com/blogphotos/WPFBootcampDay2Blend_DDDB/WPFBootcampBlendButton1CreateEmptyTe1.png" width="229" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=159" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=OcCyVD53"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=oWn4uvus"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=oWn4uvus" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=ji8JhzHe"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=ji8JhzHe" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/ONYO0rpxZok" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/.Net/default.aspx">.Net</category><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/WPF/default.aspx">WPF</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2007/04/01/wpf-bootcamp-day-2-blend.aspx</feedburner:origLink></item><item><title>Powershell</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/xMG46sbvDvo/powershell.aspx</link><pubDate>Wed, 28 Mar 2007 18:50:33 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:158</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=158</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=158</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2007/03/28/powershell.aspx#comments</comments><description>&lt;p&gt;Yesterday I had a had a chance to have dinner and drinks with another group here for a Technology Summit hosted by Microsoft.&amp;nbsp; They get a bunch of representatives from parallel and alternate technology groups such as PHP, Linux, Java, Python, etc together and discuss they reasons for Microsoft decisions, show off Microsoft focused options for solving problems, and just generally discuss the technology ecosystem.&amp;nbsp; &lt;/p&gt; &lt;p&gt;One of the people I managed to talk to in depth was an integral part&amp;nbsp;of the &lt;a title="Windows Powershell" href="http://www.microsoft.com/windowsserver2003/technologies/management/powershell/default.mspx"&gt;Powershell&lt;/a&gt; team.&amp;nbsp; He helped write the language and has been with the team since inception.&amp;nbsp; I personally have pretty limited experience in the *nix environment so comparing shells is difficult for me, but he helped me understand some things.&amp;nbsp; One thing he pointed to as a the cause of some angst between *nix administrators and Windows administrators is the ease of administering a *nix system without a full blown interactive session.&amp;nbsp; A *nix administrator has the option to open an SSH session and has full shell access to the system.&amp;nbsp; Adding a DNS entry for instance is 3 lines of shell command rather than opening the DNS MMC console, expanding some trees, opening a dialog, clicking a few times, then actually adding the record you intended initially, then confirming it 3 times before closing the console.&lt;/p&gt; &lt;p&gt;Contrary to my understanding, it was an option to recreate the *nix shells in the Windows environment.&amp;nbsp; Instead the goal was to create a platform that would enable the end-game of creating cmdlets which can/will enable administrators to administer their systems in as productive a manner as any other platform.&lt;/p&gt; &lt;p&gt;One of my questions to him was regarding v2 of Powershell.&amp;nbsp; He mentioned that the focus would be in 3 areas: remote connectivity (i.e. SSH), a more powerful interface to powershell (apparently there&amp;#39;s more to moving around the powershell than arrow-keys and tabbing), and a more broad library of cmdlets.&amp;nbsp;&lt;/p&gt; &lt;p&gt;Also announced yesterday was the &lt;a title="Powershell to be in Longhorn Server" href="http://blogs.msdn.com/powershell/archive/2007/03/28/announced-powershell-to-ship-in-windows-server-longhorn.aspx"&gt;inclusion of Powershell in the upcoming Longhorn Server release&lt;/a&gt;.&amp;nbsp; Very exciting.&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=158" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=qod8NTPu"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=R9DRirp5"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=R9DRirp5" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=ekOqoGmu"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=ekOqoGmu" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/xMG46sbvDvo" height="1" width="1"/&gt;</description><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2007/03/28/powershell.aspx</feedburner:origLink></item><item><title>WPF Bootcamp Day 3 - Hardware capability</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/qbq9-Eo2l7s/wpf-bootcamp-day-3-hardware-capability.aspx</link><pubDate>Wed, 28 Mar 2007 18:05:03 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:157</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=157</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=157</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2007/03/28/wpf-bootcamp-day-3-hardware-capability.aspx#comments</comments><description>&lt;p&gt;To avoid disappointing users after they&amp;#39;ve gotten as far as running your application on their 1997 300mhz Pentium II, determine their capabilities using the &lt;a href="http://msdn2.microsoft.com/en-us/library/system.windows.media.rendercapability.tier.aspx"&gt;RenderCapability.Tier&lt;/a&gt; value before hand and notifying them that they&amp;#39;ll need to joing the 21st century before running your app.&amp;nbsp; &lt;/p&gt; &lt;p&gt;&lt;a title="RenderCapabilities.Tier" href="http://blogs.msdn.com/henryh/archive/2006/08/23/719568.aspx"&gt;Henry Hahn&lt;/a&gt; has a quick overview and, the&amp;nbsp;always welcome, code samples of using this value to make your application conform to the different tiers.&lt;/p&gt; &lt;p&gt;Don&amp;#39;t forget your bit shifting, cause the Tier is set up to support new Tiers/platforms in future releases.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=157" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=bJsUj6fB"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=H3G5KA1b"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=H3G5KA1b" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=YlUCAept"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=YlUCAept" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/qbq9-Eo2l7s" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/.Net/default.aspx">.Net</category><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/WPF/default.aspx">WPF</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2007/03/28/wpf-bootcamp-day-3-hardware-capability.aspx</feedburner:origLink></item><item><title>WPF Bootcamp Day 3 - FTP Problems from the Technology Center</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/8S3taXr4UBo/wpf-bootcamp-day-3-ftp-problems-from-the-technology-center.aspx</link><pubDate>Wed, 28 Mar 2007 15:32:01 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:156</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=156</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=156</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2007/03/28/wpf-bootcamp-day-3-ftp-problems-from-the-technology-center.aspx#comments</comments><description>&lt;p&gt;You may have noticed there were not many blog entries for Day 2.&amp;nbsp; It turns out there&amp;#39;s no way to ftp stuff out of the technology center.&amp;nbsp; It&amp;#39;s hindering my ability to post with pictures/screen captures.&amp;nbsp; I&amp;#39;ve got a bunch of posts for you as soon as I figure this out.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Stay tuned.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=156" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=GvOWx3pw"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=zJv7e45P"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=zJv7e45P" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=d1yQVQOg"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=d1yQVQOg" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/8S3taXr4UBo" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/WPF/default.aspx">WPF</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2007/03/28/wpf-bootcamp-day-3-ftp-problems-from-the-technology-center.aspx</feedburner:origLink></item><item><title>Bringing down an Oracle 9i on Windows instance</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/fbZYWqO2cMk/bringing-down-an-oracle-9i-on-windows-instance.aspx</link><pubDate>Tue, 27 Mar 2007 16:14:00 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:154</guid><dc:creator>cromwellryan</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=154</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=154</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2007/03/27/bringing-down-an-oracle-9i-on-windows-instance.aspx#comments</comments><description>&lt;p&gt;The &lt;a href="http://www.speedyrewards.com"&gt;Speedy Rewards&lt;/a&gt;&amp;nbsp;program is backed by two pretty hefty &lt;a href="http://www.oracle.com/technology/products/oracle9i/datasheets/rac/rac_rel2_ds.html"&gt;Oracle 9i RAC&lt;/a&gt; instances.&amp;nbsp; One is for the OLTP and the other for data-warehousing analytics.&amp;nbsp; Since it&amp;#39;s inception we&amp;#39;ve pretty impressive success with the uptime and performance, though one glaring problem has plagued us now for going on 4 years.&amp;nbsp; Every 3 days, whoever is on call is required to reboot EACH instance of the cluster to avoid a &amp;quot;&lt;a href="http://docs.huihoo.com/oracle/docs/B19306_01/rac.102/b14197/rac_glossary.htm#CHDBEGFH"&gt;Split Brain&lt;/a&gt;&amp;quot;.&amp;nbsp; This is compounded by the fact that the third-party software that we have purchased to manage high-performance points, offers, awards, etc. presentation to our members maintains open connections as long as the application server is running, never closing them or validating themselves.&amp;nbsp; So basically, this third-party software has negated most of the benefit of a RAC cluster in that there is no load balancing (RAC redirects on the initial connection.Open, not between command executions - sticky connections) and there is no failover during our 3 day reboots.&amp;nbsp; We must effectively go offline every three days for about 10 minutes.&amp;nbsp; Not good for a &amp;lt;1% SLA on greater than &amp;quot;a lot&amp;quot; (that&amp;#39;s lawyer speak) per day.&lt;/p&gt; &lt;p&gt;I could spend all day trying to&amp;nbsp;reiterate their reasoning for maintaining open connections forever, not&amp;nbsp;re-connecting them, or even their decision to take down their entire application server (not physical server but the windows services that encompass their application) when connections begin to fail.&amp;nbsp; I&amp;#39;ll allow you all to come to your own conclusions as to the competence of this company that shall remain nameless.&lt;/p&gt; &lt;p&gt;After 4 years of open &amp;quot;TAR&amp;#39;s&amp;quot; with Oracle, numerous consultants, configuration changes, and eventually a plan to migrate these instances to 10g on Linux we believe we stumbled upon the root cause.&amp;nbsp; We are all aware, I hope, of Windows Perfmon/Performance Counters and how very helpful they can be in giving insight into your running applications.&amp;nbsp; Well it turns out that Oracle exposes performance counters, but the underlying implementation of these counters login and extract the counter data directly from the target instances.&amp;nbsp; In order for Oracle to do this it provides a set of configurations for specifying the login, instance information, etc for the counters to use.&amp;nbsp; Here comes the kicker - that login must be VALID.&amp;nbsp; Yes, if it&amp;#39;s not valid and you have a tool which try to open these performance counters pretty often like &lt;a href="http://g.msn.com/9SE/1?http://www.microsoft.com/mom/&amp;amp;&amp;amp;DI=6244&amp;amp;IG=c74083987ee44fa690049d6c513c311b&amp;amp;POS=1&amp;amp;CM=DEF&amp;amp;CE=1&amp;amp;CS=AWP&amp;amp;SR=1" title="Microsoft Operations Manager"&gt;MOM&lt;/a&gt;&amp;nbsp;your&amp;nbsp;Oracle process&amp;nbsp;will, over time, leak Virtual Bytes and the Oracle Process will crash, causing a Split Brain.&lt;/p&gt; &lt;p&gt;Long story short, if you&amp;#39;re interested in crashing an Oracle 9i instance, try to login over and over with an invalid login.&amp;nbsp; Now would you call that a bug?&amp;nbsp; A pretty glaring one if you ask me.&lt;/p&gt; &lt;p&gt;Here is a &lt;a href="http://download-east.oracle.com/docs/cd/B10501_01/win.920/a95490/registry.htm#1005939" title="Parameters for Oracle Performance Monitor for Windows NT"&gt;link&lt;/a&gt; to the configuration settings article which details what we had to do to resolve this issue.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=154" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=SSHmxK9d"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=7zVO3S1L"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=7zVO3S1L" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=jVhNAuuc"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=jVhNAuuc" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/fbZYWqO2cMk" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Oracle/default.aspx">Oracle</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2007/03/27/bringing-down-an-oracle-9i-on-windows-instance.aspx</feedburner:origLink></item><item><title>WPF Bootcamp Day 1 - Expression</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/9MZq4AFR4hg/wpf-bootcamp-day-1-expression.aspx</link><pubDate>Mon, 26 Mar 2007 21:05:00 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:149</guid><dc:creator>cromwellryan</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=149</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=149</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2007/03/26/wpf-bootcamp-day-1-expression.aspx#comments</comments><description>&lt;p&gt;For those who don&amp;#39;t already know, I want to make it perfectly clear that I am the last person you would ask to design an appealling interface.&amp;nbsp; Messaging, thread syncronization, etc I&amp;#39;m your guy, but pretty pictures I am not.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=149" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=66EzqoYP"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=89NSUrWk"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=89NSUrWk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=GE21PoCm"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=GE21PoCm" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/9MZq4AFR4hg" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/.Net/default.aspx">.Net</category><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/WPF/default.aspx">WPF</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2007/03/26/wpf-bootcamp-day-1-expression.aspx</feedburner:origLink></item><item><title>WPF Bootcamp Day 1 - Visual Studio "Orcas" Demo</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/IlOv4PCTu6o/wpf-bootcamp-day-1-visual-studio-quot-orcas-quot-demo.aspx</link><pubDate>Mon, 26 Mar 2007 20:43:08 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:148</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=148</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=148</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2007/03/26/wpf-bootcamp-day-1-visual-studio-quot-orcas-quot-demo.aspx#comments</comments><description>&lt;p&gt;We moved past the introductions quickly and are getting down and dirty.&amp;nbsp; &lt;a href="http://rrelyea.spaces.live.com/"&gt;Rob Relyea&lt;/a&gt;&amp;nbsp;took us through the basics of WPF from the latest &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=1ff0b35d-0c4a-40b4-915a-5331e11c39e6&amp;amp;DisplayLang=en"&gt;Visual Studio Orcas&lt;/a&gt;&amp;nbsp;perspective.&amp;nbsp; Starting simple by creating a button via Xaml and a duplicate example using purely C# code.&amp;nbsp; I&amp;#39;ve posted a copy of the sample &lt;a href="http://cromwellhaus.com/files/folders/wpf/entry147.aspx"&gt;here&lt;/a&gt;&amp;nbsp;for Visual Studio 2005 with the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=F54F5537-CC86-4BF5-AE44-F5A1E805680D&amp;amp;displaylang=en"&gt;WPF Extensions&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;One of the interesting new classes for you code junkies is the &lt;a href="http://msdn2.microsoft.com/en-us/library/ms668604.aspx"&gt;ObservableCollection&lt;/a&gt;&amp;nbsp;class available now in .Net 3.0.&amp;nbsp; This class implements the &lt;a href="http://msdn2.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx"&gt;INotifyPropertyChanged interface&lt;/a&gt; allowing the dynamic databinding in WPF.&amp;nbsp; This is cool for all sorts of reasons, but specifically because we can use this dynamic, event based collections infrastructure for&amp;nbsp;in memory lists&amp;nbsp;of more than your list of employee names, but also videos, complex business objects like product definitions, pages in a book that you are rendering, or files in a directory which you are monitoring.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=148" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=zKQXaGI7"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=ho3anEKS"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=ho3anEKS" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=HBkknGWe"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=HBkknGWe" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/IlOv4PCTu6o" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/.Net/default.aspx">.Net</category><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/WPF/default.aspx">WPF</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2007/03/26/wpf-bootcamp-day-1-visual-studio-quot-orcas-quot-demo.aspx</feedburner:origLink></item><item><title>WPF Bootcamp Day 1</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/t2B6UeVZ2O8/wpf-bootcamp-day-1.aspx</link><pubDate>Mon, 26 Mar 2007 18:14:42 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:146</guid><dc:creator>cromwellryan</dc:creator><slash:comments>3</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=146</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=146</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2007/03/26/wpf-bootcamp-day-1.aspx#comments</comments><description>&lt;p&gt;My co-worker Steve and I are here in Redmond this week for&amp;nbsp;a &lt;a href="http://wpf.netfx3.com/"&gt;WPF&lt;/a&gt; Bootcamp training session.&amp;nbsp; We started off by meeting the WPF Product Unit Manager, Ian Ellison-Tayler,&amp;nbsp;and Lead Program Manager, Rob Relyea.&amp;nbsp; Ian ran through some existing &lt;a href="http://www.microsoft.com/emea/msdn/thepanel/dadk/featured/wpf_cornucopia.aspx"&gt;WPF applications floating&lt;/a&gt; around the intersphere.&amp;nbsp; As early as it is for WPF, there are some cool apps already.&amp;nbsp; Take a look at &lt;a href="http://www.ibloks.com/download/"&gt;iBloks&lt;/a&gt;, definitely a fun little app.&amp;nbsp; The &lt;a href="http://ttpdownload.bl.uk/browserapp.xbap"&gt;British Library&lt;/a&gt;&amp;nbsp;has a cool &lt;a title="XBAP Search" href="http://search.live.com/results.aspx?q=xbap"&gt;XBAP&lt;/a&gt;&amp;nbsp;application as well.&lt;/p&gt; &lt;p&gt;Amongst all the glitz and glamour of the pretty pictures and transitions demoed and blogged about are the features of WPF that make those things possible.&amp;nbsp; One of the questions I found very intriguing involved how Xaml and the &amp;quot;Element-Content&amp;quot; model would affect future standards.&amp;nbsp; The &amp;quot;Element/Content&amp;quot; model provides the ability to dress up what is still your standard button with content of all shapes and sizes.&amp;nbsp; Adding animations, movies, complex text&amp;nbsp;to buttons with ease will open up the options for designers and developers to question what is a functional and usable layout for their software.&amp;nbsp; It was met with snickers, but the comment that market dynamics would play out the designs that are acceptable really holds true that the design standards are moving from the platform groups to the designers.&amp;nbsp; What an excitingly simple concept.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=146" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=opFUwEaZ"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=f30oO5Lj"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=f30oO5Lj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=E2iat9ri"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=E2iat9ri" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/t2B6UeVZ2O8" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/.Net/default.aspx">.Net</category><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/WPF/default.aspx">WPF</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2007/03/26/wpf-bootcamp-day-1.aspx</feedburner:origLink></item><item><title>The multilingual family...</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/SwdlAEDI1UI/the-multilingual-family.aspx</link><pubDate>Thu, 08 Mar 2007 04:23:39 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:143</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=143</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=143</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2007/03/08/the-multilingual-family.aspx#comments</comments><description>&lt;p&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;margin:0px 0px 0px 5px;border-right-width:0px;" height="83" src="http://cromwellhaus.com/blogphotos/Themultilingualfamily_14629/baby_eat_melon19.jpg" width="100" align="right" border="0" alt="" /&gt; One of the things we have decided we really want to try with Little Ryan is &lt;a href="http://www.mybabycantalk.com/index.aspx" target="_blank"&gt;Baby Sign Language&lt;/a&gt;.&amp;nbsp; I&amp;#39;ve read a number of great first hand accounts and I&amp;#39;m really excited.&amp;nbsp; Beyond the suggestions that family&amp;#39;s who&amp;#39;ve adopted baby sign language see a reduction in temper tantrums, I&amp;#39;m excited that I&amp;#39;ll have at least a few extra months and, maybe, even a years worth of solid communication with my son.&lt;/p&gt; &lt;p&gt;For those that are interested, the link above to &lt;a href="http://www.mybabycantalk.com/" target="_blank"&gt;My Baby Can Talk&lt;/a&gt; provides a great starting point with a dictionary of &lt;a href="http://www.mybabycantalk.com/content/dictionary/dictionaryofsigns.aspx?letter=D&amp;amp;word=2572cd4c-705c-4730-aec7-d268633a5838" target="_blank"&gt;videos&lt;/a&gt;, Getting-Started lessons, etc.&amp;nbsp; All of the signs in the &lt;a href="http://www.mybabycantalk.com/" target="_blank"&gt;My Baby Can Talk&lt;/a&gt;&amp;nbsp;series are ASL (American Sign Language) signs which means you are on your way to teaching your child a new language.&amp;nbsp; More and more universities are recognizing ASL as a legitimate foreign language, so why not keep going.&lt;/p&gt; &lt;p&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;margin:0px 5px 5px 0px;border-right-width:0px;" height="240" src="http://cromwellhaus.com/blogphotos/Themultilingualfamily_14629/nacholibregwf15.jpg" width="154" align="left" border="0" alt="" /&gt;&amp;nbsp;At the same time that we are learning ASL with Little Ryan, I&amp;#39;m diving back into high school Spanish (Latin American style this time)!&amp;nbsp; As with most, I blew off my foreign language in high school, but I&amp;#39;ve always regretted it.&amp;nbsp; How cool would it be to strike up a conversation with someone in another language.&amp;nbsp; Not to mention being able to understand when an overworked waiter starts ripping you for being those guys at lunch.&lt;/p&gt; &lt;p&gt;A while back I ran across the &lt;a href="http://www.rosettastone.com/"&gt;Rosetta Stone&lt;/a&gt;&amp;nbsp;web site and I tried out one of their demos.&amp;nbsp; They use a technique call &lt;a href="http://www.rosettastone.com/en/individuals/method"&gt;Dynamic Immersion™&lt;/a&gt;&amp;nbsp;that is absolutely awesome.&amp;nbsp; Why&amp;nbsp;educators feel it&amp;#39;s effective (or maybe the better word is efficient)&amp;nbsp;to memorize the &amp;lt;Your-Language-Here&amp;gt; to English dictionary is&amp;nbsp; beyond me.&amp;nbsp; Instead, &lt;a href="http://www.rosettastone.com/"&gt;Rosetta Stone&lt;/a&gt;&amp;nbsp;completely ignores your primary languages and uses a mix of visual, audio, and written scenes in the target language to make you decipher your way to competence.&amp;nbsp; This is what we all did as children and, with the exception of our beloved President, it worked out pretty well.&amp;nbsp; &lt;/p&gt; &lt;p&gt;I&amp;#39;ve only recently received the CD&amp;#39;s and spent a little time, but as I move along I will try to post my thoughts.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=143" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=9TvfbfG1"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=XDhdaGMt"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=XDhdaGMt" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=oBB2rmt4"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=oBB2rmt4" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/SwdlAEDI1UI" height="1" width="1"/&gt;</description><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2007/03/08/the-multilingual-family.aspx</feedburner:origLink></item><item><title>WMI and the Win32_Product Class </title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/eLph2EGfbhk/66.aspx</link><pubDate>Wed, 31 May 2006 21:05:00 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:66</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=66</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=66</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2006/05/31/66.aspx#comments</comments><description>&lt;P&gt;Our build process is pretty seamless all the way through to an Integration environment which sits right between Development (laptop/workstation) and Certification (keep your muddy paws off land).&amp;nbsp; With this automation and continuous integration in general, comes a large amount of excess in the form of intermediate versions.&amp;nbsp; During a recent upgrade to Window 2003 (don’t ask why it took so long) we found that the little utility that keeps this Integration environment clean started getting fussy.&amp;nbsp; Well it turns out that you have to install the WMI Windows Installer Provider explicitly.&amp;nbsp; Here’s how to find it:&lt;o:p&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;
&lt;DIV&gt;Control Panel – Add or Remove Programs&lt;o:p&gt;&lt;/o:p&gt;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV&gt;Add/Remove Windows Components&lt;o:p&gt;&lt;/o:p&gt;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV&gt;Select Management and Monitoring Tools&lt;o:p&gt;&lt;/o:p&gt;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV&gt;Click Details&lt;o:p&gt;&lt;/o:p&gt;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV&gt;Check the &lt;I&gt;WMI Windows Installer Provider&lt;/I&gt; subcomponent&lt;o:p&gt;&lt;/o:p&gt;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV&gt;Click Ok&lt;o:p&gt;&lt;/o:p&gt;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV&gt;Click Next&lt;o:p&gt;&lt;/o:p&gt;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV&gt;Do a jig.&lt;o:p&gt;&lt;/o:p&gt;&lt;/DIV&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=66" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=iCID2TJd"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=kthj02Ge"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=kthj02Ge" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=67QP3ey2"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=67QP3ey2" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/eLph2EGfbhk" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/.Net/default.aspx">.Net</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2006/05/31/66.aspx</feedburner:origLink></item><item><title>SQL Reporting Services Unattended Install Documentation Bug</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/urwn2NSctco/54.aspx</link><pubDate>Tue, 07 Mar 2006 04:53:51 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:54</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=54</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=54</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2006/03/07/54.aspx#comments</comments><description>For those that are trying to package and deploy the SQL Reporting Services 2000 Designer tools, there is a little bug in the documentation.  It states that in order to include the Reporting Service Books Online feature, you should use the setting RS_BooksOnline_ as an ADDLOCAL parameter value.  In fact, the Template.ini and documentation give the example RS_BooksOnline_EN.  BUUUUUUT, it really should read RS_BooksOnline_1033.  Just a hint in case you run into it, 'cause you'll have to go looking through MSI logs to find it.&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=54" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=AcGnIOly"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=iqj4JpqG"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=iqj4JpqG" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=N3SSfS4A"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=N3SSfS4A" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/urwn2NSctco" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Software+Reviews/default.aspx">Software Reviews</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2006/03/07/54.aspx</feedburner:origLink></item><item><title>Free March Madness Video Feeds?  I'm so there!</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/TRGxGIyIAZo/53.aspx</link><pubDate>Mon, 06 Mar 2006 21:23:34 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:53</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=53</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=53</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2006/03/06/53.aspx#comments</comments><description>I don't understand how more media content providers don't see the benefit of a free test drive.  I'll be all over &lt;a href="http://www.ncaasports.com/mmod/"&gt;CBS Sportsline&lt;/a&gt; for the &lt;a href="http://www.ncaasports.com/mmod/"&gt;March Madness On Demand&lt;/a&gt; live video feeds free for the first three rounds and I'm sure I'll get sucked into paying for the rest of it.&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=53" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=A7qTOjQa"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=bmRJZ2T1"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=bmRJZ2T1" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=Ngc6YDz6"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=Ngc6YDz6" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/TRGxGIyIAZo" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Personal/default.aspx">Personal</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2006/03/06/53.aspx</feedburner:origLink></item><item><title>Windows Live Messenger Beta Update</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/tH4NYaGY4ac/windows-live-messenger-beta-update.aspx</link><pubDate>Mon, 06 Mar 2006 00:36:00 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:51</guid><dc:creator>cromwellryan</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=51</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=51</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2006/03/05/windows-live-messenger-beta-update.aspx#comments</comments><description>This week the Windows Live group released an update to the &lt;a href="http://ideas.live.com/programPage.aspx?versionId=0eccd94b-eb48-497c-8e60-c6313f7ebb73"&gt;Windows Live Messenger Beta&lt;/a&gt; (MSN Messenger 8.0). There were a couple of major things with the initial release &lt;a class="" href="http://www.cromwellhaus.com/blogs/ryanc/archive/2006/01/13/36.aspx"&gt;that I reported&lt;/a&gt; and they seem to have been resolved. If you&amp;#39;d like to give it a chance, I have a few new invites that I can give out to those who are interested and I&amp;#39;m sure I&amp;#39;ll receive some more shortly thereafter. Leave your email in the comments and I&amp;#39;ll do my best.&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=51" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=rtbjHl9k"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=tvF3mQOR"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=tvF3mQOR" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=8Ie48tDU"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=8Ie48tDU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/tH4NYaGY4ac" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Software+Reviews/default.aspx">Software Reviews</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2006/03/05/windows-live-messenger-beta-update.aspx</feedburner:origLink></item><item><title>Rehearsal Dinner at Claddagh Pub</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/wKoN5Kn_-F4/50.aspx</link><pubDate>Wed, 22 Feb 2006 22:29:00 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:50</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=50</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=50</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2006/02/22/50.aspx#comments</comments><description>&lt;P&gt;&lt;/P&gt;
&lt;P&gt;We booked the &lt;A href="http://www.claddaghirishpubs.com/locationdetail.php?loc_id=24"&gt;Claddagh Pub in Mason&lt;/A&gt; for the rehearsal dinner.&amp;nbsp; If you haven't been there, it's amazing.&amp;nbsp; They actually brought Irish builders over to design and show the construction crews how to make the place look like an authentic Irish Pub.&amp;nbsp; And the Guinness Stew is amazing!&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=50" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=xthpgjZ4"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=bN5kzcyT"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=bN5kzcyT" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=jMjEVArM"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=jMjEVArM" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/wKoN5Kn_-F4" height="1" width="1"/&gt;</description><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2006/02/22/50.aspx</feedburner:origLink></item><item><title>Dayton-Cincinnati Code Camp reflection...</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/yt57lMLBHKg/45.aspx</link><pubDate>Mon, 23 Jan 2006 14:57:48 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:45</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=45</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=45</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2006/01/23/45.aspx#comments</comments><description>Well the Dayton-Cincinnati Code Camp and my presentation have both come and gone.  In all, the day was  a success, but I was a little disappoint in my session.  Nothing in-particular went wrong, but I just never felt we got into a good flow.  I feel exhaustion took a toll on my presence, but other than that, I can't explain it.  Maybe Andy Roddick and I have just misplaced our mojo temporarily.  We'll have to see.  

Our gracious host &lt;a href="http://frazzleddad.blogspot.com/2006/01/dayton-cincinnati-code-camp-big.html"&gt;Jim Holmes&lt;/a&gt; did a fantastic job.  He says there were glitches, but I never saw them.  I was impressed by the number of sponsors who actually showed up with gifts.  

Here are the session I went to before ducking out a bit early to help a friend move... again.  Oh the life of a truck owner :/

&lt;ol&gt;
&lt;li&gt;&lt;a href="http://daytondevgroup.net/CampSessions.aspx#python"&gt;Python and IronPython&lt;/a&gt; by &lt;a href="http://catherinedevlin.blogspot.com/"&gt;Catherine Devlin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Little nap to make up for no sleep the night before.&lt;/li&gt;
&lt;li&gt;Lunch by Microsoft - who would miss that!&lt;/li&gt;
&lt;li&gt;&lt;a href="http://daytondevgroup.net/campSessions.aspx#wwf"&gt;Windows Workflow Foundation&lt;/a&gt; by &lt;a href="http://mvwood.com/blogs/blog/default.aspx"&gt;Mike Wood&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

I was pretty impressed with Python and IronPython, though it mostly has to do with the cool embedded interpreter in the presentation tool.  I can't imagine using it for anything other than a toy.  WWF was very impressive.  A little confounding as it seemed to jump around a lot, but I'm sure that will tighten up a bit.  I'll definitly be using that in the near future.

I'll have the code from my presentation up on the site soon, so hopefully no-one came running right after the presentation.&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=45" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=87O0zDuK"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=jDK2GDya"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=jDK2GDya" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=tSVVWw8T"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=tSVVWw8T" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/yt57lMLBHKg" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/.Net/default.aspx">.Net</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2006/01/23/45.aspx</feedburner:origLink></item><item><title>Windows Live Mail (Hotmail Kahuna) a work in progress.</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/MreNANfiGMs/44.aspx</link><pubDate>Tue, 17 Jan 2006 14:12:41 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:44</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=44</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=44</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2006/01/17/44.aspx#comments</comments><description>As I mentioned yesterday, I received my &lt;a href="http://spaces.msn.com/members/mailcall/Blog/cns!1pFgRKa8Lr6GIMM5UtTma4pQ!1678.entry"&gt;Windows Live Mail beta invitation&lt;/a&gt; and I've begun using it full time.  It's definitely a functional beta and I must say it's much quicker than it's predecessor, but I'm very glad this is not a completely open beta.  It's pretty unpolished at this point and there are some glaring issues in my opinion.  We'll see how things far in the next update.  Here is what I've found so far:

&lt;h3&gt;Bugs&lt;/h3&gt;
&lt;ul&gt;&lt;li&gt;Allow sender does not show content.&lt;/li&gt;
&lt;li&gt;New Mail doesn't appear until you click on or update the folder list&lt;ol&gt;&lt;li&gt;On page 2&lt;/li&gt;
&lt;li&gt;Sent email from another account&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ideas.live.com/programpage.aspx?versionId=0eccd94b-eb48-497c-8e60-c6313f7ebb73"&gt;Windows Live Messenger&lt;/a&gt; said I had an email&lt;/li&gt;
&lt;li&gt;Paged to page 1 (no new email and count still at 2540)&lt;/li&gt;
&lt;li&gt;Page 2 forward to 2 again (no change in count)&lt;/li&gt;
&lt;li&gt;Clicked Junk e-mail folder&lt;/li&gt;
&lt;li&gt;Inbox went bold and said I had one email&lt;/li&gt;
&lt;li&gt;Clicked Inbox (there it was!)&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;The Insert Search Link icon is cut off.&lt;/li&gt;&lt;/ul&gt;


&lt;h3&gt;Feature Issues&lt;/h3&gt;
&lt;ul&gt;&lt;li&gt;No full screen view of messages!!!&lt;/li&gt;
&lt;li&gt;Stop trying to be so fancy... Attach a File link rather than stupid drop down.  Less is more.&lt;/li&gt;
&lt;li&gt;Tool bar is very tacky and unorganized.  Actions on the email should be together (i.e Send, Save Draft, and Cancel should be next to each other, followed by Attach)&lt;/li&gt;
&lt;li&gt;Consider using the &lt;a href="http://www.telerik.com/"&gt;telerik r.a.d editor&lt;/a&gt;... it's amazing!&lt;/li&gt;
&lt;li&gt;The folder and mail windows do not scale at all when going above 1024x768.  &lt;b&gt;&lt;i&gt;&lt;font color="#FF0000"&gt;UPDATE: This must have been a temporary thing, because it scales just fine now.  Let you know if it happens again.&lt;/font&gt;&lt;/i&gt;&lt;/b&gt;

I've sent these via the ginormous Send Feedback image/link on every page.  I'm sure I'll come up with more.&lt;/li&gt;&lt;/ul&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=44" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=KO2UR9Ba"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=agWMYZhU"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=agWMYZhU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=zNGKayrg"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=zNGKayrg" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/MreNANfiGMs" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Software+Reviews/default.aspx">Software Reviews</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2006/01/17/44.aspx</feedburner:origLink></item><item><title>Windows Live Mail (Hotmail Kahuna) is here!</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/D89SY7nroHI/40.aspx</link><pubDate>Tue, 17 Jan 2006 02:52:01 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:40</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=40</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=40</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2006/01/16/40.aspx#comments</comments><description>I received my invitation to &lt;a href="http://ideas.live.com/programpage.aspx?versionId=5d21c51a-b161-4314-9b0e-4911fb2b2e6d"&gt;Windows LIve Mail&lt;/a&gt; (&lt;a href="http://www.betanews.com/article/Microsoft_Testing_New_Hotmail_Interface/1121099209"&gt;Hotmail Kahuna&lt;/a&gt;) today!  This on top of the &lt;a href="http://www.cromwellhaus.com/CS/blogs/ryanc/archive/2006/01/13/36.aspx"&gt;Windows Live Messenger&lt;/a&gt; invite I received last week make me believe this first quarter is going to be an exciting one to watch.  I have yet to really dig into this new Hotmail release, but rest assured I will let you know what I think soon.&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=40" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=jliYPxgM"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=nXT7zbmQ"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=nXT7zbmQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=HnWNCYqD"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=HnWNCYqD" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/D89SY7nroHI" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Software+Reviews/default.aspx">Software Reviews</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2006/01/16/40.aspx</feedburner:origLink></item><item><title>Windows Live Messenger Beta Invites</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/2SSvs1PkgXg/39.aspx</link><pubDate>Fri, 13 Jan 2006 05:10:00 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:39</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=39</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=39</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2006/01/13/39.aspx#comments</comments><description>I have 3 invites left for Windows Live Messenger and so I'll follow the lead from which I receive my invite.  First 3 emails in the comments will receive an invite.  I'll remove your emails shortly there after so you don't get harvested.&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=39" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=dYKCpi7t"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=PUjzuJ0R"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=PUjzuJ0R" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=UgwKsBjU"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=UgwKsBjU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/2SSvs1PkgXg" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Software+Reviews/default.aspx">Software Reviews</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2006/01/13/39.aspx</feedburner:origLink></item><item><title>Windows Live Messenger Beta</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/IigMr8Xs24w/36.aspx</link><pubDate>Fri, 13 Jan 2006 05:08:00 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:36</guid><dc:creator>cromwellryan</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=36</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=36</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2006/01/13/36.aspx#comments</comments><description>I recently got in on the Windows Live Messenger Beta courtesy of &lt;a href="http://weblogs.asp.net/jan" title="Jan Tielen's"&gt;Jan Tielen's&lt;/a&gt; and I've got to say, I'm a little sceptical.  The real difference is in the interface, not the functionality (how much can you really do with text based chat?).  They have tried to create a more impressive interface, but I believe its a little too clunky.  It is a beta, but it doesn't bode well for "ma and pa."  Here are my initial reactions:

&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Like&lt;/b&gt; the adjustable color scheme.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Dislike&lt;/b&gt; the horrid orange default color scheme.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Love&lt;/b&gt; the folder sharing.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Dislike&lt;/b&gt; not being able to share the same folder with multiple contacts.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Love&lt;/b&gt; the new contact form and contact card.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Hate&lt;/b&gt; the clunkyness of the roll-over, expand contact feature, though the idea may have a future.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Like&lt;/b&gt; the "name-wheel" for searching for contacts, but my parents won't even notice it.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Dislike&lt;/b&gt; the stupid tabs - there has to be a better way.&lt;/li&gt;
&lt;/ul&gt;

In general, I would have expected more polish even for an invite only preview.  &lt;a href="http://www.hanselman.com/blog/PermaLink.aspx?guid=fd0a88e9-bac4-4ba4-87c8-6387aaa938a6" title="Scott Hanselman's blog"&gt;Scott&lt;/a&gt; (like I know him :P) mentioned the pixelated icons, but the same issue runs through the entire app.  The pop-out tabs are rough around the edges and the now-green MSN-men which replace the impossible-to-recognize personalize icons of MSN 7.5 are a little fuzzy.  

I like that they are trying to make things look cool, but please, go vector, go home.

&lt;a href="http://www.cromwellhaus.com/CS/photos/ryans_pics/category1012.aspx"&gt;Screen Shots&lt;/a&gt;

&lt;img src="http://www.cromwellhaus.com/CS/photos/ryans_pics/images/37/original.aspx" title="" border="0" /&gt;
&lt;img src="http://www.cromwellhaus.com/CS/photos/ryans_pics/images/38/original.aspx" title="" border="0" /&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=36" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=hYjPy6QU"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=rYyi0ojZ"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=rYyi0ojZ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=Y8WeiQuO"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=Y8WeiQuO" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/IigMr8Xs24w" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Software+Reviews/default.aspx">Software Reviews</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2006/01/13/36.aspx</feedburner:origLink></item><item><title>Mono hits the road</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/jtAJWNkTXXE/35.aspx</link><pubDate>Wed, 11 Jan 2006 16:48:35 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:35</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=35</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=35</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2006/01/11/35.aspx#comments</comments><description>It looks like &lt;a href="http://www.mono-project.com/" title="Mono Project"&gt;Mono&lt;/a&gt; will finally be a valid option for deploying applications.  Red Hat has &lt;a href="http://www.eweek.com/article2/0,1895,1909674,00.asp" title="Mono to Be Included in Fedora Core 5"&gt;announced&lt;/a&gt; that it will include &lt;a href="http://www.mono-project.com/" title="Mono Project"&gt;Mono&lt;/a&gt; in its Fedora Core 5.  Does that mean it will be in &lt;a href="http://www.redhat.com/" title="RedHat"&gt;Red Hat&lt;/a&gt; as well?  I couldn't tell you since I don't follow the Linux distributions to closely, but that would definitly be impressive.  I personally run &lt;a href="http://www.ubuntu.com/" title="Ubuntu"&gt;Ubuntu&lt;/a&gt; and, being a Linux novice, find it to be the closest thing to a "Mom-usable" Linux OS out there.  Then again, I don't follow the Linux distributions to closely.&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=35" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=Iv583Slp"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=cwtbOX2m"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=cwtbOX2m" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=NpFlpcUI"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=NpFlpcUI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/jtAJWNkTXXE" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/.Net/default.aspx">.Net</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2006/01/11/35.aspx</feedburner:origLink></item><item><title>Community Server and w.Bloggar Settings</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/A1NROpsizQQ/34.aspx</link><pubDate>Sat, 07 Jan 2006 05:12:24 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:34</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=34</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=34</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2006/01/07/34.aspx#comments</comments><description>This is really just for my future reference, but since I had a hard time finding out here are the settings I used for &lt;a href="http://bloggar.com/" title="w.Bloggar"&gt;w.Bloggar&lt;/a&gt; and &lt;a href="http://communityserver.org/" title="Community Server"&gt;Community Server 2.0&lt;/a&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;b&gt;API Section&lt;/b&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Blog Tool/API:&lt;/b&gt; (Custom)&lt;/li&gt; 
&lt;li&gt;&lt;b&gt;Account Alias:&lt;/b&gt; Ryan @ CromwellHaus.com&lt;/li&gt; 
&lt;li&gt;&lt;b&gt;Ping:&lt;/b&gt; Weblogs.com&lt;/li&gt; 
&lt;li&gt;&lt;b&gt;API Server:&lt;/b&gt; www.cromwellhaus.com&lt;/li&gt; 
&lt;li&gt;&lt;b&gt;Path:&lt;/b&gt; /cs/blogs/ryanc/MetaBlog.ashx&lt;/li&gt; 
&lt;/ul&gt; 

&lt;b&gt;Custom Section&lt;/b&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Posts::&lt;/b&gt; metaWeblog API&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Categories:&lt;/b&gt; metaWeblog API - Single&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Templates:&lt;/b&gt; Blogger API&lt;/li&gt;
&lt;li&gt;Defaults for everything else&lt;/li&gt;
&lt;/ul&gt;

I found the starter for these on the &lt;a href="http://communityserver.org/forums/480628/ShowThread.aspx#480628"&gt;CS MetaBlog API Thread&lt;/a&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=34" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=nWQsPM6H"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=Yu31oHdw"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=Yu31oHdw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=tB591GnM"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=tB591GnM" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/A1NROpsizQQ" height="1" width="1"/&gt;</description><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2006/01/07/34.aspx</feedburner:origLink></item><item><title>New Year Goals refresh...</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/tMoaoc-kgOk/33.aspx</link><pubDate>Thu, 05 Jan 2006 21:23:03 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:33</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=33</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=33</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2006/01/05/33.aspx#comments</comments><description>Many moons ago I realized I was not a naturally directed individual.  That is, I do not organize well without putting forth a deliberate effort.  If and when I fail at something I can most often trace it to a lack of task management on my part.  I have found that having a simple list has done more for my career and life than just about anything else I can imagine (please stop boiling over with arguments, I'm merely making a point).  In a "kill two birds with one post" moment, I wanted to publish my goals refresh which have made their way into my list of things to do:

&lt;ul&gt;
&lt;li&gt;Publish my experiences on learning the &lt;a href="http://www.ironpython.com/"&gt;IronPython&lt;/a&gt; and &lt;a href="http://swiss.csail.mit.edu/projects/scheme/"&gt;Scheme&lt;/a&gt; languages.&lt;/li&gt;
&lt;li&gt;Run 9 miles per week.&lt;/li&gt;
&lt;li&gt;Lift 3x a week.&lt;/li&gt;
&lt;li&gt;Blog 3 articles a week (bird #2).&lt;/li&gt;
&lt;li&gt;Play basketball 2x a week.&lt;/li&gt;
&lt;li&gt;Read 2 books on the &lt;a href="http://www.amazon.com/exec/obidos/search-handle-url/index=stripbooks:relevance-above&amp;field-keywords=crusades&amp;search-type=ss&amp;bq=1&amp;store-name=books/ref=xs_ap_l_xgl14/104-0014817-5011928"&gt;Crusades&lt;/a&gt; (this currently exists as "find 2 books about the Crusades").&lt;/li&gt;
&lt;/ul&gt;

Now I know what your thinking, "Those certainly appear to be New Year Resolutions, Ryan."  Well they are not - they are goals.  They are goals, because aside from the last three items they are unchanged from last week, last month, and all of last year.  I prefer to maintain rolling resolutions rather than one time resolutions that are tied to dates.  Some of the best advice: &lt;a href="http://www.quotationspage.com/quote/2826.html"&gt;"Never put off until tomorrow what you can do today"&lt;/a&gt; - &lt;a href="http://www.quotationspage.com/quotes/J._A._Spender/"&gt;J. A. Spender&lt;/a&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=33" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=2GNv3OSq"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=CeNf3iux"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=CeNf3iux" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=KQzxpfll"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=KQzxpfll" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/tMoaoc-kgOk" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/Personal/default.aspx">Personal</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2006/01/05/33.aspx</feedburner:origLink></item><item><title>Dayton-Cincinnati Code Camp</title><link>http://feedproxy.google.com/~r/RyanCromwell/~3/d8CCygYintc/31.aspx</link><pubDate>Tue, 27 Dec 2005 19:06:00 GMT</pubDate><guid isPermaLink="false">a17c0d30-89b7-4790-98da-f63884cd9e16:31</guid><dc:creator>cromwellryan</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://cromwellhaus.com/blogs/ryanc/rsscomments.aspx?PostID=31</wfw:commentRss><wfw:comment>http://cromwellhaus.com/blogs/ryanc/commentapi.aspx?PostID=31</wfw:comment><comments>http://cromwellhaus.com/blogs/ryanc/archive/2006/01/05/31.aspx#comments</comments><description>&lt;p&gt;The &lt;a href="http://daytondevgroup.net/CampSchedule.aspx"&gt;final schedule&lt;/a&gt; for the &lt;a href="http://daytondevgroup.net/CodeCamp.aspx"&gt;Dayton-Cincinnati Code Camp&lt;/a&gt; to be held January 21st has been released.&amp;nbsp; I'm really looking forward to Jim Weirich's session on &lt;a href="http://daytondevgroup.net/campSessions.aspx#rails"&gt;Ruby on Rails&lt;/a&gt;&amp;nbsp;and the especially interesting &lt;a href="http://daytondevgroup.net/campSessions.aspx#wmc"&gt;Developing for Windows Media Center (with Xbox 360!)&lt;/a&gt; session by Jason Follas and Greg Huber.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;I'll be following &lt;a href="http://blog.the-woods.org/"&gt;Mike Wood&lt;/a&gt; with a session on WSE 3.0.&amp;nbsp; I plan to recreate&amp;nbsp;the Generic WSE&amp;nbsp;Host service&amp;nbsp;tool we use at Speedway to deploy new services which don't have an otherwise&amp;nbsp;reliable or acceptable&amp;nbsp;host process.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://cromwellhaus.com/aggbug.aspx?PostID=31" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=nyoKlJAU"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=HuP1tbhd"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=HuP1tbhd" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/RyanCromwell?a=n3G4nNvt"&gt;&lt;img src="http://feeds.feedburner.com/~f/RyanCromwell?i=n3G4nNvt" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RyanCromwell/~4/d8CCygYintc" height="1" width="1"/&gt;</description><category domain="http://cromwellhaus.com/blogs/ryanc/archive/tags/.Net/default.aspx">.Net</category><feedburner:origLink>http://cromwellhaus.com/blogs/ryanc/archive/2006/01/05/31.aspx</feedburner:origLink></item></channel></rss>
