【问题标题】:Copying emoticon "text" from a richtextbox showing image in wpf从显示图像的丰富文本框中复制表情符号“文本”在 wpf
【发布时间】:2010-11-19 05:45:29
【问题描述】:

我正在寻找一种好的、简洁的方法来从显示表情符号的富文本框中复制文本。想想Skype,您可以在其中选择一个聊天,它会复制表情图像并将它们转换为它们的文本表示(笑脸图像到:)等)。我正在使用 MVVM 模式。

【问题讨论】:

  • 您是否考虑过为此开始赏金?

标签: wpf text copy richtextbox emoticons


【解决方案1】:

我不知道如何配置将 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";
}

【讨论】:

  • 谢谢弗兰克,这是一个很酷的问题,我不得不试一试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-24
  • 2010-10-14
  • 1970-01-01
  • 2011-04-10
  • 2021-08-07
  • 2011-05-21
  • 2011-09-23
相关资源
最近更新 更多