我想使用TextDecoration创建wavy underlines(在类似于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;
}
这几乎可以工作,但根据文本中带下划线的单词位置,下划线通常显示为几个叠加波的模式。即使它们是正确的,下划线也有点模糊(我猜想,在像素之间画画会出现问题)。
我的解决方案是一种反复试验,所以我可能走错了路,特别是使用Viewport / ViewportUnits。
我做错了什么,是否有办法获得清晰的下划线?
提前致谢。
答案 0 :(得分:6)
bstoney 解决了这个问题here。关键似乎是设置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>