سؤال

أنا أبحث عن طريقة جيدة ونظيفة لتمكين نسخ النص من RichTextBox عرض الرموز. فكر في Skype، حيث يمكنك تحديد دردشة وسيقوم بنسخ صور التعبيرات وتحويلها إلى تمثيلاتها النصية (صورة مبتسم إلى :) إلخ). أنا أستخدم نمط MVVM.

هل كانت مفيدة؟

المحلول

لا أعرف طريقة لتكوين تحليل محتوى RichTextBox إلى النص. أدناه طريقة واحدة تستخدم XML LinQ. تعبيرات منتظمة قد تعمل بشكل أفضل ولكني تمتص عليها. Mass ConvertTOtext طريقة Teh 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