2013-08-19 29 views
5

如何完全覆盖或清除WinRT RichEditBox的文本(和格式)?如何完全清除/设置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只是监听在视图模型的Content字符串属性和ContentChanged变化是TextChanged事件RichEditBox的处理程序,将创建一个无限循环不断将“\ r”附加到Vm.Content和框的文本本身。 当您将TextGetOptions.None替换为TextGetOptions.FormatRtf时,ViewModel的Content属性会变得更加混乱,从而添加看起来像空RTF段落的东西。

下面是视图模型的内容属性定义,所以你可以确保一切正常吧:

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

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

回答

4

extra/r(或\ par如果您查询RTF)似乎是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); 
+0

伟大的解决方案,按预期工作。 –

0

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

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

+0

不幸的是,AgumentNullException:值不能为空。如果文档中这样说,这很奇怪。 –

+0

由于文档仅涉及ITextDocument接口,因此我们永远不知道实现的类将执行什么操作。 –

+0

@ MichaelK.Sondej是否使用'SetText(...,string.Empty)'工作? –