2009-03-11 8 views
4

Ich möchte wavy underlines mit TextDecoration (in einem Steuerelement RichTextBox ähnlich) erstellen.Wavy unterstreicht als TextDecoration: Was mache ich falsch?

Ich habe die folgenden:

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; 
} 

Diese fast funktioniert, aber in Abhängigkeit von der Position unterstrichene Wort im Text, zeigen unterstreicht oft als ein Muster von mehreren überlagerten Wellen auf. Auch die Unterstreichungen sind etwas unscharf, auch wenn sie korrekt sind (wpf-Problem beim Zeichnen zwischen Pixeln, nehme ich an).

Meine Lösung war eine Art Versuch-und-Irrtum, also könnte ich einen falschen Weg gegangen sein, besonders mit Viewport/ViewportUnits.

Was mache ich falsch und gibt es eine Möglichkeit, knackige Unterstreichungen zu bekommen?

Vielen Dank im Voraus.

Antwort

6

bstoney hatte eine Lösung für dieses Problem here. Der Schlüssel scheint die Viewbox sowie die Viewport so einzustellen, dass die Wellen vertikal getrennt sind, so dass Sie nur 1 in der Unterstreichung bekommen.

Es gibt einige Brüche in der Welle, die es nach rechts beseitigt werden kann durch Ausdehnen und Ändern des Viewbox aus, so beginnt es von X = 1 statt 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

I beide versucht haben Einstellung, aber Ich bekomme immer noch sehr seltsame Effekte (die Wellen schneiden sich nicht, sondern sind in einigen Fällen vertikal in zwei Hälften geschnitten - es scheint, dass das Muster nicht in Bezug auf die endgültige Zeilenposition innerhalb des Dokuments fixiert ist). –

+0

Ooh, ich verstehe was du jetzt meinst. Es ist sehr bemerkbar, wenn Sie die Textgröße ändern. Ich denke, was wir wirklich wollen, ist für die Viewport-Einheiten absolut horizontal, aber relativ vertikal. Ich werde das noch etwas durcheinander bringen. –