波浪强调作为TextDecoration:我做错了什么?

And*_*kin 4 wpf geometry underline text-decorations

我想使用TextDecoration 创建波浪下划线(在类似于RichTextBox的控件中).

我做了以下事情:

private static Pen CreateErrorPen() {
    var geometry = new StreamGeometry();
    using (var context = geometry.Open()) {
        context.BeginFigure(new Point(0.0, 0.0), false, false);
        context.PolyLineTo(new[] {
            new Point(0.75, 0.75),
            new Point(1.5, 0.0),
            new Point(2.25, 0.75),
            new Point(3.0, 0.0)
        }, true, true);
    }

    var brushPattern = new GeometryDrawing {
        Pen = new Pen(Brushes.Red, 0.2),
        Geometry = geometry
    };

    var brush = new DrawingBrush(brushPattern) {
        TileMode = TileMode.Tile,
        Viewport = new Rect(0.0, 1.5, 9.0, 3.0),
        ViewportUnits = BrushMappingMode.Absolute
    };

    var pen = new Pen(brush, 3.0);
    pen.Freeze();

    return pen;
}
Run Code Online (Sandbox Code Playgroud)

这几乎可以工作,但根据文本中带下划线的单词位置,下划线通常显示为几个叠加波的模式.即使它们是正确的,下划线也有点模糊(我认为在像素之间画画时会出现问题).

我的解决方案是一种反复试验,所以我可能走错了路,尤其是Viewport/ViewportUnits.

我做错了什么,是否有办法获得清晰的下划线?

提前致谢.

Rob*_*nee 6

bstoney这里解决了这个问题.关键似乎是设置Viewbox以及Viewport波浪垂直分离,所以你只需要在下划线中获得1.

波浪中有一些断点可以通过向右延伸并改变Viewbox从而消除,因此它从X = 1而不是0开始:

<VisualBrush x:Key="WavyBrush" TileMode="Tile" Viewbox="1,0,3,3" ViewboxUnits="Absolute" Viewport="0,-1,6,4" ViewportUnits="Absolute">
    <VisualBrush.Visual>
        <Path Data="M 0,1 C 1,0 2,2 3,1 4,0 5,2 6,1" Stroke="Red" StrokeThickness="0.2"/>
    </VisualBrush.Visual>
</VisualBrush>
Run Code Online (Sandbox Code Playgroud)