如何完全清除/设置WinRT';的RichEditBox

本文关键字:RichEditBox WinRT 何完全 清除 设置 | 更新日期: 2023-09-27 18:28:23

如何完全覆盖或清除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.FormatRtf替换TextGetOptions.None时,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"。然而,有了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

我为我的英语道歉。也欢迎对其进行所有更正:)

如何完全清除/设置WinRT';的RichEditBox

额外的/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);

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

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