用WPF实现绘图

    xiaoxiao2022-07-14  213

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    开发工具与关键技术:Visual Studio 2017、绘图

    作者:邓崇富

    撰写时间:2019 年 5 月 26 日

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    WPF的基本图形包括一下几个(它们都是Shape类的派生类):

    Line:直线段,可以设置其笔触(Stroke)。Rectangle:矩形,既有笔触,又有填充(Fill)。Ellipse:椭圆,长、宽相等的椭圆即为正圆,既有笔触又有填充。Polygon:多边形,由多条直线段围成的闭合区域,既有笔触又有填充。Polyline:折线(不闭合),由多条首尾相接的直线段组成。Path:路径(闭合区域),基本图形中的功能最强大的一个,可由若干直线、圆弧、贝塞尔曲线组成。 直线:

    直线是最简单的图形。使用X1、Y1两个属性可以设置直线的起点坐标,X2、Y2两个属性则可以设置直线的终点坐标。控制起点坐标的X1(Y1)与终点坐标的X2(Y2)相同就能实现一条平行线(垂直线)、交错的效果。Stroke(笔触)属性的数据类型是Brush(画刷),凡是Brush的派生类均可以用于给这个属性赋值。因为WPF提供了多种渐变色画刷,所以画直线也可以画出渐变色效果。同时,Line的一些属性还帮助我们画出虚线以及控制线段终点的形状。

    下面的例子中综合了这些属性:

    <Grid>

            <Line X1="100" Y1="20" X2="660" Y2="20" Stroke="Red" StrokeThickness="10"/>

            <Line X1="100" Y1="60" X2="660" Y2="60" Stroke="Orange" StrokeThickness="6"/>

            <Line X1="100" Y1="100" X2="660" Y2="100" Stroke="Green" StrokeThickness="3"/>

            <Line X1="100" Y1="140" X2="660" Y2="140" Stroke="Purple"  StrokeThickness="2"/>

            <Line X1="100" Y1="200" X2="660" Y2="200" Stroke="Black" StrokeEndLineCap="Flat" StrokeThickness="6"/>

            <Line X1="100" Y1="240" X2="660" Y2="240" Stroke="Black" StrokeDashArray="3"  StrokeThickness="1"/>

            <Line X1="100" Y1="280" X2="660" Y2="280" Stroke="Black" StrokeDashArray="5"  StrokeThickness="1"/>

            <Line X1="290" Y1="5" X2="290" Y2="400" Stroke="Black" StrokeEndLineCap="Triangle" StrokeThickness="8"/>

            <Line X1="100" Y1="380" X2="660" Y2="380" StrokeDashCap="Round" StrokeThickness="10">

                <Line.Stroke>

                    <LinearGradientBrush EndPoint="0,0.5" StartPoint="1,0.5">

                        <GradientStop Color="Blue"/>

                        <GradientStop Offset="1"/>

                    </LinearGradientBrush>

                </Line.Stroke>

            </Line>

        </Grid>

    运行效果如下图:

    2.矩形:

    矩形由笔触(Stroke,即边线)和填充(Fill)构成。Stroke属性的设置与Line一样,Fill属性的数据类型是Brush.Brush是个抽象类,所以我们不可能拿一个Brush类的实例为Fill属性赋值而只能用Brush派生类的实例进行赋值。WPF和绘图系统包非常丰富的Brush类型,常用地有:

    SolidColorBrush:实心画刷。在XAML中可以使用颜色名称字符串(如Red、Blue)直接赋值。LinearGradientBrush:线性渐变画刷。色彩沿着设置地直线方向、按设置地变化点进行渐变。RadilalGradientBrush:径向渐变画刷。色彩沿半径地方向、按设定地变化点进行渐变,形成圆形填充。ImageBrush:使用图片(Image)作为填充内容。DrawingBrush:使用矢量图(Vector)和位图(Bitmap)作为填充内容。

    下面是使用各种画刷填充矩形的例子:

    <Grid>

            <Grid.RowDefinitions>

                <RowDefinition Height="211*"/>

                <RowDefinition Height="208*"/>

            </Grid.RowDefinitions>

            <Grid.ColumnDefinitions>

                <ColumnDefinition Width="389*"/>

                <ColumnDefinition Width="403*"/>

            </Grid.ColumnDefinitions>

         <!--渐性渐变-->

            <Rectangle Grid.Row="0" Grid.Column="0">

                <Rectangle.Fill>

                    <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">

                        <GradientStop Color="#FFB6F8F1" Offset="0"/>

                        <GradientStop Color="#FF0082BD" Offset="0.25"/>

                        <GradientStop Color="#FF95DEFF" Offset="0.6"/>

                        <GradientStop Color="#FF004F72" Offset="1"/>

                    </LinearGradientBrush>

                </Rectangle.Fill>

            </Rectangle>

            <!--经向渐变-->

            <Rectangle Grid.Row="0" Grid.Column="1">

                <Rectangle.Fill>

                    <RadialGradientBrush>

                        <GradientStop Color="#FFB6F8F1" Offset="0"/>

                        <GradientStop Color="#FF0082BD" Offset="0.25"/>

                        <GradientStop Color="#FF95DEFF" Offset="0.75"/>

                        <GradientStop Color="#FF004F72" Offset="1.5"/>

                    </RadialGradientBrush>

                </Rectangle.Fill>

            </Rectangle>

            <!--矢量图填充-->

            <Rectangle Grid.Row="1" Grid.Column="0">

                <Rectangle.Fill>

                    <DrawingBrush Viewport="0,0,0.2,0.2" TileMode="Tile">

                        <DrawingBrush.Drawing>

                            <GeometryDrawing Brush="LightBlue">

                                <GeometryDrawing.Geometry>

                                    <EllipseGeometry RadiusX="10" RadiusY="10"/>

                                </GeometryDrawing.Geometry>

                            </GeometryDrawing>

                        </DrawingBrush.Drawing>

                    </DrawingBrush>

                </Rectangle.Fill>

            </Rectangle>

            <!--无填充,用渐性变填充边线-->

            <Rectangle Grid.Row="1" Grid.Column="1">

                <Rectangle.Stroke>

                    <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">

                        <GradientStop Color="Red" Offset="0.5"/>

                        <GradientStop Color="Blue" Offset="1"/>

                    </LinearGradientBrush>

                </Rectangle.Stroke>

            </Rectangle>

        </Grid>

    运行效果:

    路径:

    路径(Path)可以说是WPF绘图中最强大的工具,一来是因为它完全可以替代其它几种图形,二来它可以将直线、圆弧、贝塞尔曲线等基本元素结合进来,形成更复杂的图形。路径最重要的一个属性是Data,Data的数据类型是Geometry(几何图形),我们正是使用这个属性将一些基本的线段连接起来、形成复杂的图形。

    为Data属性赋值的语法有两种:一种是标签式的标准语法,另一种是专门用于绘制几何图形的“路径标记语法”。

    Geometry的子类包括:

    LineGeometry:直线几何图形。RectangleGeometry:矩形几何图形。EllipseGeometry:椭圆几何图形。PathGeometry:路径几何图形。StreamGeometry:PathGeometry的轻量级替代品,不支持Binding、动画等功能。CombinedGeometry: 有多个基本几何图形联合在一起,形成地单一几何图形。GeometryGroup:由多个基本几何图性组合在一起,形成地21几何图形组。

        下面是椭圆和路径绘图的例子代码:

     

    <Grid>

            <Grid.ColumnDefinitions>

                <ColumnDefinition Width="49*"/>

                <ColumnDefinition Width="50*"/>

            </Grid.ColumnDefinitions>

        <!--椭圆路径-->

            <Path Stroke="Green" Fill="LawnGreen" Grid.Column="0" Margin="-5,10,5,-10">

                <Path.Data>

                    <EllipseGeometry Center="200,200" RadiusX="180" RadiusY="100"/>

                </Path.Data>

            </Path>

            <!--自定义路径-->

            <Path Stroke="Yellow" Fill="Orange" Grid.Column="1" Margin="10,10,-10,-10">

                <Path.Data>

                    <PathGeometry>

                        <PathGeometry.Figures>

                            <PathFigure StartPoint="25,140" IsClosed="True">

                                <PathFigure.Segments>

                                    <LineSegment Point="20,40"/>

                                    <LineSegment Point="40,110"/>

                                    <LineSegment Point="50,20"/>

                                    <LineSegment Point="80,110"/>

                                    <LineSegment Point="110,20"/>

                                    <LineSegment Point="120,110"/>

                                    <LineSegment Point="140,40"/>

                                    <LineSegment Point="135,140"/>

                                </PathFigure.Segments>

                            </PathFigure>

                        </PathGeometry.Figures>

                    </PathGeometry>

                </Path.Data>

            </Path>

        </Grid>

    运行效果图如下:

    最新回复(0)