【发布时间】:2010-11-19 05:45:29
【问题描述】:
我正在寻找一种好的、简洁的方法来从显示表情符号的富文本框中复制文本。想想Skype,您可以在其中选择一个聊天,它会复制表情图像并将它们转换为它们的文本表示(笑脸图像到:)等)。我正在使用 MVVM 模式。
【问题讨论】:
-
您是否考虑过为此开始赏金?
标签: wpf text copy richtextbox emoticons
我正在寻找一种好的、简洁的方法来从显示表情符号的富文本框中复制文本。想想Skype,您可以在其中选择一个聊天,它会复制表情图像并将它们转换为它们的文本表示(笑脸图像到:)等)。我正在使用 MVVM 模式。
【问题讨论】:
标签: wpf text copy richtextbox emoticons
我不知道如何配置将 RichTextBox 内容解析为文本的方法。以下是使用 xml linq 的一种方式。正则表达式可能效果更好,但我很讨厌它们。传递 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";
}
【讨论】: