Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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. ...

like image 354
dschüsä Avatar asked May 09 '26 04:05

dschüsä


1 Answers

... 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"

like image 67
dschüsä Avatar answered May 11 '26 17:05

dschüsä



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!