我正在尝试在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));
}

所以我的问题是,我该如何接受并添加另一个(或几个其他)笔画?

最佳答案

一种方法是将笔划几何形状与初始几何形状组合在一起,然后对第二笔划进行笔划。

幸运的是,.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不会总是根据您使用的字体,字体大小和笔画大小返回“完美”笔画。您可能需要尝试一下才能没有任何伪像。

上面的的变通办法:如果可能,增加字体大小。它增加了笔画之间的距离,减少了算法“桥接”两个笔画或创建其他伪像的可能性。

10-07 15:54