WPF(Windows Presentation Foundation)中的 Shape
控件提供了一系列用于绘制几何形状的元素,如线条、矩形、椭圆、多边形等。这些控件继承自 System.Windows.Shapes.Shape
基类,具有一致的属性和行为,允许开发者轻松地在应用程序中创建丰富的图形界面。
本文将详细介绍 WPF 中的 Shape
控件,包括各类具体形状的使用方法、关键属性、样式设置、变换、动画、事件处理等内容。通过阅读本教程,您将能够全面掌握如何在 WPF 应用程序中使用和定制 Shape
控件。
目录
1. Shape 控件概述
WPF 提供了一组继承自 Shape
基类的控件,用于绘制各种几何图形。这些控件包括:
Line
Rectangle
Ellipse
Polygon
Polyline
Path
Shape
控件具有一致的属性,如 Fill
、Stroke
、StrokeThickness
等,允许开发者通过 XAML 或代码轻松地定制其外观和行为。此外,Shape
控件支持变换、动画和事件处理,使其在创建动态和交互式图形界面时非常有用。
2. Shape 基类及关键属性
所有的 Shape
控件都继承自 System.Windows.Shapes.Shape
类,该基类提供了以下关键属性:
主要属性
-
Fill
:定义形状的内部填充。可以是纯色、渐变或图案。Fill="Red"
-
Stroke
:定义形状的边框颜色。Stroke="Black"
-
StrokeThickness
:定义边框的厚度。StrokeThickness="2"
-
StrokeDashArray
:定义边框的虚线样式。StrokeDashArray="2,2"
-
Opacity
:定义形状的透明度(0.0 到 1.0)。Opacity="0.5"
-
RenderTransform
:应用几何变换,如旋转、缩放、平移等。RenderTransform="RotateTransform Angle=45"
常用属性
-
Width
和Height
:定义形状的尺寸。适用于Rectangle
、Ellipse
等。Width="100" Height="50"
-
Stretch
:定义形状在可用空间中的拉伸方式(None
、Fill
、Uniform
、UniformToFill
)。Stretch="Uniform"
-
Margin
:定义形状与周围元素的间距。Margin="10"
事件
Shape
控件支持多种事件,例如:
MouseLeftButtonDown
:鼠标左键按下事件。MouseEnter
:鼠标进入形状区域。MouseLeave
:鼠标离开形状区域。MouseMove
:鼠标在形状区域移动。
3. 常用 Shape 控件
Line
Line
控件用于绘制直线段。需要定义起点和终点。
XAML 示例
<Line X1="10" Y1="10" X2="200" Y2="10"
Stroke="Blue" StrokeThickness="2" />
属性说明
X1
、Y1
:起点坐标。X2
、Y2
:终点坐标。
C# 代码示例
Line line = new Line
{
X1 = 10,
Y1 = 10,
X2 = 200,
Y2 = 10,
Stroke = Brushes.Blue,
StrokeThickness = 2
};
myCanvas.Children.Add(line);
Rectangle
Rectangle
控件用于绘制矩形。可以通过设置 Width
和 Height
定义尺寸。
XAML 示例
<Rectangle Width="100" Height="50" Fill="LightGreen" Stroke="DarkGreen" StrokeThickness="3" />
C# 代码示例
Rectangle rect = new Rectangle
{
Width = 100,
Height = 50,
Fill = Brushes.LightGreen,
Stroke = Brushes.DarkGreen,
StrokeThickness = 3
};
myCanvas.Children.Add(rect);
Ellipse
Ellipse
控件用于绘制椭圆或圆。通过 Width
和 Height
定义尺寸,若两者相等则为圆。
XAML 示例
<Ellipse Width="100" Height="100" Fill="Yellow" Stroke="Orange" StrokeThickness="2" />
C# 代码示例
Ellipse ellipse = new Ellipse
{
Width = 100,
Height = 100,
Fill = Brushes.Yellow,
Stroke = Brushes.Orange,
StrokeThickness = 2
};
myCanvas.Children.Add(ellipse);
Polygon
Polygon
控件用于绘制多边形,通过一系列点定义形状。
XAML 示例
<Polygon Points="50,0 100,50 50,100 0,50"
Fill="Purple" Stroke="Black" StrokeThickness="2" />
C# 代码示例
Polygon polygon = new Polygon
{
Points = new PointCollection(new List<Point>
{
new Point(50, 0),
new Point(100, 50),
new Point(50, 100),
new Point(0, 50)
}),
Fill = Brushes.Purple,
Stroke = Brushes.Black,
StrokeThickness = 2
};
myCanvas.Children.Add(polygon);
Polyline
Polyline
控件类似于 Polygon
,但不自动闭合。用于绘制折线。
XAML 示例
<Polyline Points="0,0 50,100 100,0"
Stroke="Red" StrokeThickness="3" Fill="Transparent" />
C# 代码示例
Polyline polyline = new Polyline
{
Points = new PointCollection(new List<Point>
{
new Point(0, 0),
new Point(50, 100),
new Point(100, 0)
}),
Stroke = Brushes.Red,
StrokeThickness = 3,
Fill = Brushes.Transparent
};
myCanvas.Children.Add(polyline);
Path
Path
控件用于绘制复杂的几何图形,通过 Data
属性定义路径数据。支持贝塞尔曲线、弧线等高级图形。
XAML 示例
<Path Stroke="Black" StrokeThickness="2" Fill="LightBlue" Data="M 10,100 C 100,0 200,200 300,100" />
属性说明
Data
:定义路径的几何数据,使用路径语法(Path Markup Syntax)。
C# 代码示例
Path path = new Path
{
Stroke = Brushes.Black,
StrokeThickness = 2,
Fill = Brushes.LightBlue,
Data = Geometry.Parse("M 10,100 C 100,0 200,200 300,100")
};
myCanvas.Children.Add(path);
路径数据语法
M
:移动到(Move to)。L
:直线到(Line to)。C
:三次贝塞尔曲线到(Cubic Bezier curve to)。Q
:二次贝塞尔曲线到(Quadratic Bezier curve to)。A
:弧线到(Arc to)。Z
:闭合路径(Close path)。
示例:绘制一个带弧线的心形
<Path Stroke="Red" StrokeThickness="2" Fill="Pink" Data="M 10,30
A 20,20 0 0,1 50,30
A 20,20 0 0,1 90,30
Q 90,60 50,90
Q 10,60 10,30 Z" />
4. 样式与外观设置
填充(Fill)
Fill
属性定义了形状内部的填充,可以是纯色、渐变、图案等。
纯色填充
<Rectangle Width="100" Height="50" Fill="LightBlue" />
渐变填充
线性渐变
<Rectangle Width="100" Height="50">
<Rectangle.Fill>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="Blue" Offset="0" />
<GradientStop Color="White" Offset="1" />
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
径向渐变
<Ellipse Width="100" Height="100">
<Ellipse.Fill>
<RadialGradientBrush>
<GradientStop Color="Yellow" Offset="0" />
<GradientStop Color="Red" Offset="1" />
</RadialGradientBrush>
</Ellipse.Fill>
</Ellipse>
图案填充
<Rectangle Width="100" Height="100">
<Rectangle.Fill>
<ImageBrush ImageSource="Images/pattern.png" />
</Rectangle.Fill>
</Rectangle>
描边(Stroke)及描边厚度(StrokeThickness)
Stroke
属性定义了形状的边框颜色,StrokeThickness
定义了边框的宽度。
示例
<Ellipse Width="100" Height="100" Fill="Yellow" Stroke="Orange" StrokeThickness="4" />
填充和描边的渐变与图案
填充和描边都可以使用渐变或图案画刷。
描边使用线性渐变
<Rectangle Width="100" Height="50">
<Rectangle.Stroke>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,0">
<GradientStop Color="Green" Offset="0" />
<GradientStop Color="Black" Offset="1" />
</LinearGradientBrush>
</Rectangle.Stroke>
<Rectangle.StrokeThickness>5</Rectangle.StrokeThickness>
</Rectangle>
形状的透明度和混合模式
-
Opacity
:控制形状的整体透明度。<Rectangle Width="100" Height="50" Fill="Blue" Opacity="0.5" />
-
Fill
和Stroke
的透明度:通过Color
的Alpha
通道设置部分透明。<Ellipse Width="100" Height="100"> <Ellipse.Fill> <SolidColorBrush Color="#80FF0000" /> <!-- 半透明红色 --> </Ellipse.Fill> <Ellipse.Stroke> <SolidColorBrush Color="#800000FF" /> <!-- 半透明蓝色 --> </Ellipse.Stroke> <Ellipse.StrokeThickness>2</Ellipse.StrokeThickness> </Ellipse>
5. 形状的变换
WPF 支持对 Shape
控件应用多种几何变换,如平移、旋转、缩放和倾斜。这些变换通过 RenderTransform
属性进行设置。
平移(TranslateTransform)
用于将形状在 X 和 Y 方向上移动。
XAML 示例
<Rectangle Width="100" Height="50" Fill="LightBlue">
<Rectangle.RenderTransform>
<TranslateTransform X="50" Y="100"></TranslateTransform>
</Rectangle.RenderTransform>
</Rectangle
C# 代码示例
TranslateTransform translate = new TranslateTransform(50, 100);
rectangle.RenderTransform = translate;
旋转(RotateTransform)
用于将形状围绕一个中心点旋转指定的角度。
XAML 示例
<Rectangle Width="100" Height="50" Fill="LightBlue">
<Rectangle.RenderTransform>
<RotateTransform Angle="50"></RotateTransform>
</Rectangle.RenderTransform>
</Rectangle>
C# 代码示例
RotateTransform rotate = new RotateTransform(45);
ellipse.RenderTransform = rotate;
指定旋转中心
默认情况下,旋转中心是形状的中心点。可以通过 CenterX
和 CenterY
属性自定义旋转中心。
<Rectangle Width="100" Height="50" Fill="LightBlue">
<Rectangle.RenderTransform>
<RotateTransform Angle="30" CenterX="50" CenterY="25" />
</Rectangle.RenderTransform>
</Rectangle>
缩放(ScaleTransform)
用于在 X 和 Y 方向上缩放形状。
XAML 示例
<Polygon Points="50,0 100,50 50,100 0,50" Fill="Purple" >
<Polygon.RenderTransform>
<ScaleTransform ScaleX="1.5" ScaleY="1.5" />
</Polygon.RenderTransform>
</Polygon>
C# 代码示例
ScaleTransform scale = new ScaleTransform(1.5, 1.5);
polygon.RenderTransform = scale;
倾斜(SkewTransform)
用于在 X 和 Y 方向上倾斜形状。
XAML 示例
<Line X1="0" Y1="0" X2="100" Y2="0" Stroke="Black" StrokeThickness="2">
<Line.RenderTransform>
<SkewTransform AngleX="20" AngleY="10" />
</Line.RenderTransform>
</Line>
C# 代码示例
SkewTransform skew = new SkewTransform(20, 10);
line.RenderTransform = skew;
复合变换
可以组合多个变换,使用 TransformGroup
来实现。
XAML 示例
<Rectangle Width="100" Height="50" Fill="LightBlue">
<Rectangle.RenderTransform>
<TransformGroup>
<RotateTransform Angle="30" />
<ScaleTransform ScaleX="1.5" ScaleY="1.5" />
<TranslateTransform X="50" Y="100" />
</TransformGroup>
</Rectangle.RenderTransform>
</Rectangle>
C# 代码示例
TransformGroup transformGroup = new TransformGroup();
transformGroup.Children.Add(new RotateTransform(30));
transformGroup.Children.Add(new ScaleTransform(1.5, 1.5));
transformGroup.Children.Add(new TranslateTransform(50, 100));
rectangle.RenderTransform = transformGroup;
6. 形状的动画
WPF 支持对 Shape
控件的属性进行动画,使界面更加生动和交互式。以下介绍几种常见的动画方式。
动画填充颜色
使用 ColorAnimation
动画填充颜色的过渡。
XAML 示例
<Ellipse Width="100" Height="100">
<Ellipse.Fill>
<SolidColorBrush x:Name="ellipseBrush" Color="Yellow" />
</Ellipse.Fill>
<Ellipse.Triggers>
<EventTrigger RoutedEvent="Ellipse.Loaded">
<BeginStoryboard>
<Storyboard>
<ColorAnimation Storyboard.TargetName="ellipseBrush" Storyboard.TargetProperty="Color"
To="Orange" Duration="0:0:2" AutoReverse="True" RepeatBehavior="Forever" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Ellipse.Triggers>
</Ellipse>
C# 代码示例
SolidColorBrush brush = new SolidColorBrush(Colors.Yellow);
ellipse.Fill = brush;
ColorAnimation colorAnimation = new ColorAnimation
{
To = Colors.Orange,
Duration = TimeSpan.FromSeconds(2),
AutoReverse = true,
RepeatBehavior = RepeatBehavior.Forever
};
brush.BeginAnimation(SolidColorBrush.ColorProperty, colorAnimation);
动画描边颜色与厚度
可以分别对 Stroke
和 StrokeThickness
进行动画。
XAML 示例
<Rectangle Width="100" Height="50" Fill="LightBlue" Stroke="Blue" StrokeThickness="2">
<Rectangle.Triggers>
<EventTrigger RoutedEvent="Rectangle.Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="StrokeThickness"
To="10" Duration="0:0:2" AutoReverse="True" RepeatBehavior="Forever" />
<ColorAnimation Storyboard.TargetProperty="Stroke.Color"
To="Red" Duration="0:0:2" AutoReverse="True" RepeatBehavior="Forever" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Rectangle.Triggers>
</Rectangle>
C# 代码示例
SolidColorBrush strokeBrush = new SolidColorBrush(Colors.Blue);
rectangle.Stroke = strokeBrush;
rectangle.StrokeThickness = 2;
DoubleAnimation thicknessAnimation = new DoubleAnimation
{
To = 10,
Duration = TimeSpan.FromSeconds(2),
AutoReverse = true,
RepeatBehavior = RepeatBehavior.Forever
};
ColorAnimation strokeColorAnimation = new ColorAnimation
{
To = Colors.Red,
Duration = TimeSpan.FromSeconds(2),
AutoReverse = true,
RepeatBehavior = RepeatBehavior.Forever
};
strokeBrush.BeginAnimation(SolidColorBrush.ColorProperty, strokeColorAnimation);
rectangle.BeginAnimation(Shape.StrokeThicknessProperty, thicknessAnimation);
形状的移动与变换动画
使用 DoubleAnimation
或 Storyboard
对形状进行平移、旋转、缩放等变换的动画。
XAML 示例(平移动画)
<Rectangle Width="100" Height="50" Fill="LightBlue">
<Rectangle.RenderTransform>
<TranslateTransform x:Name="rectTransform" X="0" Y="0" />
</Rectangle.RenderTransform>
<Rectangle.Triggers>
<EventTrigger RoutedEvent="Rectangle.Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="rectTransform" Storyboard.TargetProperty="X"
From="0" To="200" Duration="0:0:5" AutoReverse="True" RepeatBehavior="Forever" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Rectangle.Triggers>
</Rectangle>
C# 代码示例(旋转动画)
RotateTransform rotateTransform = new RotateTransform(0);
rectangle.RenderTransform = rotateTransform;
rectangle.RenderTransformOrigin = new Point(0.5, 0.5);
DoubleAnimation rotateAnimation = new DoubleAnimation
{
From = 0,
To = 360,
Duration = TimeSpan.FromSeconds(5),
RepeatBehavior = RepeatBehavior.Forever
};
rotateTransform.BeginAnimation(RotateTransform.AngleProperty, rotateAnimation);
路径动画
使用 PathAnimation
可以沿着路径移动形状,但 WPF 并未直接提供此类动画,可以通过组合动画和变换来实现。
示例:沿路径移动形状
<Canvas x:Name="myCanvas" Width="400" Height="400">
<Path x:Name="motionPath" Stroke="Gray" StrokeThickness="1" Data="M 10,100 C 100,0 200,200 300,100" />
<Ellipse Width="20" Height="20" Fill="Red">
<Ellipse.RenderTransform>
<TranslateTransform x:Name="ellipseTransform" />
</Ellipse.RenderTransform>
</Ellipse>
<Canvas.Triggers>
<EventTrigger RoutedEvent="Canvas.Loaded">
<BeginStoryboard>
<Storyboard RepeatBehavior="Forever">
<DoubleAnimation Storyboard.TargetName="ellipseTransform" Storyboard.TargetProperty="X"
From="10" To="300" Duration="0:0:5" />
<DoubleAnimation Storyboard.TargetName="ellipseTransform" Storyboard.TargetProperty="Y"
From="100" To="100" Duration="0:0:5" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Canvas.Triggers>
</Canvas>
注意:要实现沿路径移动,需要根据路径的具体几何形状手动调整
X
和Y
的动画值,或使用更高级的方法,如使用CompositionTarget.Rendering
事件来逐帧更新位置。
7. 事件处理
Shape
控件支持多种用户交互事件,使其可以响应用户的鼠标操作、触摸操作等。
鼠标事件
常用的鼠标事件包括:
MouseLeftButtonDown
:鼠标左键按下。MouseLeftButtonUp
:鼠标左键释放。MouseEnter
:鼠标指针进入形状区域。MouseLeave
:鼠标指针离开形状区域。MouseMove
:鼠标在形状区域移动。
XAML 示例
<Rectangle Width="100" Height="50" Fill="LightBlue" Stroke="Blue" StrokeThickness="2"
MouseEnter="Rectangle_MouseEnter"
MouseLeave="Rectangle_MouseLeave"
MouseLeftButtonDown="Rectangle_MouseLeftButtonDown" />
C# 代码示例
private void Rectangle_MouseEnter(object sender, MouseEventArgs e)
{
Rectangle rect = sender as Rectangle;
rect.Fill = Brushes.LightGreen;
}
private void Rectangle_MouseLeave(object sender, MouseEventArgs e)
{
Rectangle rect = sender as Rectangle;
rect.Fill = Brushes.LightBlue;
}
private void Rectangle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
MessageBox.Show("Rectangle clicked!");
}
触摸与手写事件
Shape
控件也可以响应触摸事件和手写输入事件,如 TouchDown
、TouchMove
、TouchUp
等。
示例:触摸事件
<Ellipse Width="100" Height="100" Fill="Yellow"
TouchDown="Ellipse_TouchDown"
TouchMove="Ellipse_TouchMove"
TouchUp="Ellipse_TouchUp" />
C# 代码示例
private void Ellipse_TouchDown(object sender, TouchEventArgs e)
{
Ellipse ellipse = sender as Ellipse;
ellipse.Fill = Brushes.Orange;
}
private void Ellipse_TouchMove(object sender, TouchEventArgs e)
{
// 处理触摸移动事件
}
private void Ellipse_TouchUp(object sender, TouchEventArgs e)
{
Ellipse ellipse = sender as Ellipse;
ellipse.Fill = Brushes.Yellow;
}
8. 使用 Shape 控件的最佳实践
优化性能
-
减少过度绘制:尽量避免在视图中添加过多的形状,尤其是复杂的
Path
控件。必要时使用DrawingVisual
来优化绘图性能。 -
使用
Freeze
优化资源:对于不可变的Brush
和Geometry
对象,可以调用Freeze
方法以提高性能。SolidColorBrush brush = new SolidColorBrush(Colors.Blue); brush.Freeze(); rectangle.Fill = brush;
响应式设计
-
使用
Viewbox
:将Shape
控件放入Viewbox
中,使其能够根据容器大小自动缩放。<Viewbox> <Canvas Width="200" Height="200"> <Ellipse Width="100" Height="100" Fill="Red" /> </Canvas> </Viewbox>
-
绑定尺寸:使用数据绑定将
Shape
的Width
和Height
属性绑定到父容器或其他动态源。<Rectangle Fill="LightBlue" Stroke="Blue" StrokeThickness="2" Width="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType=Grid}}" Height="{Binding ActualHeight, RelativeSource={RelativeSource AncestorType=Grid}}" />
资源与样式复用
-
定义样式:在资源字典中定义
Shape
的样式,便于复用和维护。<Window.Resources> <Style x:Key="StyledRectangle" TargetType="Rectangle"> <Setter Property="Fill" Value="LightBlue" /> <Setter Property="Stroke" Value="Blue" /> <Setter Property="StrokeThickness" Value="2" /> </Style> </Window.Resources> <Rectangle Width="100" Height="50" Style="{StaticResource StyledRectangle}" />
-
使用控件模板:为
Shape
控件定义自定义模板,以实现更复杂的外观。<Style TargetType="Ellipse"> <Setter Property="Fill" Value="Yellow" /> <Setter Property="Stroke" Value="Orange" /> <Setter Property="StrokeThickness" Value="3" /> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="Ellipse"> <Ellipse Fill="{TemplateBinding Fill}" Stroke="{TemplateBinding Stroke}" StrokeThickness="{TemplateBinding StrokeThickness}" /> </ControlTemplate> </Setter.Value> </Setter> </Style>
9. 综合示例
以下是一个综合示例,展示了如何结合多种 Shape
控件、样式、变换和动画创建一个简单的动态图形界面。
XAML 示例
<Window x:Class="WpfShapeDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfShapeDemo"
Title="Shape Demo" Height="500" Width="800">
<Grid>
<Grid.Resources>
<Style x:Key="AnimatedEllipseStyle" TargetType="Ellipse">
<Setter Property="Fill">
<Setter.Value>
<SolidColorBrush Color="Yellow" />
</Setter.Value>
</Setter>
<Style.Triggers>
<EventTrigger RoutedEvent="Ellipse.Loaded">
<BeginStoryboard>
<Storyboard RepeatBehavior="Forever" AutoReverse="True">
<ColorAnimation Storyboard.TargetProperty="Fill.Color"
To="Orange" Duration="0:0:3" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Style.Triggers>
</Style>
</Grid.Resources>
<Canvas>
<!-- 旋转的矩形 -->
<Rectangle Width="100" Height="50" Fill="LightBlue" Stroke="Blue" StrokeThickness="2"
Canvas.Left="50" Canvas.Top="50">
<Rectangle.RenderTransform>
<RotateTransform x:Name="rotatingRectangle" Angle="0" CenterX="50" CenterY="25" />
</Rectangle.RenderTransform>
</Rectangle>
<!-- 动画椭圆 -->
<Ellipse Width="100" Height="100" Style="{StaticResource AnimatedEllipseStyle}"
Canvas.Left="200" Canvas.Top="50" />
<!-- 多边形 -->
<Polygon Points="300,10 350,100 250,100" Fill="Purple" Stroke="Black" StrokeThickness="2"
Canvas.Left="400" Canvas.Top="50" />
<!-- 线条 -->
<Line X1="0" Y1="0" X2="150" Y2="150" Stroke="Green" StrokeThickness="3"
Canvas.Left="600" Canvas.Top="50" />
<!-- 路径 -->
<Path Stroke="Red" StrokeThickness="2" Fill="Pink" Data="M 10,10 L 100,10 L 100,100 Z"
Canvas.Left="50" Canvas.Top="200">
<Path.RenderTransform>
<ScaleTransform ScaleX="1" ScaleY="1" />
</Path.RenderTransform>
</Path>
</Canvas>
<!-- 旋转动画 -->
<Grid.Triggers>
<EventTrigger RoutedEvent="Grid.Loaded">
<BeginStoryboard>
<Storyboard RepeatBehavior="Forever">
<DoubleAnimation Storyboard.TargetName="rotatingRectangle" Storyboard.TargetProperty="Angle"
From="0" To="360" Duration="0:0:5" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Grid.Triggers>
</Grid>
</Window>
C# 代码示例(MainWindow.xaml.cs)
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Animation;
namespace WpfShapeDemo
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
// 为路径添加缩放动画
Path path = new Path
{
Stroke = Brushes.Red,
StrokeThickness = 2,
Fill = Brushes.Pink,
Data = Geometry.Parse("M 10,10 L 100,10 L 100,100 Z"),
Canvas.Left = 50,
Canvas.Top = 200
};
ScaleTransform scaleTransform = new ScaleTransform(1, 1);
path.RenderTransform = scaleTransform;
path.RenderTransformOrigin = new Point(0.5, 0.5);
this.FindName("canvas"); // 假设 Canvas 有 x:Name="canvas"
Canvas canvas = (Canvas)this.Content.FindName("canvas");
canvas.Children.Add(path);
DoubleAnimation scaleAnimation = new DoubleAnimation
{
From = 1,
To = 1.5,
Duration = TimeSpan.FromSeconds(2),
AutoReverse = true,
RepeatBehavior = RepeatBehavior.Forever
};
scaleTransform.BeginAnimation(ScaleTransform.ScaleXProperty, scaleAnimation);
scaleTransform.BeginAnimation(ScaleTransform.ScaleYProperty, scaleAnimation);
}
}
}
注意:上述示例中,路径的缩放动画在代码中添加,矩形的旋转动画在 XAML 中通过
Storyboard
实现。
10. 总结
WPF 的 Shape
控件为开发者提供了强大且灵活的绘图工具,能够创建丰富的图形界面和视觉效果。通过掌握各类 Shape
控件的使用方法、样式设置、变换、动画和事件处理,您可以在 WPF 应用程序中实现各种动态和交互式的图形效果。
关键要点总结:
-
多样的形状选择:
Line
、Rectangle
、Ellipse
、Polygon
、Polyline
、Path
等,满足不同的绘图需求。 -
一致的属性体系:
Fill
、Stroke
、StrokeThickness
等属性在所有Shape
控件中通用,简化了样式设置。 -
支持变换与动画:通过
RenderTransform
和Storyboard
,可以对形状进行动态的变换和动画效果。 -
事件驱动的交互:支持鼠标、触摸等事件,使图形界面具有更高的互动性。
-
资源与样式复用:通过资源字典和样式,提升代码的复用性和维护性。
-
性能优化:合理使用绘图技术和资源管理,确保应用程序的流畅性和响应性。
通过不断实践和探索,您将能够充分利用 WPF 的 Shape
控件,打造出美观、动态且高效的图形用户界面。