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…