Wpf 文档中的波浪下划线

Wpf 文档中的波浪下划线,wpf,flowdocument,underline,Wpf,Flowdocument,Underline,在WPF中,是否有一种简单的方法可以向FlowDocument元素添加波浪下划线(如Word中的拼写错误)?有下划线类,但似乎没有办法设置它的样式。红色下划线足够简单: <Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Grid.Resources>

在WPF中,是否有一种简单的方法可以向
FlowDocument
元素添加波浪下划线(如Word中的拼写错误)?有
下划线
类,但似乎没有办法设置它的样式。

红色下划线足够简单:

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


一个波浪状的红色下划线会更复杂一些,但我认为你可以创建一个带有波浪状红色东西的可视化画笔,并将其设置为你为下划线文本装饰指定的笔的画笔。编辑:有关此内容,请参见b托尼的帖子。

您可以通过对Robert Macne的解决方案进行以下更改来创建波浪效果

将可视笔刷添加到网格。参考资料部分:

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

并将笔更改为:

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

我知道这是个老问题,但我更喜欢这把刷子。有点棱角,但很干净

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

以下是@bstoney用代码实现的解决方案

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

+1,这正是我所想的,但无法让它正常工作,很好!我发现很难得到一个三次贝塞尔路径来精确缩放。两条对角线也可以,但看起来不太好。上面的波浪刷不是我测试的波浪。丽莎-我在Expression Blend 4中进行了测试,并更新了视觉笔刷。现在它在100%时看起来有点“波浪形”,通常的比例:)这对我来说很好,不过如果你展示了后面的等效代码以及XAML,那就太好了。嗨,罗伯特,请看我的WPF问题,可能吗