Pregunta

Busco una buena manera, limpia para permitir la copia de texto de un control RichTextBox mostrar iconos gestuales. Piense en Skype, donde puede seleccionar una charla y va a copiar las imágenes emoticon y convertirlos en sus representaciones textuales (imagen Smiley a :), etc.). Estoy utilizando el patrón MVVM.

¿Fue útil?

Solución

No sé de una manera de configurar el análisis del contenido de RichTextBox en texto. A continuación se muestra una forma que utiliza LINQ XML. Las expresiones regulares podrían funcionar mejor, pero soy muy malo en ellos. Método pase ConvertToText teh FlowDocument de su 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";
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top