2009-08-13 4 views
5

Ich bin auf der Suche nach einem guten, sauberen Weg, um das Kopieren von Text aus einer Richtextbox mit Emoticons zu ermöglichen. Denken Sie an Skype, wo Sie einen Chat auswählen können und er die Emoticon-Bilder kopiert und sie in ihre Textdarstellungen konvertiert (Smiley-Bild zu :) usw.). Ich verwende das MVVM-Muster.Kopieren von Emoticon "Text" aus einer Richtextbox mit Bild in WPF

+0

Haben Sie darüber nachgedacht, eine Bounty zu starten? –

Antwort

4

Ich kenne keine Möglichkeit, das Parsen von RichTextBox-Inhalt zu Text zu konfigurieren. Unten ist eine Möglichkeit, die XML Linq verwendet. Reguläre Ausdrücke funktionieren vielleicht besser, aber ich sauge an ihnen. Übergeben Sie die ConvertToText-Methode an FLowDocument Ihrer RichTextBox.

private static string ConvertToText(FlowDocument flowDocument) 
{ 
    TextRange textRangeOriginal = 
     new TextRange(flowDocument.ContentStart, flowDocument.ContentEnd); 

    string xamlString; 
    using (MemoryStream memoryStreamOriginal = new MemoryStream()) 
    { 
     textRangeOriginal.Save(memoryStreamOriginal, DataFormats.Xaml); 
     xamlString = ASCIIEncoding.Default.GetString(memoryStreamOriginal.ToArray()); 
    } 

    XElement root = XElement.Parse(xamlString); 

    IEnumerable<XElement> smilies = 
     from element in root.Descendants() 
     where (string)element.Attribute("FontFamily") == "Wingdings" && IsSmiley(element.Value) 
     select element; 

    foreach (XElement element in smilies.ToList()) 
    { 
     XElement textSmiley = new XElement(element.Name.Namespace + "Span", 
              new XElement(element.Name.Namespace + "Run", GetTextSmiley(element.Value))); 
     element.ReplaceWith(textSmiley); 
    } 

    using (MemoryStream memoryStreamChanged = new MemoryStream()) 
    { 
     StreamWriter streamWriter = new StreamWriter(memoryStreamChanged); 
     streamWriter.Write(root.ToString(SaveOptions.DisableFormatting)); 
     streamWriter.Flush(); 
     FlowDocument flowDocumentChanged = new FlowDocument(); 
     TextRange textRangeChanged = 
      new TextRange(flowDocument.ContentStart, flowDocument.ContentEnd); 
     textRangeChanged.Load(memoryStreamChanged, DataFormats.Xaml); 
     return textRangeChanged.Text; 
    } 
} 

private static string GetTextSmiley(string value) 
{ 
    switch (value) 
    { 
     case "J" : 
      return ":)"; 
     case "K" : 
      return ":|"; 
     case "L" : 
      return ":("; 
     default : 
      throw new ArgumentException(); 
    } 
} 

private static bool IsSmiley(string value) 
{ 
    return value == "J" || value == "K" || value == "L"; 
} 
+1

Ausgezeichnete Arbeit! –

+0

Danke Frank, es war ein cooles Problem, das ich einfach ausprobieren musste. –