System.Windows.Control.RichTextBox中的错误

时间:2014-04-25 08:23:51

标签: c# wpf xaml wpf-controls richtextbox

我在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。下面的图像位于计算机中,代码正常(Windows 7 64位):

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;
            }
        }
    }
}

2 个答案:

答案 0 :(得分:0)

如果两台计算机之间表面上的大多数事情看起来都是一样的(即操作系统版本,语言环境,安装框架),那么我打赌它是字体的问题。在这两种情况下,您基本上都会获得相同的文字,但是您正在使用上标和下标。一个快速的小微笑谷歌告诉我,其他人有类似的问题:

看起来有问题的字体需要:

  • 打开类型
  • 同时具有上标和下标变体

这里有关于检查字体的一些信息: Detect whether a font supports variants (like superscript and subscript)

我的建议可能是尝试使用不同的字体来查看它是否已修复,如果是,请了解如何确保您获得两者所需的字体(意思是,所有您打算使用的字体)部署到)机器。

答案 1 :(得分:0)

我使用了一个棘手的解决方案。 WPF中控件的字符基于Unicode标准6.3,并且此标准中有一个表,其中包含特殊字符,特别是下标和上标。最令人惊奇的是它可以在一个简单的TextBox中运行。

  

⁰⁴⁵⁶⁸⁹⁺⁼⁽ⁿⁿⁿ₂₂₂₂₂₂₂₂₊₊ₔₔ₌₌₍ₐₑₔₔₔₔₔ

您可以在此处下载规范: http://www.unicode.org/charts/PDF/U2070.pdf

此处还有更多特殊字符:http://www.unicode.org/charts/

TextBox example