我在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位):
下一个不起作用(Windows 7 64位):
另一种方法是使用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;
}
}
}
}
答案 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/