<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Chris Cavanagh's Blog</title>
	<atom:link href="http://chriscavanagh.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://chriscavanagh.wordpress.com</link>
	<description>Ramblings on .NET, WPF, Silverlight, Flex, AIR and other hoopy cool things</description>
	<lastBuildDate>Thu, 05 Nov 2009 15:20:57 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='chriscavanagh.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/cca7535890135e9c20578c1aa47e9521?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Chris Cavanagh's Blog</title>
		<link>http://chriscavanagh.wordpress.com</link>
	</image>
			<item>
		<title>Interactive Fiction + Linux + Moonlight</title>
		<link>http://chriscavanagh.wordpress.com/2009/11/02/interactive-fiction-linux-moonlight/</link>
		<comments>http://chriscavanagh.wordpress.com/2009/11/02/interactive-fiction-linux-moonlight/#comments</comments>
		<pubDate>Tue, 03 Nov 2009 05:44:51 +0000</pubDate>
		<dc:creator>Chris Cavanagh</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://chriscavanagh.wordpress.com/2009/11/02/interactive-fiction-linux-moonlight/</guid>
		<description><![CDATA[Moonlight 2 beta 7 (at time of writing) is getting really close to working with SilverGlulxe / SilverFyre!&#160; The only issue right now is none of the story text appears…   (could just be a simple font issue).
FYI one of the cool things about SilverGlulxe is its handy “Transcript” option (link at bottom of [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chriscavanagh.wordpress.com&blog=313491&post=475&subd=chriscavanagh&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><a title="Moonlight 2.0 latest beta" href="http://go-mono.com/moonlight-beta/" target="_blank">Moonlight 2 beta 7</a> (at time of writing) is getting really close to working with <a title="SilverGlulxe (now SilverFyre)" href="http://chriscavanagh.wordpress.com/2009/03/23/silverglulxe-interactive-fiction-in-silverlight/" target="_blank">SilverGlulxe / SilverFyre</a>!&#160; The only issue right now is none of the story text appears… <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  (could just be a simple font issue).</p>
<p>FYI one of the cool things about SilverGlulxe is its handy “Transcript” option (link at bottom of game).&#160; It gives you a transcript of the story so far (including your commands) and lets you send a copy (including XML source) by email.&#160; Apparently it’s very useful for story debugging [if you’re an Interactive Fiction writer].</p>
<div class="wlWriterHeaderFooter" style="margin:0;padding:0;"><a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fchriscavanagh.wordpress.com%2f2009%2f11%2f02%2finteractive-fiction-linux-moonlight%2f" rev="vote-for"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fchriscavanagh.wordpress.com%2f2009%2f11%2f02%2finteractive-fiction-linux-moonlight%2f" style="border:0;" alt="kick it" /></a></div>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chriscavanagh.wordpress.com/475/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chriscavanagh.wordpress.com/475/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chriscavanagh.wordpress.com/475/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chriscavanagh.wordpress.com/475/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chriscavanagh.wordpress.com/475/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chriscavanagh.wordpress.com/475/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chriscavanagh.wordpress.com/475/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chriscavanagh.wordpress.com/475/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chriscavanagh.wordpress.com/475/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chriscavanagh.wordpress.com/475/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chriscavanagh.wordpress.com&blog=313491&post=475&subd=chriscavanagh&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://chriscavanagh.wordpress.com/2009/11/02/interactive-fiction-linux-moonlight/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8b8858c8a6022411fc9d48c1f4963928?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Chris</media:title>
		</media:content>

		<media:content url="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fchriscavanagh.wordpress.com%2f2009%2f11%2f02%2finteractive-fiction-linux-moonlight%2f" medium="image">
			<media:title type="html">kick it</media:title>
		</media:content>
	</item>
		<item>
		<title>Silverlight VisualBrush and rounded corners</title>
		<link>http://chriscavanagh.wordpress.com/2009/09/24/silverlight-visualbrush-and-rounded-corners/</link>
		<comments>http://chriscavanagh.wordpress.com/2009/09/24/silverlight-visualbrush-and-rounded-corners/#comments</comments>
		<pubDate>Fri, 25 Sep 2009 02:23:15 +0000</pubDate>
		<dc:creator>Chris Cavanagh</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://chriscavanagh.wordpress.com/2009/09/24/silverlight-visualbrush-and-rounded-corners/</guid>
		<description><![CDATA[As you know Silverlight 3 doesn’t support VisualBrush, which can make things like this pretty tricky.
Here’s my attempt at a workaround  &#160; It’s a control called VisualImage which can be pointed at any element and exposes it as a WriteableBitmap.&#160; You could bind an Image to this to create a reflection effect like this [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chriscavanagh.wordpress.com&blog=313491&post=455&subd=chriscavanagh&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>As you know Silverlight 3 doesn’t support VisualBrush, which can make <a title="WPF - Easy rounded corners for anything" href="http://chriscavanagh.wordpress.com/2008/10/03/wpf-easy-rounded-corners-for-anything/" target="_blank">things like this</a> pretty tricky.</p>
<p>Here’s my attempt at a workaround <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> &#160; It’s a control called VisualImage which can be pointed at any element and exposes it as a WriteableBitmap.&#160; You could bind an Image to this to create a reflection effect like this (don’t forget to look at <a title="Using WriteableBitmap for reflections" href="http://www.wintellect.com/CS/blogs/jprosise/archive/2009/03/25/more-on-silverlight-3-s-new-writeable-bitmap.aspx" target="_blank">Jeff Prosise’s sample</a>):</p>
<p><a href="http://chriscavanagh.files.wordpress.com/2009/09/image2.png"><img style="display:inline;border-width:0;" title="image" border="0" alt="image" src="http://chriscavanagh.files.wordpress.com/2009/09/image_thumb.png?w=488&#038;h=315" width="488" height="315" /></a> </p>
<p>You could even bind it to an ImageBrush… if it supported binding.&#160; To work around this, VisualImage can be bound to the ImageBrush instead.&#160; One application of this is for clipped, rounded corners on any element (<a title="WPF - Easy rounded corners for anything" href="http://chriscavanagh.wordpress.com/2008/10/03/wpf-easy-rounded-corners-for-anything/" target="_blank">here’s the WPF way</a>):</p>
<p><a href="http://chriscavanagh.files.wordpress.com/2009/09/image3.png"><img style="display:inline;border-width:0;" title="image" border="0" alt="image" src="http://chriscavanagh.files.wordpress.com/2009/09/image_thumb1.png?w=471&#038;h=352" width="471" height="352" /></a> </p>
<p>You can try a live sample <a title="VisualImage test" href="http://www.chriscavanagh.com/chris/silverlight/VisualImageTest/VisualImageTestTestPage.html" target="_blank">here</a> (source on <a title="Silverlight VisualImage demo" href="http://slvisualimage.codeplex.com/" target="_blank">CodePlex</a>).</p>
<p>Although VisualImage is a Control, it doesn’t render anything itself – it just acts as an intermediary between your visual and whatever you want to bind it to.&#160; Here’s everything you need (also available <a title="VisualImage.cs on CodePlex" href="http://slvisualimage.codeplex.com/SourceControl/changeset/view/29392#687456" target="_blank">here</a>):</p>
<pre class="code"><span style="color:gray;">/// &lt;summary&gt;
/// </span><span style="color:green;">VisualImage
</span><span style="color:gray;">/// &lt;/summary&gt;
</span><span style="color:blue;">public class </span><span style="color:#2b91af;">VisualImage </span>: <span style="color:#2b91af;">Control
</span>{
    <span style="color:blue;">#region </span>Visual DependencyProperty

    <span style="color:blue;">public static readonly </span><span style="color:#2b91af;">DependencyProperty </span>VisualProperty = <span style="color:#2b91af;">DependencyProperty</span>.Register(
        <span style="color:#a31515;">&quot;Visual&quot;</span>,
        <span style="color:blue;">typeof</span>( <span style="color:#2b91af;">FrameworkElement </span>),
        <span style="color:blue;">typeof</span>( <span style="color:#2b91af;">VisualImage </span>),
        <span style="color:blue;">new </span><span style="color:#2b91af;">PropertyMetadata</span>( OnVisualChanged ) );

    <span style="color:blue;">public </span><span style="color:#2b91af;">FrameworkElement </span>Visual
    {
        <span style="color:blue;">get </span>{ <span style="color:blue;">return </span>(<span style="color:#2b91af;">FrameworkElement</span>)GetValue( VisualProperty ); }
        <span style="color:blue;">set </span>{ SetValue( VisualProperty, <span style="color:blue;">value </span>); }
    }

    <span style="color:blue;">private static void </span>OnVisualChanged( <span style="color:#2b91af;">DependencyObject </span>obj, <span style="color:#2b91af;">DependencyPropertyChangedEventArgs </span>args )
    {
        <span style="color:blue;">var </span>visualImage = obj <span style="color:blue;">as </span><span style="color:#2b91af;">VisualImage</span>;
        visualImage.OnVisualChanged( args );
    }

    <span style="color:blue;">private void </span>OnVisualChanged( <span style="color:#2b91af;">DependencyPropertyChangedEventArgs </span>args )
    {
        <span style="color:blue;">if </span>( args.OldValue != <span style="color:blue;">null </span>) ( (<span style="color:#2b91af;">FrameworkElement</span>)args.OldValue ).SizeChanged -= VisualImage_SizeChanged;
        <span style="color:blue;">if </span>( args.NewValue != <span style="color:blue;">null </span>)
        {
            <span style="color:blue;">var </span>visual = (<span style="color:#2b91af;">FrameworkElement</span>)args.NewValue;
            visual.SizeChanged += VisualImage_SizeChanged;
            PrepareBitmap( (<span style="color:blue;">int</span>)visual.RenderSize.Width, (<span style="color:blue;">int</span>)visual.RenderSize.Height );
        }
    }

    <span style="color:blue;">private void </span>VisualImage_SizeChanged( <span style="color:blue;">object </span>sender, <span style="color:#2b91af;">SizeChangedEventArgs </span>e )
    {
        PrepareBitmap( (<span style="color:blue;">int</span>)e.NewSize.Width, (<span style="color:blue;">int</span>)e.NewSize.Height );
    }

    <span style="color:blue;">#endregion </span><span style="color:green;">// Visual DependencyProperty

    </span><span style="color:blue;">#region </span>Bitmap DependencyProperty

    <span style="color:blue;">public static readonly </span><span style="color:#2b91af;">DependencyProperty </span>BitmapProperty = <span style="color:#2b91af;">DependencyProperty</span>.Register(
        <span style="color:#a31515;">&quot;Bitmap&quot;</span>,
        <span style="color:blue;">typeof</span>( <span style="color:#2b91af;">WriteableBitmap </span>),
        <span style="color:blue;">typeof</span>( <span style="color:#2b91af;">VisualImage </span>),
        <span style="color:blue;">null </span>);

    <span style="color:blue;">public </span><span style="color:#2b91af;">WriteableBitmap </span>Bitmap
    {
        <span style="color:blue;">get </span>{ <span style="color:blue;">return </span>(<span style="color:#2b91af;">WriteableBitmap</span>)GetValue( BitmapProperty ); }
        <span style="color:blue;">set </span>{ SetValue( BitmapProperty, <span style="color:blue;">value </span>); }
    }

    <span style="color:blue;">#endregion </span><span style="color:green;">// Bitmap DependencyProperty

    </span><span style="color:blue;">#region </span>ImageBrush DependencyProperty

    <span style="color:blue;">public static readonly </span><span style="color:#2b91af;">DependencyProperty </span>ImageBrushProperty = <span style="color:#2b91af;">DependencyProperty</span>.Register(
        <span style="color:#a31515;">&quot;ImageBrush&quot;</span>,
        <span style="color:blue;">typeof</span>( <span style="color:#2b91af;">ImageBrush </span>),
        <span style="color:blue;">typeof</span>( <span style="color:#2b91af;">VisualImage </span>),
        <span style="color:blue;">null </span>);

    <span style="color:blue;">public </span><span style="color:#2b91af;">ImageBrush </span>ImageBrush
    {
        <span style="color:blue;">get </span>{ <span style="color:blue;">return </span>(<span style="color:#2b91af;">ImageBrush</span>)GetValue( ImageBrushProperty ); }
        <span style="color:blue;">set </span>{ SetValue( ImageBrushProperty, <span style="color:blue;">value </span>); }
    }

    <span style="color:blue;">#endregion </span><span style="color:green;">// VisualBrush DependencyProperty

    </span><span style="color:gray;">/// &lt;summary&gt;
    /// </span><span style="color:green;">Initializes a new instance of the </span><span style="color:gray;">&lt;see cref=&quot;VisualImage&quot;/&gt; </span><span style="color:green;">class.
    </span><span style="color:gray;">/// &lt;/summary&gt;
    </span><span style="color:blue;">public </span>VisualImage()
    {
    }

    <span style="color:gray;">/// &lt;summary&gt;
    /// </span><span style="color:green;">Prepares the bitmap.
    </span><span style="color:gray;">/// &lt;/summary&gt;
    /// &lt;param name=&quot;width&quot;&gt;</span><span style="color:green;">The width.</span><span style="color:gray;">&lt;/param&gt;
    /// &lt;param name=&quot;height&quot;&gt;</span><span style="color:green;">The height.</span><span style="color:gray;">&lt;/param&gt;
    </span><span style="color:blue;">private void </span>PrepareBitmap( <span style="color:blue;">int </span>width, <span style="color:blue;">int </span>height )
    {
        Bitmap = <span style="color:blue;">new </span><span style="color:#2b91af;">WriteableBitmap</span>( width, height );
        Invalidate();
    }

    <span style="color:gray;">/// &lt;summary&gt;
    /// </span><span style="color:green;">Invalidates the VisualImage and causes WriteableBitmap to be refreshed.
    </span><span style="color:gray;">/// &lt;/summary&gt;
    </span><span style="color:blue;">public void </span>Invalidate()
    {
        <span style="color:blue;">if </span>( Bitmap != <span style="color:blue;">null </span>&amp;&amp; Visual != <span style="color:blue;">null </span>)
        {
            <span style="color:#2b91af;">Array</span>.Clear( Bitmap.Pixels, 0, Bitmap.Pixels.Length );
            Bitmap.Render( Visual, <span style="color:blue;">this</span>.RenderTransform );
            Bitmap.Invalidate();

            <span style="color:blue;">if </span>( ImageBrush != <span style="color:blue;">null </span>&amp;&amp; ImageBrush.ImageSource != Bitmap )
            {
                ImageBrush.ImageSource = Bitmap;
            }
        }
    }
}</pre>
<p><a href="http://11011.net/software/vspaste"></a><a href="http://11011.net/software/vspaste"></a><a href="http://11011.net/software/vspaste"></a></p>
<p>For performance reasons it only refreshes the WriteableBitmap when the target Visual’s size changes.&#160; You can call the Invalidate() method to force a refresh (consider calling it from CompositionTarget.Rendering if you want it to refresh every frame).</p>
<p>Here’s how to get rounded corners on anything (similar to <a title="WPF - Easy rounded corners for anything" href="http://chriscavanagh.wordpress.com/2008/10/03/wpf-easy-rounded-corners-for-anything/" target="_blank">WPF technique</a>, with added VisualImage and named ImageBrush):</p>
<pre class="code">                <span style="color:blue;">&lt;</span><span style="color:#a31515;">Grid </span><span style="color:red;">HorizontalAlignment</span><span style="color:blue;">=&quot;Center&quot; </span><span style="color:red;">VerticalAlignment</span><span style="color:blue;">=&quot;Center&quot;&gt;
                    &lt;</span><span style="color:#a31515;">Border </span><span style="color:red;">x</span><span style="color:blue;">:</span><span style="color:red;">Name</span><span style="color:blue;">=&quot;mask&quot; </span><span style="color:red;">Background</span><span style="color:blue;">=&quot;White&quot; </span><span style="color:red;">CornerRadius</span><span style="color:blue;">=&quot;20&quot; </span><span style="color:red;">Padding</span><span style="color:blue;">=&quot;10&quot;/&gt;
                    &lt;</span><span style="color:#a31515;">local</span><span style="color:blue;">:</span><span style="color:#a31515;">VisualImage </span><span style="color:red;">Name</span><span style="color:blue;">=&quot;visualImage&quot; </span><span style="color:red;">Visual</span><span style="color:blue;">=&quot;{</span><span style="color:#a31515;">Binding </span><span style="color:red;">ElementName</span><span style="color:blue;">=mask}&quot; </span><span style="color:red;">ImageBrush</span><span style="color:blue;">=&quot;{</span><span style="color:#a31515;">Binding </span><span style="color:red;">ElementName</span><span style="color:blue;">=brush}&quot;/&gt;
                    &lt;</span><span style="color:#a31515;">Image </span><span style="color:red;">Source</span><span style="color:blue;">=&quot;http://farm2.static.flickr.com/1429/1430528819_edb63b79a6.jpg&quot;&gt;
                        &lt;</span><span style="color:#a31515;">Image.OpacityMask</span><span style="color:blue;">&gt;
                            &lt;</span><span style="color:#a31515;">ImageBrush </span><span style="color:red;">x</span><span style="color:blue;">:</span><span style="color:red;">Name</span><span style="color:blue;">=&quot;brush&quot;/&gt;
                        &lt;/</span><span style="color:#a31515;">Image.OpacityMask</span><span style="color:blue;">&gt;
                    &lt;/</span><span style="color:#a31515;">Image</span><span style="color:blue;">&gt;
                &lt;/</span><span style="color:#a31515;">Grid</span><span style="color:blue;">&gt;
</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>And here’s a reflection:</p>
<p><a href="http://11011.net/software/vspaste"></a></p>
<pre class="code">                <span style="color:blue;">&lt;</span><span style="color:#a31515;">TextBlock </span><span style="color:red;">x</span><span style="color:blue;">:</span><span style="color:red;">Name</span><span style="color:blue;">=&quot;myText&quot; </span><span style="color:red;">FontSize</span><span style="color:blue;">=&quot;96&quot;&gt;</span><span style="color:#a31515;">Hello</span><span style="color:blue;">&lt;/</span><span style="color:#a31515;">TextBlock</span><span style="color:blue;">&gt;
                &lt;</span><span style="color:#a31515;">local</span><span style="color:blue;">:</span><span style="color:#a31515;">VisualImage </span><span style="color:red;">Name</span><span style="color:blue;">=&quot;reflectImage&quot; </span><span style="color:red;">Visual</span><span style="color:blue;">=&quot;{</span><span style="color:#a31515;">Binding </span><span style="color:red;">ElementName</span><span style="color:blue;">=myText}&quot;/&gt;
                &lt;</span><span style="color:#a31515;">Image </span><span style="color:red;">Source</span><span style="color:blue;">=&quot;{</span><span style="color:#a31515;">Binding </span><span style="color:red;">Bitmap</span><span style="color:blue;">, </span><span style="color:red;">ElementName</span><span style="color:blue;">=reflectImage}&quot; </span><span style="color:red;">RenderTransformOrigin</span><span style="color:blue;">=&quot;0.5,0.2&quot;&gt;
                    &lt;</span><span style="color:#a31515;">Image.RenderTransform</span><span style="color:blue;">&gt;
                        &lt;</span><span style="color:#a31515;">ScaleTransform </span><span style="color:red;">ScaleY</span><span style="color:blue;">=&quot;-0.8&quot;/&gt;
                    &lt;/</span><span style="color:#a31515;">Image.RenderTransform</span><span style="color:blue;">&gt;
                    &lt;</span><span style="color:#a31515;">Image.OpacityMask</span><span style="color:blue;">&gt;
                        &lt;</span><span style="color:#a31515;">LinearGradientBrush </span><span style="color:red;">StartPoint</span><span style="color:blue;">=&quot;0.5,0&quot; </span><span style="color:red;">EndPoint</span><span style="color:blue;">=&quot;0.5,1&quot;&gt;
                            &lt;</span><span style="color:#a31515;">GradientStop </span><span style="color:red;">Offset</span><span style="color:blue;">=&quot;0&quot; </span><span style="color:red;">Color</span><span style="color:blue;">=&quot;#00FFFFFF&quot;/&gt;
                            &lt;</span><span style="color:#a31515;">GradientStop </span><span style="color:red;">Offset</span><span style="color:blue;">=&quot;1&quot; </span><span style="color:red;">Color</span><span style="color:blue;">=&quot;#80FFFFFF&quot;/&gt;
                        &lt;/</span><span style="color:#a31515;">LinearGradientBrush</span><span style="color:blue;">&gt;
                    &lt;/</span><span style="color:#a31515;">Image.OpacityMask</span><span style="color:blue;">&gt;
                &lt;/</span><span style="color:#a31515;">Image</span><span style="color:blue;">&gt;
</span></pre>
<p><a href="http://11011.net/software/vspaste"></a>
<div class="wlWriterHeaderFooter" style="margin:0;padding:0;"><a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fchriscavanagh.wordpress.com%2f2009%2f09%2f24%2fsilverlight-visualbrush-and-rounded-corners%2f" rev="vote-for"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fchriscavanagh.wordpress.com%2f2009%2f09%2f24%2fsilverlight-visualbrush-and-rounded-corners%2f" style="border:0;" alt="kick it" /></a></div>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chriscavanagh.wordpress.com/455/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chriscavanagh.wordpress.com/455/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chriscavanagh.wordpress.com/455/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chriscavanagh.wordpress.com/455/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chriscavanagh.wordpress.com/455/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chriscavanagh.wordpress.com/455/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chriscavanagh.wordpress.com/455/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chriscavanagh.wordpress.com/455/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chriscavanagh.wordpress.com/455/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chriscavanagh.wordpress.com/455/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chriscavanagh.wordpress.com&blog=313491&post=455&subd=chriscavanagh&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://chriscavanagh.wordpress.com/2009/09/24/silverlight-visualbrush-and-rounded-corners/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8b8858c8a6022411fc9d48c1f4963928?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Chris</media:title>
		</media:content>

		<media:content url="http://chriscavanagh.files.wordpress.com/2009/09/image_thumb.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://chriscavanagh.files.wordpress.com/2009/09/image_thumb1.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fchriscavanagh.wordpress.com%2f2009%2f09%2f24%2fsilverlight-visualbrush-and-rounded-corners%2f" medium="image">
			<media:title type="html">kick it</media:title>
		</media:content>
	</item>
		<item>
		<title>YouCube 3.0 (Chromium WebBrowser) &#8211; Source Code</title>
		<link>http://chriscavanagh.wordpress.com/2009/09/08/youcube-3-0-chromium-webbrowser-source-code/</link>
		<comments>http://chriscavanagh.wordpress.com/2009/09/08/youcube-3-0-chromium-webbrowser-source-code/#comments</comments>
		<pubDate>Wed, 09 Sep 2009 02:22:31 +0000</pubDate>
		<dc:creator>Chris Cavanagh</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://chriscavanagh.wordpress.com/2009/09/08/youcube-3-0-chromium-webbrowser-source-code/</guid>
		<description><![CDATA[Source code for YouCube 3.0 (WPF 3D Chromium-based WebBrowser) is now on CodePlex.&#160; See the related WPF Chromium WebBrowser project for the Awesomium wrapper source.

       <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chriscavanagh.wordpress.com&blog=313491&post=437&subd=chriscavanagh&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Source code for <a title="YouCube 3.0" href="http://chriscavanagh.wordpress.com/2009/08/27/wpf-3d-chromium-browser/" target="_blank">YouCube 3.0</a> (WPF 3D Chromium-based WebBrowser) is now on <a title="YouCube 3" href="http://youcube3.codeplex.com/" target="_blank">CodePlex</a>.&#160; See the related <a href="http://wpfchromium.codeplex.com/" target="_blank">WPF Chromium WebBrowser project</a> for the Awesomium wrapper source.</p>
<div class="wlWriterHeaderFooter" style="margin:0;padding:0;"><a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fchriscavanagh.wordpress.com%2f2009%2f09%2f08%2fyoucube-3-0-chromium-webbrowser-source-code%2f" rev="vote-for"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fchriscavanagh.wordpress.com%2f2009%2f09%2f08%2fyoucube-3-0-chromium-webbrowser-source-code%2f" style="border:0;" alt="kick it" /></a></div>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chriscavanagh.wordpress.com/437/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chriscavanagh.wordpress.com/437/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chriscavanagh.wordpress.com/437/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chriscavanagh.wordpress.com/437/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chriscavanagh.wordpress.com/437/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chriscavanagh.wordpress.com/437/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chriscavanagh.wordpress.com/437/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chriscavanagh.wordpress.com/437/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chriscavanagh.wordpress.com/437/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chriscavanagh.wordpress.com/437/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chriscavanagh.wordpress.com&blog=313491&post=437&subd=chriscavanagh&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://chriscavanagh.wordpress.com/2009/09/08/youcube-3-0-chromium-webbrowser-source-code/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8b8858c8a6022411fc9d48c1f4963928?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Chris</media:title>
		</media:content>

		<media:content url="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fchriscavanagh.wordpress.com%2f2009%2f09%2f08%2fyoucube-3-0-chromium-webbrowser-source-code%2f" medium="image">
			<media:title type="html">kick it</media:title>
		</media:content>
	</item>
		<item>
		<title>WPF 3D Chromium Browser</title>
		<link>http://chriscavanagh.wordpress.com/2009/08/27/wpf-3d-chromium-browser/</link>
		<comments>http://chriscavanagh.wordpress.com/2009/08/27/wpf-3d-chromium-browser/#comments</comments>
		<pubDate>Thu, 27 Aug 2009 07:47:35 +0000</pubDate>
		<dc:creator>Chris Cavanagh</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://chriscavanagh.wordpress.com/2009/08/27/wpf-3d-chromium-browser/</guid>
		<description><![CDATA[UPDATE: Now shows separate browser on each face! (a fast PC will help   ).&#160; Click a face in “browse” mode to select it and change the URL (or interact with it).&#160; Source code available on CodePlex (see related post).
There’s an updated version of YouCube (WPF 3D Web Browser) available based on my Awesomium [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chriscavanagh.wordpress.com&blog=313491&post=422&subd=chriscavanagh&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><strong>UPDATE</strong>: Now shows separate browser on each face! (a fast PC will help <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ).&#160; Click a face in “browse” mode to select it and change the URL (or interact with it).&#160; Source code available on <a title="YouCube 3 - Source code on CodePlex" href="http://youcube3.codeplex.com/" target="_blank">CodePlex</a> (see <a title="WPF 3D Chromium Browser source code" href="http://chriscavanagh.wordpress.com/2009/09/08/youcube-3-0-chromium-webbrowser-source-code/" target="_blank">related post</a>).</p>
<p>There’s an updated version of <a title="YouCube" href="http://chriscavanagh.wordpress.com/2008/09/04/youcube/" target="_blank">YouCube</a> (WPF 3D Web Browser) available based on my <a title="A Real WPF WebBrowser" href="http://chriscavanagh.wordpress.com/2009/08/25/a-real-wpf-webbrowser/" target="_blank">Awesomium / Chromium control</a>.&#160; Try it <a title="YouCube 3.0 - WPF 3D Chromium Browser" href="http://www.chriscavanagh.com/chris/Cjc.Chromium3D/publish.htm" target="_blank">here</a>! </p>
<p><a title="YouCube 3.0 - WPF 3D Chromium Browser" href="http://www.chriscavanagh.com/chris/Cjc.Chromium3D/publish.htm" target="_blank"><img style="display:inline;border-width:0;" title="image" border="0" alt="image" src="http://chriscavanagh.files.wordpress.com/2009/08/image2.png?w=491&#038;h=308" width="491" height="308" /></a> </p>
<p>If you prefer you can run the application locally instead (<a title="YouCube 3.0 - WPF 3D Chromium Browser binaries" href="http://www.chriscavanagh.com/chris/Cjc.Chromium3D/Cjc.Chromium3D.zip" target="_blank">ZIP here</a>).</p>
<p><a title="YouCube 3.0 - Don&#39;t forget right-click zooms!" href="http://www.chriscavanagh.com/chris/Cjc.Chromium3D/publish.htm" target="_blank"><img style="display:inline;border-width:0;" title="image" border="0" alt="image" src="http://chriscavanagh.files.wordpress.com/2009/08/image3.png?w=487&#038;h=290" width="487" height="290" /></a></p>
<div class="wlWriterHeaderFooter" style="margin:0;padding:0;"><a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fchriscavanagh.wordpress.com%2f2009%2f08%2f27%2fwpf-3d-chromium-browser%2f" rev="vote-for"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fchriscavanagh.wordpress.com%2f2009%2f08%2f27%2fwpf-3d-chromium-browser%2f" style="border:0;" alt="kick it" /></a></div>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chriscavanagh.wordpress.com/422/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chriscavanagh.wordpress.com/422/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chriscavanagh.wordpress.com/422/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chriscavanagh.wordpress.com/422/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chriscavanagh.wordpress.com/422/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chriscavanagh.wordpress.com/422/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chriscavanagh.wordpress.com/422/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chriscavanagh.wordpress.com/422/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chriscavanagh.wordpress.com/422/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chriscavanagh.wordpress.com/422/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chriscavanagh.wordpress.com&blog=313491&post=422&subd=chriscavanagh&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://chriscavanagh.wordpress.com/2009/08/27/wpf-3d-chromium-browser/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8b8858c8a6022411fc9d48c1f4963928?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Chris</media:title>
		</media:content>

		<media:content url="http://chriscavanagh.files.wordpress.com/2009/08/image2.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://chriscavanagh.files.wordpress.com/2009/08/image3.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fchriscavanagh.wordpress.com%2f2009%2f08%2f27%2fwpf-3d-chromium-browser%2f" medium="image">
			<media:title type="html">kick it</media:title>
		</media:content>
	</item>
		<item>
		<title>WPF Chromium WebBrowser source code!</title>
		<link>http://chriscavanagh.wordpress.com/2009/08/25/wpf-chromium-webbrowser-source-code/</link>
		<comments>http://chriscavanagh.wordpress.com/2009/08/25/wpf-chromium-webbrowser-source-code/#comments</comments>
		<pubDate>Tue, 25 Aug 2009 20:38:16 +0000</pubDate>
		<dc:creator>Chris Cavanagh</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://chriscavanagh.wordpress.com/2009/08/25/wpf-chromium-webbrowser-source-code/</guid>
		<description><![CDATA[The source code for my WPF Chromium WebBrowser control is now available on CodePlex.
The source includes:
Cjc.ThreeDeemium – The sample application, currently without any 3D features.&#160; Go figure.     Cjc.ChromiumBrowser – The WPF Chromium WebBrowser control.&#160; Depends on Cjc.AwesomiumWrapper and the two Awesomium / Chromium C++ DLLs (Awesomium.dll and icudt38.dll).    [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chriscavanagh.wordpress.com&blog=313491&post=416&subd=chriscavanagh&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>The source code for my <a title="WFP Chromium WebBrowser control" href="http://chriscavanagh.wordpress.com/2009/08/25/a-real-wpf-webbrowser/" target="_blank">WPF Chromium WebBrowser control</a> is now available <a title="WPF Chromium WebBrowser control and demo" href="http://wpfchromium.codeplex.com/" target="_blank">on CodePlex</a>.</p>
<p>The source includes:</p>
<p><a title="Cjc.ThreeDeemium - Window1.xaml.cs" href="http://wpfchromium.codeplex.com/SourceControl/changeset/view/28084#413983" target="_blank">Cjc.ThreeDeemium</a> – The sample application, currently without any 3D features.&#160; Go figure.     <br /><a title="Cjc.ChromiumBrowser - WebBrowser.cs" href="http://wpfchromium.codeplex.com/SourceControl/changeset/view/28084#413984" target="_blank">Cjc.ChromiumBrowser</a> – The WPF Chromium WebBrowser control.&#160; Depends on Cjc.AwesomiumWrapper and the two Awesomium / Chromium C++ DLLs (Awesomium.dll and icudt38.dll).     <br /><a title="Cjc..AwesomiumWrapper - Cjc.AwesomiumWrapper.h" href="http://wpfchromium.codeplex.com/SourceControl/changeset/view/28084#414004" target="_blank">Cjc.AwesomiumWrapper</a> – A Managed C++ / CLI wrapper around Awesomium.&#160; This is much easier to maintain than the old P/Invoke stuff, and is almost nice to look at <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />      <br /><a title="Asesomium - WebCore.h" href="http://wpfchromium.codeplex.com/SourceControl/changeset/view/28084#413974" target="_blank">Awesomium</a> – C++ headers and libraries for Awesomium / Chromium.</p>
<p>There’s also a bonus project <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  :</p>
<p><a title="Cjc.WebSnapshot - Program.cs" href="http://wpfchromium.codeplex.com/SourceControl/changeset/view/28084#458135" target="_blank">Cjc.WebSnapshot</a> – A small command-line utility using Cjc.AwesomiumWrapper to snapshot a URL (you need to specify a full URL including the scheme – <a href="http://chriscavanagh.wordpress.com">http://chriscavanagh.wordpress.com</a> etc).</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chriscavanagh.wordpress.com/416/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chriscavanagh.wordpress.com/416/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chriscavanagh.wordpress.com/416/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chriscavanagh.wordpress.com/416/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chriscavanagh.wordpress.com/416/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chriscavanagh.wordpress.com/416/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chriscavanagh.wordpress.com/416/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chriscavanagh.wordpress.com/416/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chriscavanagh.wordpress.com/416/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chriscavanagh.wordpress.com/416/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chriscavanagh.wordpress.com&blog=313491&post=416&subd=chriscavanagh&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://chriscavanagh.wordpress.com/2009/08/25/wpf-chromium-webbrowser-source-code/feed/</wfw:commentRss>
		<slash:comments>83</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8b8858c8a6022411fc9d48c1f4963928?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Chris</media:title>
		</media:content>
	</item>
		<item>
		<title>A Real WPF WebBrowser</title>
		<link>http://chriscavanagh.wordpress.com/2009/08/25/a-real-wpf-webbrowser/</link>
		<comments>http://chriscavanagh.wordpress.com/2009/08/25/a-real-wpf-webbrowser/#comments</comments>
		<pubDate>Tue, 25 Aug 2009 16:19:42 +0000</pubDate>
		<dc:creator>Chris Cavanagh</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://chriscavanagh.wordpress.com/2009/08/25/a-real-wpf-webbrowser/</guid>
		<description><![CDATA[UPDATE: Source code available!&#160; See post here.&#160; Fixed keyboard / Javascript bug  &#160; Added some sample pixel shader effects! (including HatchingEffect by Charles Bissonnette).&#160; If you need Awesomium_d.dll (for debug builds) you can get it here.
Being able to render and interact with webpages within WPF opens up some great opportunities.&#160; While WPF already includes [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chriscavanagh.wordpress.com&blog=313491&post=409&subd=chriscavanagh&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><strong>UPDATE</strong>: Source code available!&#160; See post <a title="WPF Chromium WebBrowser source available" href="http://chriscavanagh.wordpress.com/2009/08/25/wpf-chromium-webbrowser-source-code/" target="_blank">here</a>.&#160; Fixed keyboard / Javascript bug <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> &#160; Added some sample pixel shader effects! (including HatchingEffect by Charles Bissonnette).&#160; If you need Awesomium_d.dll (for debug builds) you can get it <a title="Awesomium_d.dll (zip)" href="http://www.chriscavanagh.com/chris/Cjc.ThreeDeemium/Awesomium_d.zip" target="_blank">here</a>.</p>
<p>Being able to render and interact with webpages within WPF opens up some great opportunities.&#160; While WPF already includes a WebBrowser, it’s just a wrapper around IE’s ActiveX control.&#160; Unfortunately this prevents it playing nicely with WPF’s layout system <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p>Mixing Google’s <a title="Google Chromium" href="http://code.google.com/chromium/" target="_blank">Chromium</a> project, a great wrapper called <a title="Awesomium" href="http://princeofcode.com/awesomium.php#download" target="_blank">Awesomium</a> and a little WPF pixie dust, we finally have one <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  :</p>
<p><a title="WPF Chromium Control demo" href="http://www.chriscavanagh.com/chris/Cjc.ThreeDeemium/publish.htm" target="_blank"><img style="display:inline;border-width:0;" title="WPF Chromium Control" border="0" alt="WPF Chromium Control" src="http://chriscavanagh.files.wordpress.com/2009/08/image1.png?w=479&#038;h=420" width="479" height="420" /></a> </p>
<p>You can try the ClickOnce application <a title="WPF Chromium Control" href="http://www.chriscavanagh.com/chris/Cjc.ThreeDeemium/publish.htm" target="_blank">here</a>.&#160; Source is available on CodePlex (discussed <a title="WPF Chromium WebBrowser source available" href="http://chriscavanagh.wordpress.com/2009/08/25/wpf-chromium-webbrowser-source-code/" target="_blank">here</a>).&#160; You should find it works great with Flash and Silverlight (assuming plug-ins already installed) but currently it might choke on XBAPs and Java applets.</p>
<p>If you prefer to run the binaries locally, you can get them <a title="CJC Chromium Browser demo binaries zip" href="http://www.chriscavanagh.com/chris/Cjc.ThreeDeemium/Cjc.ChromiumBrowserDemo.zip" target="_blank">here</a> <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><a href="http://chriscavanagh.files.wordpress.com/2009/08/image4.png"><img style="display:inline;border-width:0;" title="image" border="0" alt="image" src="http://chriscavanagh.files.wordpress.com/2009/08/image_thumb1.png?w=485&#038;h=359" width="485" height="359" /></a></p>
<p><a title="WPF Chromium WebBrowser control demo" href="http://www.chriscavanagh.com/chris/Cjc.ThreeDeemium/publish.htm" target="_blank"><img style="display:inline;border-width:0;" title="image" border="0" alt="image" src="http://chriscavanagh.files.wordpress.com/2009/09/image1.png?w=485&#038;h=431" width="485" height="431" /></a> </p>
<p>For more fun, have a look at <a title="YouCube 3.0 - WPF 3D Chromium WebBrowser" href="http://chriscavanagh.wordpress.com/2009/08/27/wpf-3d-chromium-browser/" target="_blank">YouCube 3</a>!</p>
<div class="wlWriterHeaderFooter" style="margin:0;padding:0;"><a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fchriscavanagh.wordpress.com%2f2009%2f08%2f25%2fa-real-wpf-webbrowser%2f" rev="vote-for"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fchriscavanagh.wordpress.com%2f2009%2f08%2f25%2fa-real-wpf-webbrowser%2f" style="border:0;" alt="kick it" /></a></div>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chriscavanagh.wordpress.com/409/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chriscavanagh.wordpress.com/409/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chriscavanagh.wordpress.com/409/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chriscavanagh.wordpress.com/409/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chriscavanagh.wordpress.com/409/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chriscavanagh.wordpress.com/409/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chriscavanagh.wordpress.com/409/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chriscavanagh.wordpress.com/409/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chriscavanagh.wordpress.com/409/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chriscavanagh.wordpress.com/409/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chriscavanagh.wordpress.com&blog=313491&post=409&subd=chriscavanagh&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://chriscavanagh.wordpress.com/2009/08/25/a-real-wpf-webbrowser/feed/</wfw:commentRss>
		<slash:comments>145</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8b8858c8a6022411fc9d48c1f4963928?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Chris</media:title>
		</media:content>

		<media:content url="http://chriscavanagh.files.wordpress.com/2009/08/image1.png" medium="image">
			<media:title type="html">WPF Chromium Control</media:title>
		</media:content>

		<media:content url="http://chriscavanagh.files.wordpress.com/2009/08/image_thumb1.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://chriscavanagh.files.wordpress.com/2009/09/image1.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fchriscavanagh.wordpress.com%2f2009%2f08%2f25%2fa-real-wpf-webbrowser%2f" medium="image">
			<media:title type="html">kick it</media:title>
		</media:content>
	</item>
		<item>
		<title>Silverlight 3 + ClearType</title>
		<link>http://chriscavanagh.wordpress.com/2009/07/09/silverlight-3-cleartype/</link>
		<comments>http://chriscavanagh.wordpress.com/2009/07/09/silverlight-3-cleartype/#comments</comments>
		<pubDate>Thu, 09 Jul 2009 19:03:37 +0000</pubDate>
		<dc:creator>Chris Cavanagh</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://chriscavanagh.wordpress.com/2009/07/09/silverlight-3-cleartype/</guid>
		<description><![CDATA[As we knew, Silverlight 3 includes ClearType support.&#160; Now it’s released we can finally see it in action   :
 
More importantly, it works great with SilverGlulxe!
       <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chriscavanagh.wordpress.com&blog=313491&post=402&subd=chriscavanagh&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>As we knew, Silverlight 3 includes ClearType support.&#160; Now it’s released we can finally see it in action <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  :</p>
<p><a href="http://chriscavanagh.files.wordpress.com/2009/07/image1.png"><img style="border-bottom:0;border-left:0;display:inline;border-top:0;border-right:0;" title="image" border="0" alt="image" src="http://chriscavanagh.files.wordpress.com/2009/07/image_thumb1.png?w=474&#038;h=346" width="474" height="346" /></a> </p>
<p>More importantly, it works great with <a title="SilverGlulxe - Silverlight Interactive Fiction" href="http://www.chriscavanagh.com/chris/SilverGlulxe/SilverGlulxeTestPage.aspx" target="_blank">SilverGlulxe</a>!</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chriscavanagh.wordpress.com/402/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chriscavanagh.wordpress.com/402/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chriscavanagh.wordpress.com/402/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chriscavanagh.wordpress.com/402/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chriscavanagh.wordpress.com/402/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chriscavanagh.wordpress.com/402/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chriscavanagh.wordpress.com/402/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chriscavanagh.wordpress.com/402/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chriscavanagh.wordpress.com/402/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chriscavanagh.wordpress.com/402/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chriscavanagh.wordpress.com&blog=313491&post=402&subd=chriscavanagh&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://chriscavanagh.wordpress.com/2009/07/09/silverlight-3-cleartype/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8b8858c8a6022411fc9d48c1f4963928?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Chris</media:title>
		</media:content>

		<media:content url="http://chriscavanagh.files.wordpress.com/2009/07/image_thumb1.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
		<item>
		<title>WPF 2D Physics Plus</title>
		<link>http://chriscavanagh.wordpress.com/2009/06/25/wpf-2d-physics-plus/</link>
		<comments>http://chriscavanagh.wordpress.com/2009/06/25/wpf-2d-physics-plus/#comments</comments>
		<pubDate>Thu, 25 Jun 2009 19:01:59 +0000</pubDate>
		<dc:creator>Chris Cavanagh</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://chriscavanagh.wordpress.com/2009/06/25/wpf-2d-physics-plus/</guid>
		<description><![CDATA[Rohit Gupta is working on some great enhancements to the WPF 2D Physics demo I posted.&#160; Features include:

Click to remove a body from the world 
Click and “push” the body in any given direction 

Be sure to take a look!&#160; The project is here on CodePlex and you can run it as a ClickOnce app [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chriscavanagh.wordpress.com&blog=313491&post=398&subd=chriscavanagh&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Rohit Gupta is working on some great <a title="WPF 2D Physics Plus" href="http://wpf2dphysicsplus.codeplex.com/" target="_blank">enhancements</a> to the <a title="WPF 2d Physics" href="http://chriscavanagh.wordpress.com/2006/10/23/wpf-2d-physics" target="_blank">WPF 2D Physics</a> demo I posted.&#160; Features include:</p>
<ul>
<li>Click to remove a body from the world </li>
<li>Click and “push” the body in any given direction </li>
</ul>
<p>Be sure to take a look!&#160; The project is <a title="WPF 2D Physics Plus" href="http://wpf2dphysicsplus.codeplex.com/" target="_blank">here on CodePlex</a> and you can run it as a <a title="WPF Physics Plus - Rohit Gupta - ClickOnce app" href="http://www.chriscavanagh.com/Chris/WPFPhysicsPlus/publish.htm" target="_blank">ClickOnce app here</a>.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chriscavanagh.wordpress.com/398/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chriscavanagh.wordpress.com/398/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chriscavanagh.wordpress.com/398/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chriscavanagh.wordpress.com/398/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chriscavanagh.wordpress.com/398/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chriscavanagh.wordpress.com/398/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chriscavanagh.wordpress.com/398/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chriscavanagh.wordpress.com/398/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chriscavanagh.wordpress.com/398/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chriscavanagh.wordpress.com/398/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chriscavanagh.wordpress.com&blog=313491&post=398&subd=chriscavanagh&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://chriscavanagh.wordpress.com/2009/06/25/wpf-2d-physics-plus/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8b8858c8a6022411fc9d48c1f4963928?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Chris</media:title>
		</media:content>
	</item>
		<item>
		<title>MVC IsAuthorized and AuthorizedActionLink</title>
		<link>http://chriscavanagh.wordpress.com/2009/06/11/mvc-authorizedactionlink/</link>
		<comments>http://chriscavanagh.wordpress.com/2009/06/11/mvc-authorizedactionlink/#comments</comments>
		<pubDate>Thu, 11 Jun 2009 13:23:35 +0000</pubDate>
		<dc:creator>Chris Cavanagh</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://chriscavanagh.wordpress.com/2009/06/11/mvc-authorizedactionlink/</guid>
		<description><![CDATA[UPDATE: Fixed broken IsAuthenticated logic (thanks Travis).
Robert Dean published a great post last year about his Security Aware Html.ActionLink.&#160; It allowed you to conditionally render links based on the [AuthorizeAttribute] assigned to a controller’s action methods.
Here’s an alternative implementation based on expressions, so you get type safety, intellisense and slightly simpler code  &#160; First, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chriscavanagh.wordpress.com&blog=313491&post=383&subd=chriscavanagh&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><strong>UPDATE:</strong> Fixed broken IsAuthenticated logic (thanks Travis).</p>
<p>Robert Dean published a great post last year about his <a title="Security Aware Html.ActionLink" href="http://inq.me/post/ASPNet-MVC-Extension-method-to-create-a-Security-Aware-HtmlActionLink.aspx" target="_blank">Security Aware Html.ActionLink</a>.&#160; It allowed you to conditionally render links based on the [AuthorizeAttribute] assigned to a controller’s action methods.</p>
<p>Here’s an alternative implementation based on expressions, so you get type safety, intellisense and slightly simpler code <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> &#160; First, a helper to determine if an action is authorized:</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">class</span> AuthorizationExtensions
{
    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">static</span> Dictionary&lt;Expression, AuthorizeAttribute[]&gt; expressionAuthorizers = <span style="color:#0000ff;">new</span> Dictionary&lt;Expression, AuthorizeAttribute[]&gt;();

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Determines whether the specified action is authorized.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;typeparam name=&quot;TController&quot;&gt;The type of the controller.&lt;/typeparam&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;helper&quot;&gt;The helper.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;actionMethod&quot;&gt;The action method.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;</span>
    <span style="color:#008000;">///     &lt;c&gt;true&lt;/c&gt; if the specified helper is authorized; otherwise, &lt;c&gt;false&lt;/c&gt;.</span>
    <span style="color:#008000;">/// &lt;/returns&gt;</span>
    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">bool</span> IsAuthorized&lt;TController&gt;( <span style="color:#0000ff;">this</span> HtmlHelper helper, Expression&lt;Action&lt;TController&gt;&gt; action )
    {
        var call = action.Body <span style="color:#0000ff;">as</span> MethodCallExpression;

        <span style="color:#0000ff;">if</span> ( call == <span style="color:#0000ff;">null</span> ) <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">false</span>;

        var authorizers = expressionAuthorizers.ContainsKey( action )
            ? expressionAuthorizers[ action ]
            : expressionAuthorizers[ action ] = GetAttributes&lt;AuthorizeAttribute&gt;( call );

        <span style="color:#0000ff;">return</span> ( authorizers.Length &gt; 0 )
            ? authorizers.All( a =&gt; a.IsAuthorized( helper.ViewContext.HttpContext.User ) )
            : <span style="color:#0000ff;">true</span>;
    }

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Gets the specified attributes for an action method.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;call&quot;&gt;The call.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">static</span> TAttribute[] GetAttributes&lt;TAttribute&gt;( MethodCallExpression call ) <span style="color:#0000ff;">where</span> TAttribute : Attribute
    {
        <span style="color:#0000ff;">return</span> call.Object.Type.GetCustomAttributes( <span style="color:#0000ff;">typeof</span>( TAttribute ), <span style="color:#0000ff;">true</span> )
            .Union( call.Method.GetCustomAttributes( <span style="color:#0000ff;">typeof</span>( TAttribute ), <span style="color:#0000ff;">true</span> ) )
            .Cast&lt;TAttribute&gt;()
            .ToArray();
    }

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Determines whether the specified &lt;see cref=&quot;AuthorizeAttribute&quot;/&gt; authorizes the specified user.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;authorize&quot;&gt;The &lt;see cref=&quot;AuthorizeAttribute&quot;/&gt;.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;user&quot;&gt;The user.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;</span>
    <span style="color:#008000;">///     &lt;c&gt;true&lt;/c&gt; if the specified user is authorized; otherwise, &lt;c&gt;false&lt;/c&gt;.</span>
    <span style="color:#008000;">/// &lt;/returns&gt;</span>
    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">bool</span> IsAuthorized( <span style="color:#0000ff;">this</span> AuthorizeAttribute authorize, IPrincipal user )
    {
        <span style="color:#0000ff;">if</span> ( !user.Identity.IsAuthenticated ) <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">false</span>;

        var users = authorize.Users.SplitString();
        <span style="color:#0000ff;">if</span> ( users.Length &gt; 0 &amp;&amp; !users.Contains( user.Identity.Name, StringComparer.OrdinalIgnoreCase ) ) <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">false</span>;

        var roles = authorize.Roles.SplitString();
        <span style="color:#0000ff;">if</span> ( roles.Length &gt; 0 &amp;&amp; !roles.Any( user.IsInRole ) ) <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">false</span>;

        <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">true</span>;
    }

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Splits and trims the specified string.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;original&quot;&gt;The original.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">string</span>[] SplitString( <span style="color:#0000ff;">this</span> <span style="color:#0000ff;">string</span> original )
    {
        <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">string</span>.IsNullOrEmpty( original )
            ? <span style="color:#0000ff;">new</span> <span style="color:#0000ff;">string</span>[ 0 ]
            : original.Split( <span style="color:#006080;">'.'</span> ).Select( s =&gt; s.Trim() ).Where( s =&gt; !<span style="color:#0000ff;">string</span>.IsNullOrEmpty( s ) ).ToArray();
    }
}</pre>
</div>
<p>With that, it’s possible to write markup like this:</p>
<div>
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;height:50px;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0 0 20px;">&lt;% <span style="color:#0000ff;">if</span> ( Html.IsAuthorized&lt;ModelingController&gt;( c =&gt; c.Index() ) ) {%&gt;
    &lt;div&gt;My conditional content...&lt;/div&gt;
&lt;%}%&gt;
<div>&#160;</div>
</pre>
</div>
<p>If you’re using ASP.NET <a title="ASP.NET MVC Futures" href="http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24471" target="_blank">MVC Futures</a>, it’s straightforward to write an authorized ActionLink:</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">class</span> LinkExtensions
{
    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Render an HTML action link if authorized by the target action.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;typeparam name=&quot;TController&quot;&gt;The type of the controller.&lt;/typeparam&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;helper&quot;&gt;The helper.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;action&quot;&gt;The action.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;linkText&quot;&gt;The link text.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">string</span> AuthorizedActionLink&lt;TController&gt;( <span style="color:#0000ff;">this</span> HtmlHelper helper, Expression&lt;Action&lt;TController&gt;&gt; action, <span style="color:#0000ff;">string</span> linkText )
        <span style="color:#0000ff;">where</span> TController : Controller
    {
        <span style="color:#0000ff;">return</span> AuthorizedActionLink&lt;TController&gt;( helper, action, linkText, <span style="color:#0000ff;">null</span> );
    }

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Render an HTML action link if authorized by the target action.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;typeparam name=&quot;TController&quot;&gt;The type of the controller.&lt;/typeparam&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;helper&quot;&gt;The helper.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;action&quot;&gt;The action.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;linkText&quot;&gt;The link text.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;htmlAttributes&quot;&gt;The HTML attributes.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">string</span> AuthorizedActionLink&lt;TController&gt;( <span style="color:#0000ff;">this</span> HtmlHelper helper, Expression&lt;Action&lt;TController&gt;&gt; action, <span style="color:#0000ff;">string</span> linkText, <span style="color:#0000ff;">object</span> htmlAttributes )
        <span style="color:#0000ff;">where</span> TController : Controller
    {
        var routeValuesFromExpression = ExpressionHelper.GetRouteValuesFromExpression&lt;TController&gt;( action );

        <span style="color:#0000ff;">return</span> helper.IsAuthorized( action )
            ? helper.RouteLink( linkText, routeValuesFromExpression, <span style="color:#0000ff;">new</span> RouteValueDictionary( htmlAttributes ) )
            : <span style="color:#0000ff;">null</span>;
    }
}</pre>
</div>
<p>NOTE &#8211; You could do the same thing without MVC Futures, but would need a little more code (you’d need something like <a title="Microsoft.Web.Internal.ExpressionHelper" href="http://aspnet.codeplex.com/SourceControl/changeset/view/23011#266392" target="_blank">ExpressionHelper’s GetRouteValuesFromExpression</a> method).</p>
<p>Here’s a markup example:</p>
<div>
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;height:50px;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;">&lt;%= Html.AuthorizedActionLink&lt;ModelingController&gt;( c =&gt; c.Index(), <span style="color:#006080;">&quot;Modeling&quot;</span> ) %&gt;
<div>&#160;</div>
</pre>
</div>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chriscavanagh.wordpress.com/383/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chriscavanagh.wordpress.com/383/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chriscavanagh.wordpress.com/383/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chriscavanagh.wordpress.com/383/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chriscavanagh.wordpress.com/383/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chriscavanagh.wordpress.com/383/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chriscavanagh.wordpress.com/383/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chriscavanagh.wordpress.com/383/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chriscavanagh.wordpress.com/383/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chriscavanagh.wordpress.com/383/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chriscavanagh.wordpress.com&blog=313491&post=383&subd=chriscavanagh&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://chriscavanagh.wordpress.com/2009/06/11/mvc-authorizedactionlink/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8b8858c8a6022411fc9d48c1f4963928?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Chris</media:title>
		</media:content>
	</item>
		<item>
		<title>Pretty Printing Exceptions</title>
		<link>http://chriscavanagh.wordpress.com/2009/05/31/pretty-printing-exceptions/</link>
		<comments>http://chriscavanagh.wordpress.com/2009/05/31/pretty-printing-exceptions/#comments</comments>
		<pubDate>Sun, 31 May 2009 08:24:20 +0000</pubDate>
		<dc:creator>Chris Cavanagh</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://chriscavanagh.wordpress.com/2009/05/31/pretty-printing-exceptions/</guid>
		<description><![CDATA[Here are some snippets you might find useful for pretty-printing exception stack traces (using the trace string rather than the StackTrace class).
First, a regular expression to extract namespace, method name, argument and source details from a stack trace string:
\sat\s(?&#60;namespace&#62;.*?)\.(?&#60;method&#62;(\.ctor&#124;&#60;\.ctor&#62;[^(]*?&#124;[^.(]+))\(\s*(((?&#60;type&#62;[^,\s)]+)\s+(?&#60;arg&#62;[^,\s)]+)\s*,?\s*?)*?)\s*\)( in (?&#60;file&#62;.*?):line (?&#60;line&#62;[0-9]*))?

Next, a helper class that uses the regex to return a collection of method [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chriscavanagh.wordpress.com&blog=313491&post=373&subd=chriscavanagh&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Here are some snippets you might find useful for pretty-printing exception stack traces (using the trace string rather than the <a title="StackTrace class" href="http://msdn.microsoft.com/en-us/library/system.diagnostics.stacktrace.aspx" target="_blank">StackTrace</a> class).</p>
<p>First, a regular expression to extract namespace, method name, argument and source details from a stack trace string:</p>
<blockquote><p>\sat\s(?&lt;namespace&gt;.*?)\.(?&lt;method&gt;(\.ctor|&lt;\.ctor&gt;[^(]*?|[^.(]+))\(\s*(((?&lt;type&gt;[^,\s)]+)\s+(?&lt;arg&gt;[^,\s)]+)\s*,?\s*?)*?)\s*\)( in (?&lt;file&gt;.*?):line (?&lt;line&gt;[0-9]*))?</p>
</blockquote>
<p>Next, a helper class that uses the regex to return a collection of method details:</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">public</span> <span style="color:#0000ff;">class</span> ExceptionParser
{
    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">static</span> Regex stackTraceExpr = <span style="color:#0000ff;">new</span> Regex(
        <span style="color:#006080;">@&quot;\sat\s(?&lt;namespace&gt;.*?)\.(?&lt;method&gt;(\.ctor|&lt;\.ctor&gt;[^(]*?|[^.(]+))\(\s*(((?&lt;type&gt;[^, )]+)\s+(?&lt;arg&gt;[^, )]+)\s*,?\s*?)*?)\s*\)( in (?&lt;file&gt;.*?):line (?&lt;line&gt;[0-9]*))?&quot;</span> );

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Parses the stack trace.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;stackTrace&quot;&gt;The stack trace.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> IEnumerable&lt;Method&gt; ParseStackTrace( <span style="color:#0000ff;">string</span> stackTrace )
    {
        var matches = stackTraceExpr.Matches( stackTrace ).Cast&lt;Match&gt;();

        <span style="color:#0000ff;">foreach</span> ( var match <span style="color:#0000ff;">in</span> matches )
        {
            var line = match.Groups[ <span style="color:#006080;">&quot;line&quot;</span> ].Value;

            <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">new</span> Method
            {
                Namespace = match.Groups[ <span style="color:#006080;">&quot;namespace&quot;</span> ].Value,
                Name = match.Groups[ <span style="color:#006080;">&quot;method&quot;</span> ].Value,
                Arguments = ParseArguments( match ).ToArray(),
                Source = match.Groups[ <span style="color:#006080;">&quot;source&quot;</span> ].Value,
                Line = !<span style="color:#0000ff;">string</span>.IsNullOrEmpty( line ) ? (<span style="color:#0000ff;">int</span>?)<span style="color:#0000ff;">int</span>.Parse( line ) : <span style="color:#0000ff;">null</span>
            };
        }
    }

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Parses the arguments.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;match&quot;&gt;The match.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">static</span> IEnumerable&lt;Argument&gt; ParseArguments( Match match )
    {
        var type = match.Groups[ <span style="color:#006080;">&quot;type&quot;</span> ];
        var arg = match.Groups[ <span style="color:#006080;">&quot;arg&quot;</span> ];
        var types = type.Captures.Cast&lt;Capture&gt;().Select( c =&gt; c.Value ).Union( <span style="color:#0000ff;">new</span>[] { type.Value } ).GetEnumerator();
        var args = arg.Captures.Cast&lt;Capture&gt;().Select( c =&gt; c.Value ).Union( <span style="color:#0000ff;">new</span>[] { arg.Value } ).GetEnumerator();

        <span style="color:#0000ff;">while</span> ( types.MoveNext() &amp;&amp; args.MoveNext() )
        {
            <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">new</span> Argument
            {
                Type = types.Current,
                Name = args.Current
            };
        }
    }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">struct</span> Argument
    {
        <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">string</span> Type;
        <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">string</span> Name;
    }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">struct</span> Method
    {
        <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">string</span> Namespace;
        <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">string</span> Name;
        <span style="color:#0000ff;">public</span> Argument[] Arguments;
        <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">string</span> Source;
        <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">int</span>? Line;
    }
}</pre>
</div>
<p>From there you might want to render it as a WPF FlowDocument or series of Inlines in WPF or Silverlight (you can use this directly or as an <a title="IValueConverter Interface" href="http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter(loband).aspx" target="_blank">IValueConverter</a>):</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">public</span> <span style="color:#0000ff;">class</span> PrettyExceptionConverter : DependencyObject, IValueConverter
{
    <span style="color:#cc6633;">#region</span> Dependency properties

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> DependencyProperty ErrorStyleProperty = RegisterStyle( <span style="color:#006080;">&quot;ErrorStyle&quot;</span>, MakeStyle( Colors.Red, FontStyles.Italic, FontWeights.Bold ) );
    <span style="color:#0000ff;">public</span> Style ErrorStyle { get { <span style="color:#0000ff;">return</span> (Style)GetValue( ErrorStyleProperty ); } set { SetValue( ErrorStyleProperty, <span style="color:#0000ff;">value</span> ); } }
    <span style="color:#0000ff;">private</span> Inline Error( <span style="color:#0000ff;">string</span> text ) { <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">new</span> Run( text ) { Style = ErrorStyle }; }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> DependencyProperty NamespaceStyleProperty = RegisterStyle( <span style="color:#006080;">&quot;NamespaceStyle&quot;</span>, MakeStyle( Colors.Blue ) );
    <span style="color:#0000ff;">public</span> Style NamespaceStyle { get { <span style="color:#0000ff;">return</span> (Style)GetValue( NamespaceStyleProperty ); } set { SetValue( NamespaceStyleProperty, <span style="color:#0000ff;">value</span> ); } }
    <span style="color:#0000ff;">private</span> Inline Namespace( <span style="color:#0000ff;">string</span> text ) { <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">new</span> Run( text ) { Style = NamespaceStyle }; }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> DependencyProperty MethodNameStyleProperty = RegisterStyle( <span style="color:#006080;">&quot;MethodNameStyle&quot;</span>, MakeStyle( Colors.Black, <span style="color:#0000ff;">null</span>, FontWeights.Bold ) );
    <span style="color:#0000ff;">public</span> Style MethodNameStyle { get { <span style="color:#0000ff;">return</span> (Style)GetValue( MethodNameStyleProperty ); } set { SetValue( MethodNameStyleProperty, <span style="color:#0000ff;">value</span> ); } }
    <span style="color:#0000ff;">private</span> Inline MethodName( <span style="color:#0000ff;">string</span> text ) { <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">new</span> Run( text ) { Style = MethodNameStyle }; }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> DependencyProperty BracketStyleProperty = RegisterStyle( <span style="color:#006080;">&quot;BracketStyle&quot;</span>, MakeStyle( Colors.DarkRed ) );
    <span style="color:#0000ff;">public</span> Style BracketStyle { get { <span style="color:#0000ff;">return</span> (Style)GetValue( BracketStyleProperty ); } set { SetValue( BracketStyleProperty, <span style="color:#0000ff;">value</span> ); } }
    <span style="color:#0000ff;">private</span> Inline Bracket( <span style="color:#0000ff;">string</span> text ) { <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">new</span> Run( text ) { Style = BracketStyle }; }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> DependencyProperty SeparatorStyleProperty = RegisterStyle( <span style="color:#006080;">&quot;SeparatorStyle&quot;</span>, MakeStyle( Colors.DarkBlue ) );
    <span style="color:#0000ff;">public</span> Style SeparatorStyle { get { <span style="color:#0000ff;">return</span> (Style)GetValue( SeparatorStyleProperty ); } set { SetValue( SeparatorStyleProperty, <span style="color:#0000ff;">value</span> ); } }
    <span style="color:#0000ff;">private</span> Inline Separator( <span style="color:#0000ff;">string</span> text ) { <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">new</span> Run( text ) { Style = SeparatorStyle }; }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> DependencyProperty SpaceStyleProperty = RegisterStyle( <span style="color:#006080;">&quot;SpaceStyle&quot;</span>, <span style="color:#0000ff;">null</span> );
    <span style="color:#0000ff;">public</span> Style SpaceStyle { get { <span style="color:#0000ff;">return</span> (Style)GetValue( SpaceStyleProperty ); } set { SetValue( SpaceStyleProperty, <span style="color:#0000ff;">value</span> ); } }
    <span style="color:#0000ff;">private</span> Inline Space() { <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">new</span> Run( <span style="color:#006080;">&quot; &quot;</span> ) { Style = SpaceStyle }; }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> DependencyProperty TypeNameStyleProperty = RegisterStyle( <span style="color:#006080;">&quot;TypeNameStyle&quot;</span>, MakeStyle( Colors.Teal ) );
    <span style="color:#0000ff;">public</span> Style TypeNameStyle { get { <span style="color:#0000ff;">return</span> (Style)GetValue( TypeNameStyleProperty ); } set { SetValue( TypeNameStyleProperty, <span style="color:#0000ff;">value</span> ); } }
    <span style="color:#0000ff;">private</span> Inline TypeName( <span style="color:#0000ff;">string</span> text ) { <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">new</span> Run( text ) { Style = TypeNameStyle }; }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> DependencyProperty ArgumentStyleProperty = RegisterStyle( <span style="color:#006080;">&quot;ArgumentStyle&quot;</span>, MakeStyle( Colors.DarkGreen ) );
    <span style="color:#0000ff;">public</span> Style ArgumentStyle { get { <span style="color:#0000ff;">return</span> (Style)GetValue( ArgumentStyleProperty ); } set { SetValue( ArgumentStyleProperty, <span style="color:#0000ff;">value</span> ); } }
    <span style="color:#0000ff;">private</span> Inline Argument( <span style="color:#0000ff;">string</span> text ) { <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">new</span> Run( text ) { Style = ArgumentStyle }; }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> DependencyProperty SourceStyleProperty = RegisterStyle( <span style="color:#006080;">&quot;SourceStyle&quot;</span>, MakeStyle( Colors.Gray ) );
    <span style="color:#0000ff;">public</span> Style SourceStyle { get { <span style="color:#0000ff;">return</span> (Style)GetValue( SourceStyleProperty ); } set { SetValue( SourceStyleProperty, <span style="color:#0000ff;">value</span> ); } }
    <span style="color:#0000ff;">private</span> Inline Source( <span style="color:#0000ff;">string</span> text ) { <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">new</span> Run( text ) { Style = SourceStyle }; }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> DependencyProperty LocationStyleProperty = RegisterStyle( <span style="color:#006080;">&quot;LocationStyle&quot;</span>, MakeStyle( Colors.DarkRed ) );
    <span style="color:#0000ff;">public</span> Style LocationStyle { get { <span style="color:#0000ff;">return</span> (Style)GetValue( LocationStyleProperty ); } set { SetValue( LocationStyleProperty, <span style="color:#0000ff;">value</span> ); } }
    <span style="color:#0000ff;">private</span> Inline Location( <span style="color:#0000ff;">string</span> text ) { <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">new</span> Run( text ) { Style = LocationStyle }; }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> DependencyProperty ChildIndentProperty = DependencyProperty.Register( <span style="color:#006080;">&quot;ChildIndent&quot;</span>, <span style="color:#0000ff;">typeof</span>( <span style="color:#0000ff;">double</span> ), <span style="color:#0000ff;">typeof</span>( PrettyExceptionConverter ), <span style="color:#0000ff;">new</span> PropertyMetadata( 25d ) );
    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">double</span> ChildIndent { get { <span style="color:#0000ff;">return</span> (<span style="color:#0000ff;">double</span>)GetValue( ChildIndentProperty ); } set { SetValue( ChildIndentProperty, <span style="color:#0000ff;">value</span> ); } }

    <span style="color:#cc6633;">#endregion</span>

    <span style="color:#cc6633;">#region</span> Static helpers

    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">static</span> DependencyProperty RegisterStyle( <span style="color:#0000ff;">string</span> name, Style defaultStyle )
    {
        <span style="color:#0000ff;">return</span> DependencyProperty.Register(
            name,
            <span style="color:#0000ff;">typeof</span>( Style ),
            <span style="color:#0000ff;">typeof</span>( PrettyExceptionConverter ),
            <span style="color:#0000ff;">new</span> PropertyMetadata( defaultStyle ) );
    }

    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">static</span> Style MakeStyle( Color color )
    {
        <span style="color:#0000ff;">return</span> MakeStyle( color, <span style="color:#0000ff;">null</span>, <span style="color:#0000ff;">null</span> );
    }

    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">static</span> Style MakeStyle( Color color, FontStyle? fontStyle )
    {
        <span style="color:#0000ff;">return</span> MakeStyle( color, fontStyle, <span style="color:#0000ff;">null</span> );
    }

    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">static</span> Style MakeStyle( Color color, FontStyle? fontStyle, FontWeight? fontWeight )
    {
        var style = <span style="color:#0000ff;">new</span> Style();
        style.Setters.Add( <span style="color:#0000ff;">new</span> Setter( Run.ForegroundProperty, <span style="color:#0000ff;">new</span> SolidColorBrush( color ) ) );
        <span style="color:#0000ff;">if</span> ( fontStyle.HasValue ) style.Setters.Add( <span style="color:#0000ff;">new</span> Setter( Run.FontStyleProperty, fontStyle.Value ) );
        <span style="color:#0000ff;">if</span> ( fontWeight.HasValue ) style.Setters.Add( <span style="color:#0000ff;">new</span> Setter( Run.FontWeightProperty, fontWeight.Value ) );
        <span style="color:#0000ff;">return</span> style;
    }

    <span style="color:#cc6633;">#endregion</span>

    <span style="color:#cc6633;">#region</span> FlowDocument helpers

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Renders the specified &lt;see cref=&quot;Exception&quot;/&gt;.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;ex&quot;&gt;The ex.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
    <span style="color:#0000ff;">public</span> FlowDocument Render( Exception ex )
    {
        var doc = <span style="color:#0000ff;">new</span> FlowDocument
        {
            FontFamily = <span style="color:#0000ff;">new</span> FontFamily( <span style="color:#006080;">&quot;Arial&quot;</span> ),
            FontSize = 14d,
            PagePadding = <span style="color:#0000ff;">new</span> Thickness( 0 )
        };

        doc.Blocks.AddRange( RenderExceptions( ex ) );

        <span style="color:#0000ff;">return</span> doc;
    }

    <span style="color:#0000ff;">private</span> Inline LineBreak()
    {
        <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">new</span> LineBreak();
    }

    <span style="color:#cc6633;">#endregion</span>

    <span style="color:#cc6633;">#region</span> Rendering helpers

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Renders the &lt;see cref=&quot;Exception&quot;/&gt; and inner Exceptions.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;ex&quot;&gt;The ex.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
    <span style="color:#0000ff;">public</span> IEnumerable&lt;Block&gt; RenderExceptions( Exception ex )
    {
        var indent = 0d;
        var hanging = ChildIndent / 2;

        <span style="color:#0000ff;">for</span> ( ; ex != <span style="color:#0000ff;">null</span>; ex = ex.InnerException )
        {
            <span style="color:#0000ff;">foreach</span> ( var block <span style="color:#0000ff;">in</span> RenderException( ex, indent, hanging ) ) <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> block;
            indent += ChildIndent;
        }
    }

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Renders the &lt;see cref=&quot;Exception&quot;/&gt;.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;ex&quot;&gt;The ex.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;indent&quot;&gt;The indent.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;hanging&quot;&gt;The hanging indent.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
    <span style="color:#0000ff;">public</span> IEnumerable&lt;Block&gt; RenderException( Exception ex, <span style="color:#0000ff;">double</span> indent, <span style="color:#0000ff;">double</span> hanging )
    {
        var paragraph = <span style="color:#0000ff;">new</span> Paragraph
        {
            TextAlignment = TextAlignment.Left,
            IsHyphenationEnabled = <span style="color:#0000ff;">false</span>,
            TextIndent = -hanging,
            Margin = <span style="color:#0000ff;">new</span> Thickness( indent + hanging, 0, 0, 0 )
        };

        paragraph.Inlines.AddRange( RenderException( ex ) );

        <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> paragraph;
    }

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Renders the &lt;see cref=&quot;Exception&quot;/&gt;.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;ex&quot;&gt;The ex.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
    <span style="color:#0000ff;">public</span> IEnumerable&lt;Inline&gt; RenderException( Exception ex )
    {
        <span style="color:#0000ff;">if</span> ( ex != <span style="color:#0000ff;">null</span> )
        {
            <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Error( ex.Message );

            <span style="color:#0000ff;">if</span> ( ex.StackTrace != <span style="color:#0000ff;">null</span> )
            {
                <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> LineBreak();
                <span style="color:#0000ff;">foreach</span> ( var method <span style="color:#0000ff;">in</span> RenderStackTrace( ex.StackTrace ) ) <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> method;
            }
        }
    }

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Renders the stack trace.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;stackTrace&quot;&gt;The stack trace.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
    <span style="color:#0000ff;">public</span> IEnumerable&lt;Inline&gt; RenderStackTrace( <span style="color:#0000ff;">string</span> stackTrace )
    {
        <span style="color:#0000ff;">if</span> ( stackTrace != <span style="color:#0000ff;">null</span> )
        {
            var first = <span style="color:#0000ff;">true</span>;

            <span style="color:#0000ff;">foreach</span> ( var method <span style="color:#0000ff;">in</span> ExceptionParser.ParseStackTrace( stackTrace ) )
            {
                <span style="color:#0000ff;">if</span> ( !first ) <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> LineBreak();
                <span style="color:#0000ff;">else</span> first = <span style="color:#0000ff;">false</span>;

                <span style="color:#0000ff;">foreach</span> ( var inline <span style="color:#0000ff;">in</span> RenderMethod( method ) ) <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> inline;
            }
        }
    }

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Renders the method.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;method&quot;&gt;The method.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
    <span style="color:#0000ff;">public</span> IEnumerable&lt;Inline&gt; RenderMethod( ExceptionParser.Method method )
    {
        <span style="color:#0000ff;">foreach</span> ( var ns <span style="color:#0000ff;">in</span> method.Namespace.Split( <span style="color:#006080;">'.'</span> ) )
        {
            <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Namespace( ns );
            <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Separator( <span style="color:#006080;">&quot;.&quot;</span> );
        }

        <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> MethodName( method.Name );
        <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Bracket( <span style="color:#006080;">&quot;(&quot;</span> );

        <span style="color:#0000ff;">if</span> ( method.Arguments.Length &gt; 0 )
        {
            <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Space();

            var first = <span style="color:#0000ff;">true</span>;

            <span style="color:#0000ff;">foreach</span> ( var arg <span style="color:#0000ff;">in</span> method.Arguments )
            {
                <span style="color:#0000ff;">if</span> ( !first )
                {
                    <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Bracket( <span style="color:#006080;">&quot;,&quot;</span> );
                    <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Space();
                }
                <span style="color:#0000ff;">else</span> first = <span style="color:#0000ff;">false</span>;

                <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> TypeName( arg.Type );
                <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Space();
                <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Argument( arg.Name );
            }

            <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Space();
        }

        <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Bracket( <span style="color:#006080;">&quot;)&quot;</span> );
    }

    <span style="color:#cc6633;">#endregion</span>

    <span style="color:#cc6633;">#region</span> IValueConverter Members

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">object</span> Convert( <span style="color:#0000ff;">object</span> <span style="color:#0000ff;">value</span>, Type targetType, <span style="color:#0000ff;">object</span> parameter, System.Globalization.CultureInfo culture )
    {
        <span style="color:#0000ff;">return</span> ( <span style="color:#0000ff;">value</span> <span style="color:#0000ff;">is</span> Exception )
            ? (<span style="color:#0000ff;">object</span>)Render( (Exception)<span style="color:#0000ff;">value</span> )
            : RenderStackTrace( <span style="color:#0000ff;">value</span> <span style="color:#0000ff;">as</span> <span style="color:#0000ff;">string</span> );
    }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">object</span> ConvertBack( <span style="color:#0000ff;">object</span> <span style="color:#0000ff;">value</span>, Type targetType, <span style="color:#0000ff;">object</span> parameter, System.Globalization.CultureInfo culture )
    {
        <span style="color:#0000ff;">throw</span> <span style="color:#0000ff;">new</span> NotImplementedException();
    }

    <span style="color:#cc6633;">#endregion</span>
}</pre>
</div>
<p>You can set the Style properties to change the appearance.&#160; Here’s an example that puts the stack traces inside nested Expanders:</p>
<p><a href="http://chriscavanagh.files.wordpress.com/2009/05/image3.png"><img style="display:inline;border-width:0;" title="image" border="0" alt="image" src="http://chriscavanagh.files.wordpress.com/2009/05/image_thumb1.png?w=492&#038;h=250" width="492" height="250" /></a> </p>
<p>Maybe you’d prefer to render as HTML (useful for health monitoring emails etc):</p>
</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">public</span> <span style="color:#0000ff;">class</span> PrettyExceptionPrint
{
    <span style="color:#cc6633;">#region</span> Properties

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> <span style="color:#0000ff;">string</span> ErrorStyle = <span style="color:#006080;">&quot;PEP_Error&quot;</span>;
    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">string</span> Error( <span style="color:#0000ff;">string</span> text ) { <span style="color:#0000ff;">return</span> Span( text, ErrorStyle ); }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> <span style="color:#0000ff;">string</span> NamespaceStyle = <span style="color:#006080;">&quot;PEP_Namespace&quot;</span>;
    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">string</span> Namespace( <span style="color:#0000ff;">string</span> text ) { <span style="color:#0000ff;">return</span> Span( text, NamespaceStyle ); }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> <span style="color:#0000ff;">string</span> MethodNameStyle = <span style="color:#006080;">&quot;PEP_MethodName&quot;</span>;
    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">string</span> MethodName( <span style="color:#0000ff;">string</span> text ) { <span style="color:#0000ff;">return</span> Span( text, MethodNameStyle ); }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> <span style="color:#0000ff;">string</span> BracketStyle = <span style="color:#006080;">&quot;PEP_Bracket&quot;</span>;
    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">string</span> Bracket( <span style="color:#0000ff;">string</span> text ) { <span style="color:#0000ff;">return</span> Span( text, BracketStyle ); }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> <span style="color:#0000ff;">string</span> SeparatorStyle = <span style="color:#006080;">&quot;PEP_Separator&quot;</span>;
    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">string</span> Separator( <span style="color:#0000ff;">string</span> text ) { <span style="color:#0000ff;">return</span> Span( text, SeparatorStyle ); }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> <span style="color:#0000ff;">string</span> SpaceStyle = <span style="color:#006080;">&quot;PEP_Space&quot;</span>;
    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">string</span> Space() { <span style="color:#0000ff;">return</span> Span( <span style="color:#006080;">&quot; &quot;</span>, SpaceStyle ); }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> <span style="color:#0000ff;">string</span> TypeNameStyle = <span style="color:#006080;">&quot;PEP_TypeName&quot;</span>;
    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">string</span> TypeName( <span style="color:#0000ff;">string</span> text ) { <span style="color:#0000ff;">return</span> Span( text, TypeNameStyle ); }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> <span style="color:#0000ff;">string</span> ArgumentStyle = <span style="color:#006080;">&quot;PEP_Argument&quot;</span>;
    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">string</span> Argument( <span style="color:#0000ff;">string</span> text ) { <span style="color:#0000ff;">return</span> Span( text, ArgumentStyle ); }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> <span style="color:#0000ff;">string</span> SourceStyle = <span style="color:#006080;">&quot;PEP_Source&quot;</span>;
    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">string</span> Source( <span style="color:#0000ff;">string</span> text ) { <span style="color:#0000ff;">return</span> Span( text, SourceStyle ); }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> <span style="color:#0000ff;">string</span> LocationStyle = <span style="color:#006080;">&quot;PEP_Location&quot;</span>;
    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">string</span> Location( <span style="color:#0000ff;">string</span> text ) { <span style="color:#0000ff;">return</span> Span( text, LocationStyle ); }

    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">double</span> ChildIndent { get; set; }

    <span style="color:#cc6633;">#endregion</span>

    <span style="color:#cc6633;">#region</span> HTML helpers

    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">string</span> Span( <span style="color:#0000ff;">object</span> content )
    {
        <span style="color:#0000ff;">return</span> Span( content, <span style="color:#0000ff;">null</span> );
    }

    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">string</span> Span( <span style="color:#0000ff;">object</span> content, <span style="color:#0000ff;">string</span> css )
    {
        <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">string</span>.Format( <span style="color:#006080;">&quot;&lt;span{0}&gt;{1}&lt;/span&gt;&quot;</span>, <span style="color:#0000ff;">string</span>.IsNullOrEmpty( css ) ? <span style="color:#0000ff;">null</span> : <span style="color:#006080;">&quot; class='&quot;</span> + css + <span style="color:#006080;">&quot;'&quot;</span>, content );
    }

    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">string</span> LineBreak()
    {
        <span style="color:#0000ff;">return</span> <span style="color:#006080;">&quot;&lt;br/&gt;\n&quot;</span>;
    }

    <span style="color:#cc6633;">#endregion</span>

    <span style="color:#cc6633;">#region</span> Rendering helpers

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Renders the &lt;see cref=&quot;Exception&quot;/&gt; and inner Exceptions.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;ex&quot;&gt;The ex.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
    <span style="color:#0000ff;">public</span> IEnumerable&lt;<span style="color:#0000ff;">string</span>&gt; RenderExceptions( Exception ex )
    {
        var indent = 0d;
        var hanging = ChildIndent / 2;

        <span style="color:#0000ff;">for</span> ( ; ex != <span style="color:#0000ff;">null</span>; ex = ex.InnerException )
        {
            <span style="color:#0000ff;">foreach</span> ( var block <span style="color:#0000ff;">in</span> RenderException( ex, indent, hanging ) ) <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> block;
            indent += ChildIndent;
        }
    }

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Renders the &lt;see cref=&quot;Exception&quot;/&gt;.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;ex&quot;&gt;The ex.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;indent&quot;&gt;The indent.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;hanging&quot;&gt;The hanging indent.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
    <span style="color:#0000ff;">public</span> IEnumerable&lt;<span style="color:#0000ff;">string</span>&gt; RenderException( Exception ex, <span style="color:#0000ff;">double</span> indent, <span style="color:#0000ff;">double</span> hanging )
    {
        <span style="color:#0000ff;">foreach</span> ( var markup <span style="color:#0000ff;">in</span> RenderException( ex ) ) <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> markup;
    }

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Renders the &lt;see cref=&quot;Exception&quot;/&gt;.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;ex&quot;&gt;The ex.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
    <span style="color:#0000ff;">public</span> IEnumerable&lt;<span style="color:#0000ff;">string</span>&gt; RenderException( Exception ex )
    {
        <span style="color:#0000ff;">if</span> ( ex != <span style="color:#0000ff;">null</span> )
        {
            <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Error( ex.Message );

            <span style="color:#0000ff;">if</span> ( ex.StackTrace != <span style="color:#0000ff;">null</span> )
            {
                <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> LineBreak();
                <span style="color:#0000ff;">foreach</span> ( var method <span style="color:#0000ff;">in</span> RenderStackTrace( ex.StackTrace ) ) <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> method;
            }
        }
    }

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Renders the stack trace.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;stackTrace&quot;&gt;The stack trace.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
    <span style="color:#0000ff;">public</span> IEnumerable&lt;<span style="color:#0000ff;">string</span>&gt; RenderStackTrace( <span style="color:#0000ff;">string</span> stackTrace )
    {
        <span style="color:#0000ff;">if</span> ( stackTrace != <span style="color:#0000ff;">null</span> )
        {
            var first = <span style="color:#0000ff;">true</span>;

            <span style="color:#0000ff;">foreach</span> ( var method <span style="color:#0000ff;">in</span> ExceptionParser.ParseStackTrace( stackTrace ) )
            {
                <span style="color:#0000ff;">if</span> ( !first ) <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> LineBreak();
                <span style="color:#0000ff;">else</span> first = <span style="color:#0000ff;">false</span>;

                <span style="color:#0000ff;">foreach</span> ( var inline <span style="color:#0000ff;">in</span> RenderMethod( method ) ) <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> inline;
            }
        }
    }

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Renders the method.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;method&quot;&gt;The method.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
    <span style="color:#0000ff;">public</span> IEnumerable&lt;<span style="color:#0000ff;">string</span>&gt; RenderMethod( ExceptionParser.Method method )
    {
        <span style="color:#0000ff;">foreach</span> ( var ns <span style="color:#0000ff;">in</span> method.Namespace.Split( <span style="color:#006080;">'.'</span> ) )
        {
            <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Namespace( ns );
            <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Separator( <span style="color:#006080;">&quot;.&quot;</span> );
        }

        <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> MethodName( method.Name );
        <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Bracket( <span style="color:#006080;">&quot;(&quot;</span> );

        <span style="color:#0000ff;">if</span> ( method.Arguments.Length &gt; 0 )
        {
            <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Space();

            var first = <span style="color:#0000ff;">true</span>;

            <span style="color:#0000ff;">foreach</span> ( var arg <span style="color:#0000ff;">in</span> method.Arguments )
            {
                <span style="color:#0000ff;">if</span> ( !first )
                {
                    <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Bracket( <span style="color:#006080;">&quot;,&quot;</span> );
                    <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Space();
                }
                <span style="color:#0000ff;">else</span> first = <span style="color:#0000ff;">false</span>;

                <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> TypeName( arg.Type );
                <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Space();
                <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Argument( arg.Name );
            }

            <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Space();
        }

        <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> Bracket( <span style="color:#006080;">&quot;)&quot;</span> );
    }

    <span style="color:#cc6633;">#endregion</span>
}</pre>
</div>
<p>Then just add some CSS for the PEP_* classes to change the appearance:</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">&lt;</span><span style="color:#800000;">style</span><span style="color:#0000ff;">&gt;</span>
    html, body { font-family: Arial; }
    .PEP_Namespace { color: darkblue; }
    .PEP_MethodName { color: black; font-weight: bold; }
    .PEP_Bracket { color: darkgreen; }
    .PEP_TypeName { color: teal; }
    .PEP_Argument { color: darkred; }
<span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">style</span><span style="color:#0000ff;">&gt;</span></pre>
</div>
<p>It’ll look something like this:</p>
<p><a href="http://chriscavanagh.files.wordpress.com/2009/05/image4.png"><img style="display:inline;border-width:0;" title="image" border="0" alt="image" src="http://chriscavanagh.files.wordpress.com/2009/05/image_thumb2.png?w=512&#038;h=300" width="512" height="300" /></a> </p>
</p>
<p>Rendering to XML is even easier:</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">public</span> <span style="color:#0000ff;">class</span> PrettyExceptionPrint
{
    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Renders the &lt;see cref=&quot;Exception&quot;/&gt; and inner Exceptions.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;ex&quot;&gt;The ex.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> IEnumerable&lt;XElement&gt; RenderExceptions( Exception ex )
    {
        <span style="color:#0000ff;">for</span> ( ; ex != <span style="color:#0000ff;">null</span>; ex = ex.InnerException ) <span style="color:#0000ff;">yield</span> <span style="color:#0000ff;">return</span> RenderException( ex );
    }

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Renders the &lt;see cref=&quot;Exception&quot;/&gt;.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;ex&quot;&gt;The ex.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> XElement RenderException( Exception ex )
    {
        <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">new</span> XElement( <span style="color:#006080;">&quot;Exception&quot;</span>,
            <span style="color:#0000ff;">new</span> XAttribute( <span style="color:#006080;">&quot;Type&quot;</span>, ex.GetType() ),
            <span style="color:#0000ff;">new</span> XAttribute( <span style="color:#006080;">&quot;Message&quot;</span>, ex.Message ),
            <span style="color:#0000ff;">new</span> XElement( <span style="color:#006080;">&quot;StackTrace&quot;</span>, RenderStackTrace( ex.StackTrace ) ) );
    }

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Renders the stack trace.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;stackTrace&quot;&gt;The stack trace.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> IEnumerable&lt;XElement&gt; RenderStackTrace( <span style="color:#0000ff;">string</span> stackTrace )
    {
        <span style="color:#0000ff;">return</span> from method <span style="color:#0000ff;">in</span> ExceptionParser.ParseStackTrace( stackTrace )
               select RenderMethod( method );
    }

    <span style="color:#008000;">/// &lt;summary&gt;</span>
    <span style="color:#008000;">/// Renders the method.</span>
    <span style="color:#008000;">/// &lt;/summary&gt;</span>
    <span style="color:#008000;">/// &lt;param name=&quot;method&quot;&gt;The method.&lt;/param&gt;</span>
    <span style="color:#008000;">/// &lt;returns&gt;&lt;/returns&gt;</span>
    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> XElement RenderMethod( ExceptionParser.Method method )
    {
        <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">new</span> XElement( <span style="color:#006080;">&quot;Method&quot;</span>,
            <span style="color:#0000ff;">new</span> XAttribute( <span style="color:#006080;">&quot;Namespace&quot;</span>, method.Namespace ),
            <span style="color:#0000ff;">new</span> XAttribute( <span style="color:#006080;">&quot;Name&quot;</span>, method.Name ),
            <span style="color:#0000ff;">new</span> XElement( <span style="color:#006080;">&quot;Arguments&quot;</span>,
                from arg <span style="color:#0000ff;">in</span> method.Arguments
                select <span style="color:#0000ff;">new</span> XElement( <span style="color:#006080;">&quot;Argument&quot;</span>,
                    <span style="color:#0000ff;">new</span> XAttribute( <span style="color:#006080;">&quot;Type&quot;</span>, arg.Type ),
                    <span style="color:#0000ff;">new</span> XAttribute( <span style="color:#006080;">&quot;Name&quot;</span>, arg.Name ) ) ) );
    }
}</pre>
</div>
<p>Then you could transform it to HTML with some XSLT like this:</p>
<div style="border-bottom:gray 1px solid;border-left:gray 1px solid;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas, &#39;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;margin:20px 0 10px;padding:4px;">
<pre style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &#39;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#0000ff;">&lt;?</span><span style="color:#800000;">xml</span> <span style="color:#ff0000;">version</span><span style="color:#0000ff;">=&quot;1.0&quot;</span> <span style="color:#ff0000;">encoding</span><span style="color:#0000ff;">=&quot;UTF-8&quot;</span> ?<span style="color:#0000ff;">&gt;</span>

<span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:stylesheet</span> <span style="color:#ff0000;">version</span><span style="color:#0000ff;">=&quot;1.0&quot;</span> <span style="color:#ff0000;">xmlns:xsl</span><span style="color:#0000ff;">=&quot;http://www.w3.org/1999/XSL/Transform&quot;</span> <span style="color:#ff0000;">exclude-result-prefixes</span><span style="color:#0000ff;">=&quot;xsl&quot;</span><span style="color:#0000ff;">&gt;</span>

    <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:output</span> <span style="color:#ff0000;">method</span><span style="color:#0000ff;">=&quot;html&quot;</span><span style="color:#0000ff;">/&gt;</span>

    <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:variable</span> <span style="color:#ff0000;">name</span><span style="color:#0000ff;">=&quot;lineFeed&quot;</span> <span style="color:#ff0000;">select</span><span style="color:#0000ff;">=&quot;'&amp;#xD;&amp;#xA;'&quot;</span><span style="color:#0000ff;">/&gt;</span>

    <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:template</span> <span style="color:#ff0000;">match</span><span style="color:#0000ff;">=&quot;/&quot;</span><span style="color:#0000ff;">&gt;</span>

        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">style</span><span style="color:#0000ff;">&gt;</span>
            p.exception { border: 1px solid #AAAAAA; background-color: #FFAEB9; padding: 4px; }
            table.error { border: 1px solid lightsteelblue; border-collapse: collapse; font-size: 9pt; margin-bottom: 8px; }
            table.error th { text-align: left; background-color: lightsteelblue; padding: 4px 4px 4px 4px; }
            table.error td { border: 1px solid lightsteelblue; padding: 4px 4px 4px 4px; }
            .title { background-color: white; }
            .namespace { color: navy; }
            .method { font-weight: bold; }
            .type { color: green; }
            .var { color: gray; }
            .trace { padding-left: 2em; text-indent: -2em; font-size: 8pt; }
        <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">style</span><span style="color:#0000ff;">&gt;</span>

        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:copy-of</span> <span style="color:#ff0000;">select</span><span style="color:#0000ff;">=&quot;Exceptions/Header/*&quot;</span><span style="color:#0000ff;">/&gt;</span>

        <span style="color:#008000;">&lt;!--</span>
<span style="color:#008000;">        &lt;Exceptions&gt;</span>
<span style="color:#008000;">            &lt;Exception Type=&quot;type&quot; Message=&quot;message&quot;&gt;</span>
<span style="color:#008000;">                &lt;StackTrace&gt;</span>
<span style="color:#008000;">                    &lt;Method Namespace=&quot;namespace&quot; Type=&quot;type&quot; Method=&quot;method&quot;&gt;</span>
<span style="color:#008000;">                        &lt;Argument Type=&quot;type&quot; Name=&quot;name&quot;/&gt;</span>
<span style="color:#008000;">                    &lt;/Method&gt;</span>
<span style="color:#008000;">                &lt;/StackTrace&gt;</span>
<span style="color:#008000;">            &lt;/Exception&gt;</span>
<span style="color:#008000;">        &lt;/Exceptions&gt;</span>
<span style="color:#008000;">        --&gt;</span>
        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:for-each</span> <span style="color:#ff0000;">select</span><span style="color:#0000ff;">=&quot;Exceptions/Exception&quot;</span><span style="color:#0000ff;">&gt;</span>
            <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">table</span> <span style="color:#ff0000;">class</span><span style="color:#0000ff;">=&quot;error&quot;</span><span style="color:#0000ff;">&gt;</span>
                <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">tr</span><span style="color:#0000ff;">&gt;</span>
                    <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">th</span><span style="color:#0000ff;">&gt;</span>
                        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:value-of</span> <span style="color:#ff0000;">select</span><span style="color:#0000ff;">=&quot;@Type&quot;</span><span style="color:#0000ff;">/&gt;</span>
                    <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">th</span><span style="color:#0000ff;">&gt;</span>
                <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">tr</span><span style="color:#0000ff;">&gt;</span>
                <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">tr</span><span style="color:#0000ff;">&gt;</span>
                    <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">td</span><span style="color:#0000ff;">&gt;</span>
                        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:value-of</span> <span style="color:#ff0000;">select</span><span style="color:#0000ff;">=&quot;@Message&quot;</span><span style="color:#0000ff;">/&gt;</span>
                    <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">td</span><span style="color:#0000ff;">&gt;</span>
                <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">tr</span><span style="color:#0000ff;">&gt;</span>
                <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:if</span> <span style="color:#ff0000;">test</span><span style="color:#0000ff;">=&quot;StackTrace/Method&quot;</span><span style="color:#0000ff;">&gt;</span>
                    <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">tr</span><span style="color:#0000ff;">&gt;</span>
                        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">td</span> <span style="color:#ff0000;">colspan</span><span style="color:#0000ff;">=&quot;2&quot;</span><span style="color:#0000ff;">&gt;</span>
                            <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:for-each</span> <span style="color:#ff0000;">select</span><span style="color:#0000ff;">=&quot;StackTrace/Method&quot;</span><span style="color:#0000ff;">&gt;</span>
                                <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">div</span> <span style="color:#ff0000;">class</span><span style="color:#0000ff;">=&quot;trace&quot;</span><span style="color:#0000ff;">&gt;</span>
                                    <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">span</span> <span style="color:#ff0000;">class</span><span style="color:#0000ff;">=&quot;namespace&quot;</span><span style="color:#0000ff;">&gt;</span>
                                        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:if</span> <span style="color:#ff0000;">test</span><span style="color:#0000ff;">=&quot;@Namespace&quot;</span><span style="color:#0000ff;">&gt;</span>
                                            <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:value-of</span> <span style="color:#ff0000;">select</span><span style="color:#0000ff;">=&quot;@Namespace&quot;</span><span style="color:#0000ff;">/&gt;</span>
                                            <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:text</span><span style="color:#0000ff;">&gt;</span>.<span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">xsl:text</span><span style="color:#0000ff;">&gt;</span>
                                        <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">xsl:if</span><span style="color:#0000ff;">&gt;</span>
                                        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:if</span> <span style="color:#ff0000;">test</span><span style="color:#0000ff;">=&quot;@Type&quot;</span><span style="color:#0000ff;">&gt;</span>
                                            <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:value-of</span> <span style="color:#ff0000;">select</span><span style="color:#0000ff;">=&quot;@Type&quot;</span><span style="color:#0000ff;">/&gt;</span>
                                            <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:text</span><span style="color:#0000ff;">&gt;</span>.<span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">xsl:text</span><span style="color:#0000ff;">&gt;</span>
                                        <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">xsl:if</span><span style="color:#0000ff;">&gt;</span>
                                        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">span</span> <span style="color:#ff0000;">class</span><span style="color:#0000ff;">=&quot;method&quot;</span><span style="color:#0000ff;">&gt;</span>
                                            <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:value-of</span> <span style="color:#ff0000;">select</span><span style="color:#0000ff;">=&quot;@Method&quot;</span><span style="color:#0000ff;">/&gt;</span>
                                        <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">span</span><span style="color:#0000ff;">&gt;</span>
                                    <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">span</span><span style="color:#0000ff;">&gt;</span>
                                    <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:text</span><span style="color:#0000ff;">&gt;</span>(<span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">xsl:text</span><span style="color:#0000ff;">&gt;</span>
                                    <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:for-each</span> <span style="color:#ff0000;">select</span><span style="color:#0000ff;">=&quot;Parameter&quot;</span><span style="color:#0000ff;">&gt;</span>
                                        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:if</span> <span style="color:#ff0000;">test</span>=&quot;<span style="color:#ff0000;">position</span>()<span style="color:#0000ff;">&gt;</span>1&quot;<span style="color:#0000ff;">&gt;</span>,<span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">xsl:if</span><span style="color:#0000ff;">&gt;</span>
                                        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:if</span> <span style="color:#ff0000;">test</span><span style="color:#0000ff;">=&quot;@Type&quot;</span><span style="color:#0000ff;">&gt;</span>
                                            <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:text</span><span style="color:#0000ff;">&gt;</span> <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">xsl:text</span><span style="color:#0000ff;">&gt;</span>
                                            <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">span</span> <span style="color:#ff0000;">class</span><span style="color:#0000ff;">=&quot;type&quot;</span><span style="color:#0000ff;">&gt;</span>
                                                <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:value-of</span> <span style="color:#ff0000;">select</span><span style="color:#0000ff;">=&quot;@Type&quot;</span><span style="color:#0000ff;">/&gt;</span>
                                            <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">span</span><span style="color:#0000ff;">&gt;</span>
                                        <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">xsl:if</span><span style="color:#0000ff;">&gt;</span>
                                        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:text</span><span style="color:#0000ff;">&gt;</span> <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">xsl:text</span><span style="color:#0000ff;">&gt;</span>
                                        <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">span</span> <span style="color:#ff0000;">class</span><span style="color:#0000ff;">=&quot;var&quot;</span><span style="color:#0000ff;">&gt;</span>
                                            <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:value-of</span> <span style="color:#ff0000;">select</span><span style="color:#0000ff;">=&quot;@Name&quot;</span><span style="color:#0000ff;">/&gt;</span>
                                        <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">span</span><span style="color:#0000ff;">&gt;</span>
                                    <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">xsl:for-each</span><span style="color:#0000ff;">&gt;</span>
                                    <span style="color:#0000ff;">&lt;</span><span style="color:#800000;">xsl:text</span><span style="color:#0000ff;">&gt;</span> )<span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">xsl:text</span><span style="color:#0000ff;">&gt;</span>
                                <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">div</span><span style="color:#0000ff;">&gt;</span>
                            <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">xsl:for-each</span><span style="color:#0000ff;">&gt;</span>
                        <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">td</span><span style="color:#0000ff;">&gt;</span>
                    <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">tr</span><span style="color:#0000ff;">&gt;</span>
                <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">xsl:if</span><span style="color:#0000ff;">&gt;</span>
            <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">table</span><span style="color:#0000ff;">&gt;</span>
        <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">xsl:for-each</span><span style="color:#0000ff;">&gt;</span>

    <span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">xsl:template</span><span style="color:#0000ff;">&gt;</span>

<span style="color:#0000ff;">&lt;/</span><span style="color:#800000;">xsl:stylesheet</span><span style="color:#0000ff;">&gt;</span></pre>
</div>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chriscavanagh.wordpress.com/373/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chriscavanagh.wordpress.com/373/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chriscavanagh.wordpress.com/373/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chriscavanagh.wordpress.com/373/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chriscavanagh.wordpress.com/373/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chriscavanagh.wordpress.com/373/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chriscavanagh.wordpress.com/373/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chriscavanagh.wordpress.com/373/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chriscavanagh.wordpress.com/373/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chriscavanagh.wordpress.com/373/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chriscavanagh.wordpress.com&blog=313491&post=373&subd=chriscavanagh&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://chriscavanagh.wordpress.com/2009/05/31/pretty-printing-exceptions/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8b8858c8a6022411fc9d48c1f4963928?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Chris</media:title>
		</media:content>

		<media:content url="http://chriscavanagh.files.wordpress.com/2009/05/image_thumb1.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://chriscavanagh.files.wordpress.com/2009/05/image_thumb2.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
	</channel>
</rss>