Я создаю элемент управления в WPF, который показывает единицы, использующие System.Windows.Control.RichTextBox.

Проблема в том, что элемент управления RichTextBox показывает простой текст вместо форматированного текста. Я предполагаю, что в элементе управления RichTextBox есть ошибка, и я не знаю, как это сделать, потому что она работает в зависимости от компьютера.

Код XAML:

<RichTextBox x:FieldModifier="private"
             x:Name="TxtItem1"
             IsReadOnly="True"
             IsHitTestVisible="False"
             HorizontalContentAlignment="Center"
             VerticalContentAlignment="Center" />

И часть кода:

private static void UpdateDocument(RichTextBox control, DependencyPropertyChangedEventArgs e)
{
    string content = e.NewValue as string;
    control.Document = content.Html1ToFlowDocument();
}

Функция Html1ToFlowDocument преобразует строку в FlowDocument. Следующее изображение находится на компьютере, на котором код работает нормально (64-разрядная версия Windows 7):

GOES

А следующий не работает (Windows 7 64 бит):

WRONG

Другой подход заключался в использовании текста в формате RTF, но у меня проблема.

Код функции Html1ToFlowDocument,

public static class Html1ToDocument
{
    public static FlowDocument Html1ToFlowDocument(this string text)
    {
        var mcFlowDoc = new FlowDocument();

        XmlDocument doc = new XmlDocument();
        doc.LoadXml(string.Format("<P>{0}</P>", text));

        XmlElement root = doc.GetElementsByTagName("P")[0] as XmlElement;

        IEnumerable<Inline> children;
        try
        {
            children = ParseChildren(root);
        }
        catch (Exception ex)
        {
            throw new FormatException("Unsupported text.", ex);
        }

        var paragraph = new Paragraph();
        paragraph.Inlines.AddRange(children);

        mcFlowDoc.Blocks.Add(paragraph);
        return mcFlowDoc;
    }

    private static IEnumerable<Inline> ParseChildren(XmlElement root)
    {
        Span sitem;
        List<Inline> children;

        foreach (XmlNode element in root.ChildNodes)
        {
            Inline item = null;
            if (element is XmlElement)
            {
                XmlElement xelement = (XmlElement)element;
                switch (xelement.Name.ToUpper())
                {
                    case "SUB":
                        children = ParseChildren(xelement).ToList();
                        if (children.Count == 1 && children.First() is Run)
                        {
                            item = children.First();
                            item.Typography.Variants = FontVariants.Subscript;
                        }
                        else
                        {
                            sitem = new Span();
                            sitem.Typography.Variants = FontVariants.Subscript;
                            sitem.Inlines.AddRange(children);
                            item = sitem;
                        }

                        break;
                    case "SUPER":
                        children = ParseChildren(xelement).ToList();
                        if (children.Count == 1 && children.First() is Run)
                        {
                            item = children.First();
                            item.Typography.Variants = FontVariants.Superscript;
                        }
                        else
                        {
                            sitem = new Span();
                            sitem.Typography.Variants = FontVariants.Superscript;
                            sitem.Inlines.AddRange(children);
                            item = sitem;
                        }
                        break;
                }

                yield return item;
            }
            else if (element is XmlText)
            {
                item = new Run(element.InnerText);
                yield return item;
            }
        }
    }
}
4
Pablo Caballero 25 Апр 2014 в 12:23

2 ответа

Лучший ответ

Я использовал хитрое решение. Символы элементов управления в WPF основаны на стандарте Unicode 6.3, и в этом стандарте есть таблица со специальными символами, в частности, нижним и верхним индексами. И самое удивительное, что он работает в простом TextBox.

⁰ i ⁴ ⁵ ⁶ ⁷ ⁸ ⁹ ⁺ ⁻ ⁼ ⁿ ₀ ₁ ₂ ₃ ₄ ₅ ₈ ₉ ₊ ₋ ₌ ₓ ₔ

Вы можете скачать спецификацию здесь: http://www.unicode.org/charts/PDF/U2070.pdf

Здесь есть и другие специальные символы: http://www.unicode.org/charts/

TextBox example

0
Pablo Caballero 11 Июл 2014 в 07:03

Если большинство вещей на поверхности между двумя компьютерами кажутся одинаковыми (например, версия ОС, локаль, установленный фреймворк), я бы поспорил, что это проблема со шрифтами. По сути, вы получаете один и тот же текст в обоих случаях, но вы упираетесь в стену с надстрочными и подстрочными индексами. Быстрый поиск в Google показал мне, что у других людей похожие проблемы:

Похоже, рассматриваемый шрифт должен быть:

  • Открытый Тип
  • Иметь варианты надстрочного и подстрочного индексов

Вот некоторая информация о проверке шрифтов: Определить, поддерживает ли шрифт варианты (например, надстрочный и подстрочный)

Я мог бы порекомендовать попробовать другой шрифт, чтобы увидеть, исправляет ли он его, и если да, узнайте, как вы можете гарантировать, что получите нужные шрифты на обоих (то есть на всех, на которых вы собираетесь развертывать) машинах.

0
Community 23 Май 2017 в 12:29