2009-08-13 6 views
5

나는 이모티콘을 표시하는 richtextbox에서 텍스트를 복사 할 수있는 좋은 방법을 찾고 있습니다. 채팅을 선택할 수있는 skype을 생각하면 이모티콘 이미지가 복사되어 텍스트 표현 (스마일 이미지 : :) 등으로 변환됩니다. MVVM 패턴을 사용하고 있습니다.wpf의 이미지를 보여주는 richtextbox에서 이모티콘 "텍스트"복사하기

+0

현상금에 대한 현상금을 시작하셨습니까? –

답변

4

텍스트에 대한 RichTextBox 내용의 구문 분석을 구성하는 방법을 모르겠습니다. 아래는 XML linq를 사용하는 한 가지 방법입니다. 정규 표현식은 더 잘 작동하지만 나는 그것들을 빨아 먹는다. ConvertToText 메서드를 전달합니다. RichTextBox의 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

감사합니다. 프랭크, 나는 단지 가야만하는 멋진 문제였습니다. –

관련 문제