2009-08-13 6 views
5

Sto cercando un modo valido e pulito per consentire la copia di testo da un richtextbox che visualizza le emoticon. Pensa a skype, dove puoi selezionare una chat e copierà le immagini emoticon e convertirle nelle loro rappresentazioni testuali (immagine di smiley in :) ecc.). Sto usando il pattern MVVM.Copia di emoticon "testo" da un richtextbox che mostra l'immagine nel wpf

+0

Avete considerato di iniziare una taglia su questo? –

risposta

4

Non conosco un modo per configurare l'analisi del contenuto RichTextBox in testo. Di seguito è riportato un modo che utilizza xml linq. Le espressioni regolari potrebbero funzionare meglio ma io le succhio. Passa al metodo ConvertToText teh FLowDocument del tuo 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

Ottimo lavoro! –

+0

Grazie Frank, è stato un bel problema che dovevo provare. –

Problemi correlati