WPF 动画使这变得极其简单。这是基本技术:
使用您喜欢的任何 WPF 功能(形状、路径、几何图形、画笔、绘图、图像等)创建椭圆的视觉外观。这可以是一个简单的椭圆形,也可以是图形设计师创建的精美绘图,或者介于两者之间的任何东西。
应用由宽椭圆虚线和单个零长度虚线组成的 OpacityMask。由于破折号的长度为零,整个自定义样式的椭圆将不可见。
动画显示破折号的长度。随着它变长,椭圆的部分将变得不透明(因此它是可见的),直到全部可见。默认情况下,您的椭圆会从 0 平滑地动画到 1,但您可以通过动画参数控制和改变椭圆出现的速率,例如,您可以先慢速开始,然后加速。
解决方案总体结构
这是基本的 ControlTemplate 结构:
<ControlTemplate TargetType="MyCustomControl">
<Grid>
<Rectangle Fill="{StaticResource EllipseVisualAppearance}">
<Rectangle.OpacityMask>
<VisualBrush>
<VisualBrush.Visual>
<Ellipse
x:Name="opacityEllipse"
StrokeDashArray="0 10"
Stroke="Black" StrokeThickness="0.5"
Width="1" Height"1" />
</VisualBrush.Visual>
</VisualBrush>
</Rectangle.OpacityMask>
</Rectangle>
<ContentPresenter /> <!-- This presents the actual content -->
</Grid>
</ControlTemplate>
创建椭圆视觉效果
WPF 在表达视觉效果方面非常丰富,因此对于椭圆的外观而言,天空是无限的。
使用任何 WPF 绘图技术按照您希望的显示方式准确绘制椭圆。根据您想要从椭圆中获得多少“艺术风格”,您可以制作一个简单(且无聊)的描边椭圆或任何任意花哨的东西,例如:
- 画出一条大致呈椭圆形但未封闭且可能向外展开的路径。
- 填充由图形设计师创建的路径,该路径开始时就像画笔正在做的一样,并且可能会随着您的绕行而变宽,并以斑点结束。
- 在 Expression Design(或 Adobe Illustrator)中创建矢量绘图,将其转换为 XAML 绘图。
- 创建位图图像(请注意,与矢量图相比,位图通常在保真度和性能方面存在劣势)
- 使用 Expression Blend 在画布上绘制多个形状
这是一个最终简单的椭圆:
<VisualBrush x:Key="EllipseVisualAppearance">
<VisualBrush.Visual>
<Ellipse StrokeThickness="0.1" Stroke="Blue" />
</VisualBrush.Visual>
</VisualBrush>
为椭圆设置动画
同样,您可以通过多种方式来执行此操作,具体取决于您希望动画的外观。对于简单的 0 到 360 动画,您的 DoubleAnimation 可以简单如下:
<DoubleAnimation
StoryBoard.TargetName="opacityEllipse"
StoryBoard.TargetProperty="StrokeDashArray[0]"
From="0" To="3.1416" Duration="0:0:0.5" />
常数 3.1416 略高于 pi,即直径为 1 的圆的周长。这意味着椭圆在动画持续时间结束时将完全可见。
替代解决方案
StackOverflow 用户西蒙·福克斯 https://stackoverflow.com/users/16861/simon-fox发布了一个包含链接的答案查尔斯·佩措尔德的这篇文章 http://www.charlespetzold.com/blog/2008/01/Progressive-Arcs-in-XAML.html,但几分钟后他的回答就消失了。估计他删了Petzold 代码显示了使用 PathGeometry 和 ArcSegment 执行此操作的更简单方法。如果您想要的只是一个没有任何装饰的简单椭圆,那么根据他的示例对您的代码进行建模可能是正确的选择。