2013-08-19 17 views
5

Come si può sovrascrivere o cancellare completamente il testo (e la formattazione) di RichEditBox di WinRT?Come cancellare completamente/impostare il testo di RichEditBox di WinRT?

Sto chiedendo perché il metodo SetText della proprietà Documento sembra solo per aggiungere nuovo testo.

Così la "vincolante", come di seguito:

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; 
} 

dove Vm_PropertyChanged solo ascolta per i cambiamenti nella proprietà Content di stringa del ViewModel e ContentChanged è un gestore per TextChanged caso di RichEditBox, creerà un ciclo infinito aggiungendo costantemente "\ r" al Vm.Content e al testo del riquadro stesso. Quando si sostituisce TextGetOptions.None con TextGetOptions.FormatRtf la proprietà Content di ViewModel diventa ancora più caotica aggiungendo qualcosa che assomiglia a paragrafi RTF vuoti.

Ecco la definizione di proprietà contenuti nel ViewModel modo da poter garantire che è ok tutto con esso:

/// <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); 
     } 
    } 

EDIT:

Alcuni esperimenti:

 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" 

EDIT:

Un altro esperimento:

Una soluzione semplice per TextGetOptions.None sta ritagliando "\ r" in uscita. Tuttavia con TextGetOptions.FormatRtf le cose non sono proprio così semplice:

 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 

mi scuso per il mio inglese. Tutte le correzioni relative sono ugualmente benvenute :)

risposta

4

L'extra/r (o \ par se si esegue una query per RTF) sembra essere un bug in RichEditBox. Tuttavia, può essere risolto in questo modo:

 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

Ottima soluzione, funziona come previsto. –

0

È possibile chiamare SetText(Windows.UI.Text.TextSetOptions.None, null). Dalla documentazione di SetText:

Se la stringa è NULL, il testo nel documento viene eliminato.

+0

Sfortunatamente, AgumentNullException: il valore non può essere nullo. Che strano se la documentazione dice così. –

+0

E poiché la documentazione riguarda solo l'interfaccia ITextDocument, non sappiamo mai cosa farà la classe di implementazione. –

+0

@ MichaelK.Sondej L'uso di 'SetText (..., string.Empty)' funziona? –

Problemi correlati