WPF에서 이미지를 보여주는 RichTextbox에서 Emoticon "Text"복사
-
13-09-2019 - |
문제
이모티콘을 표시하는 RichTextBox에서 텍스트를 복사 할 수있는 좋은 깨끗한 방법을 찾고 있습니다. 채팅을 선택할 수있는 Skype를 생각하면 이모티콘 이미지를 복사하여 텍스트 표현으로 변환합니다 (Smiley Image to : 등). MVVM 패턴을 사용하고 있습니다.
해결책
RichTextBox 컨텐츠의 구문 분석을 텍스트로 구성하는 방법을 모릅니다. 아래는 XML LINQ를 사용하는 한 가지 방법입니다. 정규 표현이 더 잘 작동 할 수 있지만 나는 그들을 빨아들입니다. RichTextBox의 FlowDocument Teh ConvertToText 메소드를 전달하십시오.
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";
}
제휴하지 않습니다 StackOverflow