如何完全清除/设置WinRT的RichEditBox文本?

时间:2013-08-19 17:45:01

标签: c# .net windows-runtime

如何完全覆盖或清除WinRT的RichEditBox的文本(和格式)?

我问,因为它的Document属性的方法SetText似乎只是附加新文本。

因此“绑定”如下:

void Vm_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
    if (e.PropertyName == "Content")
        richEditBox.Document.SetText(Windows.UI.Text.TextSetOptions.None, Vm.Content);
}

private void ContentChanged(object sender, RoutedEventArgs e)
{
    RichEditBox box = (RichEditBox)sender;

    string content;
    box.Document.GetText(Windows.UI.Text.TextGetOptions.None, out content);

    Vm.Content = content;
}

其中Vm_PropertyChanged只是监听ViewModel的Content字符串属性中的更改而ContentChanged是RichEditBox的TextChanged事件的处理程序,将创建一个无限循环不断地将“\ r”附加到Vm.Content和框的文本本身。 当您使用TextGetOptions.None替换TextGetOptions.FormatRtf时,ViewModel的Content属性会变得更加混乱,添加看起来像空RTF段落的内容。

这是ViewModel中的Content属性定义,因此您可以确保一切正常:

    /// <summary>
    /// The <see cref="Content" /> property's name.
    /// </summary>
    public const string ContentPropertyName = "Content";

    private string _content;

    /// <summary>
    /// Sets and gets the Content property.
    /// Changes to that property's value raise the PropertyChanged event. 
    /// </summary>
    public string Content
    {
        get
        {
            return _content;
        }

        set
        {
            if (_content == value)
            {
                return;
            }

            RaisePropertyChanging(ContentPropertyName);
            _content = value;
            RaisePropertyChanged(ContentPropertyName);
        }
    }

编辑:

一些实验:

        richEditBox.Document.SetText(Windows.UI.Text.TextSetOptions.None, string.Empty);
        string content;
        richEditBox.Document.GetText(Windows.UI.Text.TextGetOptions.None, out content);
        //content became "\r"

        richEditBox.Document.SetText(Windows.UI.Text.TextSetOptions.None, content);
        richEditBox.Document.GetText(Windows.UI.Text.TextGetOptions.None, out content);
        //content became "\r\r"

编辑:

另一个实验:

TextGetOptions.None的简单解决方法是在输出上修剪额外的“\ r \ n”。 然而,对于TextGetOptions.FormatRtf,事情不仅如此简单:

        RichEditBox box = new RichEditBox();

        box.Document.SetText(Windows.UI.Text.TextSetOptions.FormatRtf, string.Empty);
        string content;
        box.Document.GetText(Windows.UI.Text.TextGetOptions.FormatRtf, out content);

        //content is now
        // {\\rtf1\\fbidis\\ansi\\ansicpg1250\\deff0\\nouicompat\\deflang1045{\\fonttbl{\\f0\\fnil Segoe UI;}}\r\n{\\colortbl ;\\red255\\green255\\blue255;}\r\n{\\*\\generator Riched20 6.2.9200}\\viewkind4\\uc1 \r\n\\pard\\ltrpar\\tx720\\cf1\\f0\\fs17\\lang1033\\par\r\n}\r\n\0

        box.Document.SetText(Windows.UI.Text.TextSetOptions.FormatRtf, content);
        box.Document.GetText(Windows.UI.Text.TextGetOptions.FormatRtf, out content);

        //and now it's
        // {\\rtf1\\fbidis\\ansi\\ansicpg1250\\deff0\\nouicompat\\deflang1045{\\fonttbl{\\f0\\fnil Segoe UI;}{\\f1\\fnil Segoe UI;}}\r\n{\\colortbl ;\\red255\\green255\\blue255;}\r\n{\\*\\generator Riched20 6.2.9200}\\viewkind4\\uc1 \r\n\\pard\\ltrpar\\tx720\\cf1\\f0\\fs17\\lang1033\\par\r\n\r\n\\pard\\ltrpar\\tx720\\f1\\fs17\\par\r\n}\r\n\0

我为我的英语道歉。有关它的所有更正也是受欢迎的:)

2 个答案:

答案 0 :(得分:4)

额外的/ r(或者如果查询RTF则为\ par)似乎是RichEditBox中的错误。然而,通过这样做可以解决它:

        string temp;
        // Do not ask for RTF here, we just want the raw text
        richEditBox.Document.GetText(TextGetOptions.None, out temp);
        var range = richEditBox.Document.GetRange(0, temp.Length - 1);

        string content;
        // Ask for RTF here, if desired.
        range.GetText(TextGetOptions.FormatRtf, out content);

答案 1 :(得分:0)

您可以致电SetText(Windows.UI.Text.TextSetOptions.None, null)。来自SetText的文档:

  

如果字符串为NULL,则删除文档中的文本。