Search code examples
c#windows-runtimewindows-store-appsrtfuwp

WinRt: Binding a RTF String to a RichEditBox


Searched a long time to bind some RTF text to an RichEditBox Control on Windows Store Applications. Even it should function in TwoMay Binding Mode. ...


Solution

  • ... finally I found the following solution. I created a inherited control from the original RichEditBox control with a DependencyProperty RtfText.

    public class RichEditBoxExtended : RichEditBox
    {
        public static readonly DependencyProperty RtfTextProperty = 
            DependencyProperty.Register(
            "RtfText", typeof (string), typeof (RichEditBoxExtended),
            new PropertyMetadata(default(string), RtfTextPropertyChanged));
    
        private bool _lockChangeExecution;
    
        public RichEditBoxExtended()
        {
            TextChanged += RichEditBoxExtended_TextChanged;
        }
    
        public string RtfText
        {
            get { return (string) GetValue(RtfTextProperty); }
            set { SetValue(RtfTextProperty, value); }
        }
    
        private void RichEditBoxExtended_TextChanged(object sender, RoutedEventArgs e)
        {
            if (!_lockChangeExecution)
            {
                _lockChangeExecution = true;
                string text;
                Document.GetText(TextGetOptions.None, out text);
                if (string.IsNullOrWhiteSpace(text))
                {
                    RtfText = "";
                }
                else
                {
                    Document.GetText(TextGetOptions.FormatRtf, out text);
                    RtfText = text;
                }
                _lockChangeExecution = false;
            }
        }
    
        private static void RtfTextPropertyChanged(DependencyObject dependencyObject,
            DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
        {
            var rtb = dependencyObject as RichEditBoxExtended;
            if (rtb == null) return;
            if (!rtb._lockChangeExecution)
            {
                rtb._lockChangeExecution = true;
                rtb.Document.SetText(TextSetOptions.FormatRtf, rtb.RtfText);
                rtb._lockChangeExecution = false;
            }
        }
    }
    

    This solution works for me - perhaps for others too. :-)

    Known issues: strange behaviours in VirtualizingStackPanel.VirtualizationMode="Recycling"