2009-08-13 11 views
5

Je cherche un bon moyen de copier du texte à partir d'une riche zone de texte affichant des émoticônes. Pensez à skype, où vous pouvez sélectionner une discussion et il copiera les images d'émoticônes et les convertira en leurs représentations textuelles (image de smiley à :) etc). J'utilise le pattern MVVM.Copie d'un "texte" d'émoticône à partir d'une riche zone de texte montrant l'image dans wpf

+0

Avez-vous envisagé de commencer une prime à ce sujet? –

Répondre

4

Je ne connais pas un moyen de configurer l'analyse du contenu RichTextBox en texte. Ci-dessous est un moyen qui utilise xml linq. Les expressions régulières pourraient mieux fonctionner mais je les suce. Passez la méthode ConvertToText au fichier FLowDocument de votre 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

Excellent travail! –

+0

Merci Frank, c'était un problème cool que je devais juste essayer. –

Questions connexes