wpf flowdocument underline

textbox wpf



LĂ­neas onduladas en un FlowDocument (4)

En WPF, ¿hay alguna manera fácil de agregar subrayados ondulados (como errores ortográficos en Word) a los elementos de FlowDocument ? Underline clase Underline , pero parece que no hay forma de darle estilo.


Un subrayado rojo es bastante simple:

<Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Grid.Resources> <FlowDocument x:Key="doc"> <Paragraph> <Run Text="This text is underlined in red."> <Run.TextDecorations> <TextDecoration Location="Underline"> <TextDecoration.Pen> <Pen Brush="Red" Thickness="1" DashStyle="{x:Static DashStyles.Dot}"/> </TextDecoration.Pen> </TextDecoration> </Run.TextDecorations> </Run> </Paragraph> </FlowDocument> </Grid.Resources> <FlowDocumentReader Document="{StaticResource doc}"/> </Grid>

Un subrayado rojo ondulado sería un poco más complicado, pero creo que podría crear un VisualBrush con un elemento rojo ondulado y configurarlo como el Pincel del lápiz que especifique para el texto subyacente. Editar: mira la publicación de bstoney para esto.


Puede crear el efecto ondulado usando los siguientes cambios a la solución de Robert Macne

Agregue un pincel visual a la sección Grilla.Resources:

<VisualBrush x:Key="WavyBrush" Viewbox="0,0,3,2" ViewboxUnits="Absolute" Viewport="0,0.8,6,4" ViewportUnits="Absolute" TileMode="Tile"> <VisualBrush.Visual> <Path Data="M 0,1 C 1,0 2,2 3,1" Stroke="Red" StrokeThickness="0.2" StrokeEndLineCap="Square" StrokeStartLineCap="Square" /> </VisualBrush.Visual> </VisualBrush>

Y cambia el lápiz a:

<Pen Brush="{StaticResource WavyBrush}" Thickness="6" />


Sé que esta es una vieja pregunta, pero prefiero este pincel. Es un poco angular pero muy limpio.

<VisualBrush x:Key="WavyBrush"> <VisualBrush.Visual> <Path Data="M 0,2 L 2,0 4,2 6,0 8,2 10,0 12,2" Stroke="Red"/> </VisualBrush.Visual> </VisualBrush>


Aquí está la solución de @ bstoney implementada en código.

Pen path_pen = new Pen(new SolidColorBrush(Colors.Red), 0.2); path_pen.EndLineCap = PenLineCap.Square; path_pen.StartLineCap = PenLineCap.Square; Point path_start = new Point(0, 1); BezierSegment path_segment = new BezierSegment(new Point(1, 0), new Point(2, 2), new Point(3, 1), true); PathFigure path_figure = new PathFigure(path_start, new PathSegment[] { path_segment }, false); PathGeometry path_geometry = new PathGeometry(new PathFigure[] { path_figure }); DrawingBrush squiggly_brush = new DrawingBrush(); squiggly_brush.Viewport = new Rect(0, 0, 6, 4); squiggly_brush.ViewportUnits = BrushMappingMode.Absolute; squiggly_brush.TileMode = TileMode.Tile; squiggly_brush.Drawing = new GeometryDrawing(null, path_pen, path_geometry); TextDecoration squiggly = new TextDecoration(); squiggly.Pen = new Pen(squiggly_brush, 6); text_box.TextDecorations.Add(squiggly);