2009-08-13 14 views
5

私は、顔文字を表示するリッチテキストボックスからテキストをコピーするための、きれいな方法を探しています。チャットを選択することができるskypeを考えてください。それは、絵文字イメージをコピーしてテキスト表現(スマイリーイメージから:)などに変換します)。 MVVMパターンを使用しています。wpfの画像を表示するリッチテキストボックスから絵文字「テキスト」をコピーする

+0

これに対して奨励金を開始すると考えましたか? –

答えて

4

RichTextBoxコンテンツの解析をテキストに設定する方法がわかりません。以下は、xml linqを使用する1つの方法です。正規表現はうまくいくかもしれませんが、私はそれらを吸います。 RichTextBoxのConvertToTextメソッドにFLowDocumentを渡します。

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

優れた作品! –

+0

フランクに感謝、それは私がちょうど行く必要があったクールな問題だった。 –

関連する問題