سؤال

في WPF، هل هناك طريقة سهلة لإضافة تسطير متموج (مثل الأخطاء الإملائية في Word) إلى FlowDocument عناصر؟هناك Underline الطبقة، ولكن يبدو أنه لا توجد طريقة لتصميمها.

هل كانت مفيدة؟

المحلول

ويمكنك إنشاء تأثير متموج باستخدام التغييرات التالية على حل روبرت Macne ل

وإضافة فرشاة البصرية لقسم Grid.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>

وتغيير القلم ل:

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

نصائح أخرى

التسطير الأحمر بسيط بما فيه الكفاية:

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

أ تموجي سيكون التسطير الأحمر أكثر تعقيدًا بعض الشيء، ولكن أعتقد أنه يمكنك إنشاء VisualBrush مع شيء أحمر متموج فيه، وتعيين ذلك كفرشاة القلم التي تحددها للتسطير TextDecoration. يحرر:يرى com.bstoneyوظيفة لهذا.

وهنا هو الحل @ 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);

وأعرف أن هذا هو السؤال القديم ولكن أنا أفضل هذه الفرشاة. انها الزاوي قليلا ولكنها نظيفة للغاية.

    <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>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top