在WPF开发中经常需要进行绘制图形,可以利用Shape类型绘制基本的形状,而且Shape派生自FrameworkElement,属于UI元素范畴,可以直接利用XAML进行绘制。本文通过一些简单的小例子,简述如何通过Shape类绘制形状,仅供学习分享使用,如有不足之处,还请指正。
Shape类位于System.Windows.Shapes命名空间,而上篇文章介绍的Brush位于System.Windows.Media命令空间,由此可见两者所属的分类不同。Shape属于abstract修饰的抽象类,不能直接实例化,需要使用其派生类才可以。
形状对象
-
Stroke,主要用于描述边框的绘制方式,为Brush类型。 -
Fill,主要用于描述形状对象的填充绘制方式,为Brush类型。 -
StrokeThickness,主要用于设置形状外边框的宽度,为double类型。
直线(Line)
-
X1,Y1,主要用于设置直线的起始坐标。 -
X2,Y2,主要用于设置直线的结束坐标。
// 增加一个直线形状
var line = new Line();
//设置起始坐标
line.X1 = 1;
line.Y1 = 1;
//设置结束坐标
line.X2 = 50;
line.Y2 = 50;
line.HorizontalAlignment = HorizontalAlignment.Left;
line.VerticalAlignment = VerticalAlignment.Center;
//设置边框线绘制方式和宽度
line.Stroke = System.Windows.Media.Brushes.LightSteelBlue;
line.StrokeThickness = 2;
myGrid.Children.Add(line);
<Line
X1="1" Y1="1"
X2="50" Y2="50"
Stroke="LightSteelBlue"
StrokeThickness="2"
HorizontalAlignment="Left"
VerticalAlignment="Center">
</Line>
椭圆(Ellipse)
// 创建一个椭圆
Ellipse ellipse = new Ellipse();
// 创建一个画笔
SolidColorBrush brush = new SolidColorBrush();
brush.Color = Color.FromArgb(255, 255, 255, 0);
ellipse.Fill = brush;//用画笔作为椭圆的填充方式
ellipse.StrokeThickness = 2;
ellipse.Stroke = Brushes.Black;
//设置椭圆的大小
ellipse.Width = 200;
ellipse.Height = 100;
<Ellipse
Fill="#FFFFFF00"
Height="100"
Width="200"
StrokeThickness="2"
Stroke="Black"/>
矩形(Rectangle)
-
Width,Height 设置矩形的宽度和高度。 -
Fill设置矩形的填充方式,为Brush类型。 -
Stroke设置外边框的绘制方式,为Brush类型。 -
StrokeThickness,设置外边框的粗细,为double类型。 -
RadiusX,RadiusY,可用于为矩形设置圆角,分别对应矩形圆角的x轴和y轴半径。
<Canvas Width="120" Height="200" >
<!-- 宽100高50,蓝色填充的矩形 -->
<Rectangle
Width="100" Height="50"
Fill="Blue"
Canvas.Left="10"
Canvas.Top="25" />
<!-- 宽100高50,蓝色填充,黑边框,半径为20的圆角的矩形 -->
<Rectangle
Width="100" Height="50"
Fill="Blue"
Stroke="Black" StrokeThickness="4"
RadiusX="20" RadiusY="20"
Canvas.Left="10"
Canvas.Top="100"/>
</Canvas>
非闭合多边形(Ployline)
<Canvas Height="400" Width="400">
<Polyline
Points="10,110 60,10 110,110"
Stroke="Black"
StrokeThickness="4" />
<Polyline
Points="10,110 110,110 110,10"
Stroke="Black"
StrokeThickness="4"
Canvas.Left="150" />
</Canvas>
下图显示了一个Ployline的示例:
闭合多边形(Polygon)
-
Points设置多边形的顶点,表示一组坐标,不同顶点用空格隔开,同一个顶点的x,y坐标用逗号隔开。格式:x1,y1 x2,y2 x3,y3 ... xn,yn。 -
Fill设置多边形的填充方式,为Brush类型。 -
Stroke设置外边框的绘制方式,为Brush类型。 -
StrokeThickness,设置外边框的粗细,为double类型。
<Canvas Height="300" Width="300">
<!-- 蓝色三角形 -->
<Polygon Points="10,110 60,10 110,110"
Fill="Blue" />
<!-- 黑边框的蓝色三角形 -->
<Polygon Points="10,110 60,10 110,110"
Fill="Blue"
Stroke="Black" StrokeThickness="4"
Canvas.Top="150" />
<!-- 蓝色填充的三角形 -->
<Polygon Points="10,110 110,110 110,10"
Fill="Blue"
Canvas.Left="150" />
<!-- 黑边框无填充的三角形-->
<Polygon Points="10,110 110,110 110,10"
Stroke="Black" StrokeThickness="4"
Canvas.Left="150" Canvas.Top="150" />
</Canvas>
路径形状(Path)
<Path Stroke="Black" StrokeThickness="1">
<Path.Data>
<PathGeometry>
<PathGeometry.Figures>
<PathFigureCollection>
<PathFigure StartPoint="10,100">
<PathFigure.Segments>
<PathSegmentCollection>
<QuadraticBezierSegment Point1="200,200" Point2="300,100" />
</PathSegmentCollection>
</PathFigure.Segments>
</PathFigure>
</PathFigureCollection>
</PathGeometry.Figures>
</PathGeometry>
</Path.Data>
</Path>
<Path Stroke="Black" StrokeThickness="1">
<Path.Data>
<PathGeometry>
<PathFigureCollection>
<PathFigure StartPoint="10,100">
<PathSegmentCollection>
<QuadraticBezierSegment Point1="200,200" Point2="300,100" />
</PathSegmentCollection>
</PathFigure>
</PathFigureCollection>
</PathGeometry>
</Path.Data>
</Path>
<Path Stroke="DarkGoldenRod" StrokeThickness="3"
Data="M 100,200 C 100,25 400,350 400,175 H 280" />
可拉伸的形状(Stretch)
Shape及其派生类,都有Stretch属性,可用于填充布局空间,常见属性如下:
-
None:不会拉伸 Shape 对象的内容。
-
Fill:将拉伸 Shape 对象的内容以填充其布局空间。不保留纵横比。
-
Uniform:最大程度地拉伸 Shape 对象的内容以填充布局空间,同时保留原始纵横比。
-
UniformToFill:拉伸 Shape 对象的内容以填满布局空间,同时保留原始纵横比。
Stretch设置示例如下所示:
<Polygon
Points="0,0 0,1 1,1"
Fill="Blue"
Width="100"
Height="100"
Stretch="Fill"
Stroke="Black"
StrokeThickness="2" />
在上述示例中,使用了 Polygon 来绘制从 (0,0) 到 (0,1) 再到 (1,1) 的一个很小的三角形。Polygon 对象的 Width 和 Height 设置为 100,其拉伸属性设置为 Fill。因此,Polygon 对象的内容(三角形)被拉伸以填充更大的空间。
具体内容可参考官网:
https://learn.microsoft.com/zh-cn/dotnet/desktop/wpf/graphics-multimedia/shapes?view=netframeworkdesktop-4.8
学习编程,从关注【老码识途】开始,为大家分享更多文章!!!
原文始发于微信公众号(独立观察员博客):不可不知的WPF形状(Shape)
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论