2009-03-11 5 views
4

Я хочу создать wavy underlines с помощью TextDecoration (в элементе управления, подобном RichTextBox).Волнистые подчеркивания как TextDecoration: что я делаю неправильно?

Я сделал следующее вещь:

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.

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

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

ответ

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> 
+0

Я попытался установить оба, но Я по-прежнему получаю очень странные эффекты (волны не пересекаются, но в некоторых случаях вертикально разрезаны пополам - кажется, что шаблон не фиксирован относительно конечной позиции линии в документе). –

+0

О, я понимаю, что вы сейчас имеете в виду. Это очень заметно при изменении размера текста. Я думаю, что мы действительно хотим, чтобы единицы Viewport были абсолютными по горизонтали, но относительными по вертикали. Я еще немного потрудился с этим. –