- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 FormattedText 类创建文本 - 但是在使用此类时如何下标或上标文本?我找到了有关如何在使用 TextBlock 时执行此操作的解决方案,但我使用的是 FormattedText 而不是 TextBlock ):感谢您的提示!
最佳答案
FormattedText
不能做下标/上标 - 但 TextFormatter
能够。TextFormatter
是一个低级的API,你需要写很多代码来使用它——但大部分代码只是子类化了所有用于传递格式化参数的类 int TextFormatter
.
如何使用 TextFormatterTextFormatter
需要一个 TextSource
对象并产生多个 TextLine
对象(每行一个),TextLine.Draw
然后可以使用方法将线绘制到绘图上下文。TextSource
类是抽象的,你必须继承它并覆盖 GetTextRun
方法只返回 TextRun
位于提供的字符位置的对象。TextRun
也是抽象的 - 但它确实有你可以使用的子类 - 有趣的类是 TextCharacters
包含字符串和格式信息。
格式信息在 TextRunProperties
中对象,不幸的是,这是另一个您必须子类化的抽象类。TextRunProperties
有一个 TypographyProperties
类型的属性 TextRunTypographyProperties
.TextRunTypographyProperties
是另一个需要子类化的抽象类。
最后 TextRunTypographyProperties
有 Variants
您可以像 TextBlock 示例一样使用属性。
代码示例
这是我可以编写的用于绘制上标文本的最少代码:
首先,我们的 TextRunProperties 和 TextRunTypographyProperties 可以返回上标字体变体:
class CustomTextRunProperties : TextRunProperties
{
private bool _superscript;
public CustomTextRunProperties(bool superscript)
{
_superscript = superscript;
}
public override System.Windows.Media.Brush BackgroundBrush
{
get { return null; }
}
public override CultureInfo CultureInfo
{
get { return CultureInfo.CurrentCulture; }
}
public override double FontHintingEmSize
{
get { return 22; }
}
public override double FontRenderingEmSize
{
get { return 22; }
}
public override Brush ForegroundBrush
{
get { return Brushes.Black; }
}
public override System.Windows.TextDecorationCollection TextDecorations
{
get { return new System.Windows.TextDecorationCollection(); }
}
public override System.Windows.Media.TextEffectCollection TextEffects
{
get { return new TextEffectCollection(); }
}
public override System.Windows.Media.Typeface Typeface
{
get { return new Typeface("Calibri"); }
}
public override TextRunTypographyProperties TypographyProperties
{
get
{
return new CustomTextRunTypographyProperties(_superscript);
}
}
}
class CustomTextRunTypographyProperties : TextRunTypographyProperties
{
private bool _superscript;
public CustomTextRunTypographyProperties(bool superscript)
{
_superscript = superscript;
}
public override int AnnotationAlternates
{
get { return 0; }
}
public override bool CapitalSpacing
{
get { return false; }
}
public override System.Windows.FontCapitals Capitals
{
get { return FontCapitals.Normal; }
}
public override bool CaseSensitiveForms
{
get { return false; }
}
public override bool ContextualAlternates
{
get { return false; }
}
public override bool ContextualLigatures
{
get { return false; }
}
public override int ContextualSwashes
{
get { return 0; }
}
public override bool DiscretionaryLigatures
{
get { return false; }
}
public override bool EastAsianExpertForms
{
get { return false; }
}
public override System.Windows.FontEastAsianLanguage EastAsianLanguage
{
get { return FontEastAsianLanguage.Normal; }
}
public override System.Windows.FontEastAsianWidths EastAsianWidths
{
get { return FontEastAsianWidths.Normal; }
}
public override System.Windows.FontFraction Fraction
{
get { return FontFraction.Normal; }
}
public override bool HistoricalForms
{
get { return false; }
}
public override bool HistoricalLigatures
{
get { return false; }
}
public override bool Kerning
{
get { return true; }
}
public override bool MathematicalGreek
{
get { return false; }
}
public override System.Windows.FontNumeralAlignment NumeralAlignment
{
get { return FontNumeralAlignment.Normal; }
}
public override System.Windows.FontNumeralStyle NumeralStyle
{
get { return FontNumeralStyle.Normal; }
}
public override bool SlashedZero
{
get { return false; }
}
public override bool StandardLigatures
{
get { return false; }
}
public override int StandardSwashes
{
get { return 0; }
}
public override int StylisticAlternates
{
get { return 0; }
}
public override bool StylisticSet1
{
get { return false; }
}
public override bool StylisticSet10
{
get { return false; }
}
public override bool StylisticSet11
{
get { return false; }
}
public override bool StylisticSet12
{
get { return false; }
}
public override bool StylisticSet13
{
get { return false; }
}
public override bool StylisticSet14
{
get { return false; }
}
public override bool StylisticSet15
{
get { return false; }
}
public override bool StylisticSet16
{
get { return false; }
}
public override bool StylisticSet17
{
get { return false; }
}
public override bool StylisticSet18
{
get { return false; }
}
public override bool StylisticSet19
{
get { return false; }
}
public override bool StylisticSet2
{
get { return false; }
}
public override bool StylisticSet20
{
get { return false; }
}
public override bool StylisticSet3
{
get { return false; }
}
public override bool StylisticSet4
{
get { return false; }
}
public override bool StylisticSet5
{
get { return false; }
}
public override bool StylisticSet6
{
get { return false; }
}
public override bool StylisticSet7
{
get { return false; }
}
public override bool StylisticSet8
{
get { return false; }
}
public override bool StylisticSet9
{
get { return false; }
}
public override FontVariants Variants
{
get { return _superscript ? FontVariants.Superscript: FontVariants.Normal; }
}
}
class GenericTextParagraphProperties : TextParagraphProperties
{
public GenericTextParagraphProperties(
FlowDirection flowDirection,
TextAlignment textAlignment,
bool firstLineInParagraph,
bool alwaysCollapsible,
TextRunProperties defaultTextRunProperties,
TextWrapping textWrap,
double lineHeight,
double indent)
{
_flowDirection = flowDirection;
_textAlignment = textAlignment;
_firstLineInParagraph = firstLineInParagraph;
_alwaysCollapsible = alwaysCollapsible;
_defaultTextRunProperties = defaultTextRunProperties;
_textWrap = textWrap;
_lineHeight = lineHeight;
_indent = indent;
}
public override FlowDirection FlowDirection
{
get { return _flowDirection; }
}
public override TextAlignment TextAlignment
{
get { return _textAlignment; }
}
public override bool FirstLineInParagraph
{
get { return _firstLineInParagraph; }
}
public override bool AlwaysCollapsible
{
get { return _alwaysCollapsible; }
}
public override TextRunProperties DefaultTextRunProperties
{
get { return _defaultTextRunProperties; }
}
public override TextWrapping TextWrapping
{
get { return _textWrap; }
}
public override double LineHeight
{
get { return _lineHeight; }
}
public override double Indent
{
get { return _indent; }
}
public override TextMarkerProperties TextMarkerProperties
{
get { return null; }
}
public override double ParagraphIndent
{
get { return _paragraphIndent; }
}
private FlowDirection _flowDirection;
private TextAlignment _textAlignment;
private bool _firstLineInParagraph;
private bool _alwaysCollapsible;
private TextRunProperties _defaultTextRunProperties;
private TextWrapping _textWrap;
private double _indent;
private double _paragraphIndent;
private double _lineHeight;
}
public class CustomTextSourceRun
{
public string Text;
public bool IsSuperscript;
public bool IsEndParagraph;
public int Length { get { return IsEndParagraph ? 1 : Text.Length; } }
}
class CustomTextSource : TextSource
{
public List<CustomTextSourceRun> Runs = new List<CustomTextSourceRun>();
public override TextRun GetTextRun(int textSourceCharacterIndex)
{
int pos = 0;
foreach (var currentRun in Runs)
{
if (textSourceCharacterIndex < pos + currentRun.Length)
{
if (currentRun.IsEndParagraph)
{
return new TextEndOfParagraph(1);
}
var props =
new CustomTextRunProperties(currentRun.IsSuperscript);
return new TextCharacters(
currentRun.Text,
textSourceCharacterIndex - pos,
currentRun.Length - (textSourceCharacterIndex - pos),
props);
}
pos += currentRun.Length;
}
// Return an end-of-paragraph if no more text source.
return new TextEndOfParagraph(1);
}
public override TextSpan<CultureSpecificCharacterBufferRange> GetPrecedingText(int textSourceCharacterIndexLimit)
{
throw new Exception("The method or operation is not implemented.");
}
public override int GetTextEffectCharacterIndexFromTextSourceCharacterIndex(int textSourceCharacterIndex)
{
throw new Exception("The method or operation is not implemented.");
}
public int Length
{
get
{
int r = 0;
foreach (var currentRun in Runs)
{
r += currentRun.Length;
}
return r;
}
}
}
var textStore = new CustomTextSource();
textStore.Runs.Add(new CustomTextSourceRun() { Text = "3" });
textStore.Runs.Add(new CustomTextSourceRun() { Text = "rd", IsSuperscript = true });
textStore.Runs.Add(new CustomTextSourceRun() { IsEndParagraph = true });
textStore.Runs.Add(new CustomTextSourceRun() { Text = "4" });
textStore.Runs.Add(new CustomTextSourceRun() { Text = "th", IsSuperscript = true });
int textStorePosition = 0;
System.Windows.Point linePosition = new System.Windows.Point(0, 0);
textDest = new DrawingGroup();
DrawingContext dc = textDest.Open();
TextFormatter formatter = TextFormatter.Create();
while (textStorePosition < textStore.Length)
{
using (TextLine myTextLine = formatter.FormatLine(
textStore,
textStorePosition,
96*6,
new GenericTextParagraphProperties(FlowDirection.LeftToRight,
TextAlignment.Left,true,false, new CustomTextRunProperties(false), TextWrapping.Wrap,
30,0), null))
{
myTextLine.Draw(dc, linePosition, InvertAxes.None);
textStorePosition += myTextLine.Length;
linePosition.Y += myTextLine.Height;
}
}
dc.Close();
关于wpf - FormattedText 类中的下标/上标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2750576/
我正在使用 用于格式化我的页面。它按预期工作正常,但文本接缝周围的填充很大。所以我给这个元素应用了自己的styleClass但是没有生效。 Firebug 显示该段落具有 styleClass 'se
我正在使用 FormattedText 类创建文本 - 但是在使用此类时如何下标或上标文本?我找到了有关如何在使用 TextBlock 时执行此操作的解决方案,但我使用的是 FormattedText
我正在使用 System.Windows.Media.FormattedText 进行一些低级渲染(具体来说,尝试以一种排版令人愉悦的方式渲染数学方程式)。为此,我使用的文本 block 的精确指标至
在 C# 表单项目中,我可以编写以下代码来获得我想要的东西,但似乎我试图融合两个不同的“世界”。 FormattedText text = new FormattedText(textBox1.Tex
我正在使用以下方法将文本写入我的主窗口。我的问题是,有没有办法在创建后更改 FormattetText 或绘图视觉的文本?或者,如果我希望在运行时更新文本,我应该使用另一种方法来编写文本吗? priv
我正在尝试使用 FormattedText.BuildGeometry 来确定字符的布局方式,以确定鼠标的逻辑位置。在我的上下文中,可以假定 FormattedText 是单行 - 我应该得到一个包含
我正在构建一个文本到图像生成器,它接受文本、字体、最大宽度和一些其他参数,并从中生成图像。它将用作网站中的自定义服务器控件以生成标题。 我已经有了这样一个使用 GDI+ 的组件。问题是 GDI+ 无法
如果我有这样的代码: FormattedText text = new FormattedText(sTheBook, System.Globalization.CultureInfo.C
我正在使用 FormattedText 呈现文本,但似乎确实有任何方法可以对呈现的输出执行每个字符的 HitTest 。它是只读的,所以我基本上只需要选择,不需要编辑。 我会使用 RichTextBo
我们正在使用 WPF FormattedText 对象来确定从 RSS 提要获取最新新闻标题的服务中的文本大小。检索到的文本需要在指定的 Canvas 大小中。该服务每 10 秒运行一次代码,如果一个
使用 WPF4,您可以通过将 TextOptions.TextFormattingMode="Display"和 TextOptions.TextRenderingMode="Aliased"添加到
我正在尝试将标签填充到水平 slider ,并且通过将 Text 传递给 FormattedText 构造函数,我成功地使用了派生自 TickBar 的类来完成此操作。但是现在,当我使用相同的代码并将
在我的 WPF 应用程序中,我有一个自定义的 Canvas 实现,我在其中使用指定的 .ttf 文件绘制了一些文本。 ttf 文件位于一个临时位置,以后可以将其删除。我的问题是,一旦我的文本呈现在 C
我想用不同的渲染选项绘制一个 FormattedText。例如,当我们创建一个标签时,我们可以设置它的 TextOptions.TextFormattingMode(Ideal/Display) 和
我想使用嵌套在 jsbin 中的 sap.m.CustomTile 中的 sap.m.FormattedText 进行演示.我不知道为什么我得到这个文本 SYSTEM SIZE: 我使用的字符串是:
在 WPF4 中,我如何为 drawingvisual 计算 FormattedText 或 GlyphRun 的 'Size'。 我在 Canvas 中使用绘图视觉。当我更改文本大小或文本时,会发生
当我尝试使用 .net Framework 4.6.2 构建 WPF 项目时,出现错误,因为 FormattedText() 已过时,如下所示: [过时(“使用 PixelsPerDip 覆盖”,fa
我是一名优秀的程序员,十分优秀!