我正在尝试在WPF中创建这样的文本:
请注意,它是黄色文字,黑色笔划,然后是黄色笔划,然后是另一个(非常薄)黑色笔划。现在,我可以通过关注How to: Create Outlined Text创建一个单笔划,但没有什么困难。请注意,未显示的属性都是包含控件的DP。
protected override void OnRender(System.Windows.Media.DrawingContext drawingContext)
{
// Draw the outline based on the properties that are set.
drawingContext.DrawGeometry(Fill,
new System.Windows.Media.Pen(Stroke, StrokeThickness),
_textGeometry);
}
/// <summary>
/// Create the outline geometry based on the formatted text.
/// </summary>
public void CreateText()
{
System.Windows.FontStyle fontStyle = FontStyles.Normal;
FontWeight fontWeight = FontWeights.Medium;
if (Bold == true) fontWeight = FontWeights.Bold;
if (Italic == true) fontStyle = FontStyles.Italic;
// Create the formatted text based on the properties set.
FormattedText formattedText = new FormattedText(
Text,
CultureInfo.GetCultureInfo("en-us"),
FlowDirection.LeftToRight,
new Typeface(
Font,
fontStyle,
fontWeight,
FontStretches.Normal),
FontSize,
System.Windows.Media.Brushes.Black
);
// Build the geometry object that represents the text.
_textGeometry = formattedText.BuildGeometry(new System.Windows.Point(0, 0));
}
所以我的问题是,我该如何处理并添加另一个(或其他几个)笔画?
答案 0 :(得分:4)
一种方法是将笔划几何与初始几何相结合,然后为第二笔划描边 。
幸运的是,.NET证明Geometry.GetWidenedPathGeometry
用于获取笔画几何体。然后,您可以使用Geometry.Combine
将两者结合起来:
_combinedGeometry = Geometry.Combine(_textGeometry,
_textGeometry.GetWidenedPathGeometry(new Pen(Stroke, StrokeThickness * 2)),
GeometryCombineMode.Union, null);
请注意StrokeThickness * 2
。你需要这个,因为WPF绘制一个中心笔划,没有它,第二个笔划将至少部分(如果不是完全)覆盖第一个笔划。然后像以前一样绘制,用null
填充:
drawingContext.DrawGeometry(null,
new System.Windows.Media.Pen(SecondaryStroke, SecondaryStrokeThickness),
_combinedGeometry);
您可以对其他笔划重复此操作,或使用带循环的集合。
警告:GetWidenedPathGeometry
并不总是根据您使用的字体,字体大小和笔触大小返回“完美”笔触。您可能需要稍微玩一下才能没有任何文物。
上面的解决方法:如果可能,请增加字体大小。它增加了笔划之间的距离,降低了算法“桥接”两个部分的可能性,或者创建了其他工件。