Волнистые подчеркивается как TextDecoration: что я делаю не так? - PullRequest
4 голосов
/ 11 марта 2009

Я хочу создать волнистые подчеркивания с использованием 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;
}

Это почти работает, но в зависимости от подчеркнутого положения слова в тексте подчеркивания часто отображаются как паттерн из нескольких наложенных волн. Кроме того, подчеркивания немного размыты, даже если они правильные (я думаю, проблема wpf с прорисовкой между пикселями).

Мое решение было методом проб и ошибок, поэтому я мог ошибиться, особенно с Viewport / ViewportUnits.

Что я делаю не так, и есть ли способ получить четкие подчеркивания?

Заранее спасибо.

1 Ответ

6 голосов
/ 11 марта 2009

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>
...