Set rich text into RichTextBlock control


Home | Blog | CSLA .NET | CSLA Store

11 May 2012

Unless I’m missing something, there’s no direct way to bind XAML-ish text to a WinRT RichTextBlock control.

For example, if I have some text like:

<Paragraph>     This is some text. And some <Bold>bolded text</Bold>. </Paragraph>

I would like to just bind this text to a RichTextBlock control for display. Sadly there’s no way to put content into a RichTextBlock control at runtime short of adding Block objects to the control’s Blocks collection.

As a workaround, I’ve been playing with the idea of a custom control like this:

using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Markup;

namespace Application11 {   public class RichTextDisplay : ContentControl   {     public static readonly DependencyProperty XamlProperty =         DependencyProperty.Register(“Xaml”, typeof(string), typeof(RichTextDisplay), new PropertyMetadata(null, XamlChanged));

public string Xaml     {       get { return (string)GetValue(XamlProperty); }       set { SetValue(XamlProperty, value); }     }

private static void XamlChanged(object sender, DependencyPropertyChangedEventArgs e)     {       var ctl = (RichTextDisplay)sender;       var xaml = new System.Text.StringBuilder();       xaml.Append(@” <UserControl   xmlns=”“http://schemas.microsoft.com/winfx/2006/xaml/presentation””   xmlns:x=”“http://schemas.microsoft.com/winfx/2006/xaml””   xmlns:mc=”“http://schemas.openxmlformats.org/markup-compatibility/2006””>   <Grid>     <RichTextBlock>”);       xaml.Append(ctl.Xaml);       xaml.Append(@”     </RichTextBlock>   </Grid> </UserControl> “);       var text = xaml.ToString();       var xr = (Control)XamlReader.Load(text);

ctl.Content = xr;     }   } }

This isn’t ideal, but it does work. The RichTextDisplay control dynamically creates a RichTextBlock control, inserting the XAML document text into the body of the newly created control.

I suppose the other alternative would be to write code that parses the text to find the XAML elements and produces a series of Block objects that can be added to the control’s Blocks collection…