Копирование «текста» смайлика из richtextbox, показывающего изображение в wpf

StackOverflow https://stackoverflow.com/questions/1270808

Вопрос

Я ищу хороший и чистый способ включить копирование текста из richtextbox, отображающего смайлики.Подумайте о Skype, где вы можете выбрать чат, и он скопирует изображения смайликов и преобразует их в текстовые представления (изображение смайлика в :) и т. д.).Я использую шаблон MVVM.

Это было полезно?

Решение

Я не знаю, как настроить синтаксический анализ содержимого RichTextBox в текст.Ниже приведен один из способов использования xml linq.Регулярные выражения, возможно, работают лучше, но я в них плохо разбираюсь.Передайте метод ConvertToText в FLowDocument вашего RichTextBox.

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";
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top