椭圆绘制WPF动画

2024-05-01

我正在开发一个矩形区域的控件,当触发发生时,将在矩形区域中绘制一个椭圆形。该控件将能够承载其他控件,例如文本框、按钮等,因此在触发时将在它们周围绘制圆圈。我希望将圆圈绘制为动画,就像您用笔圈出内部控件一样。

实现这一目标的最佳方法是什么?

我一直在做一些研究,我可以使用 WPF 动画或者我可以使用 GDI+ 来完成任务。想法?


WPF 动画使这变得极其简单。这是基本技术:

  1. 使用您喜欢的任何 WPF 功能(形状、路径、几何图形、画笔、绘图、图像等)创建椭圆的视觉外观。这可以是一个简单的椭圆形,也可以是图形设计师创建的精美绘图,或者介于两者之间的任何东西。

  2. 应用由宽椭圆虚线和单个零长度虚线组成的 OpacityMask。由于破折号的长度为零,整个自定义样式的椭圆将不可见。

  3. 动画显示破折号的长度。随着它变长,椭圆的部分将变得不透明(因此它是可见的),直到全部可见。默认情况下,您的椭圆会从 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(或 Adob​​e 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 执行此操作的更简单方法。如果您想要的只是一个没有任何装饰的简单椭圆,那么根据他的示例对您的代码进行建模可能是正确的选择。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

椭圆绘制WPF动画 的相关文章

随机推荐

  • unix下C++递归复制目录

    没有任何可供使用的功能示例c without additional libs将递归文件和文件夹复制到新位置 一些替代方案system cp R f dir call 我只找到这个C 中的递归目录复制 https stackoverflow
  • 网络抓取未知数据结构(JSON、嵌套列表或其他什么?)

    我构建了一个网络抓取工具this https campus datacamp com courses intro to python for data science chapter 1 python basics该页面取决于将字符串解析为
  • 在 Firebase 管理中验证无密码电子邮件注册

    我试图让我的应用程序的用户通过电子邮件 链接登录 无需密码 客户端 用 React Native 编写 使用 Javascript SDK 请求登录链接 如下所示 基于这个答案 https stackoverflow com questio
  • 使用 kdeplot 对数刻度

    我正在尝试使用 Seaborn 的 kdeplot 制作一个漂亮的自由能表面 热图 我非常接近 但无法找到改变颜色条比例的方法 颜色条比例很重要 因为它应该表示地图上不同坐标处的能量差异 我需要知道如何缩放颜色条的值 0 5961573 l
  • +[NSColor selectedMenuItemColor] 如何神奇地绘制渐变?

    我正在实现一个自定义 NSMenuItem 视图显示出一个亮点 https stackoverflow com questions 6054331 highlighting a nsmenuitem with a custom view当用
  • 如何在 postgresql 的“tablefunc”查询中包含空值?

    我正在尝试使用crosstab http www postgresql org docs 9 1 static tablefunc html函数于postgresql创建一个pivot table 但是 我很难理解如何在查询中构建 SQL
  • 如何隐藏 WebBrowser 直到网站完成加载/下载过程?

    我想知道我该如何隐藏WebBrowser直到网站加载过程完成 另外 我使用 Panel1 和WebBrowser在它的上面 为什么 好吧 这样 我可以完全像我想要的 WebBrowser 一样设置 Panel1 的大小和位置 然后将 Web
  • R 图在从 r 变量读取文本时使用 html 进行格式化

    我正在使用 R 包绘图器创建流程图 为了获得所需的格式 粗体 项目符号 左对齐 我可以在 html 中编写节点标签 但是 我还想通过调用 R 中的变量来填充一些文本 但我不知道如何同时执行这两项操作 html 格式化 调用 R 变量 在此代
  • 如何在RTK查询中配置存储多个中间件

    redux toolkit 给出了原始文档 import configureStore from reduxjs toolkit Or from reduxjs toolkit query react import setupListene
  • 谷歌地图转弯 GPS 导航用于 ios 开发

    我的应用程序需要包含逐段 GPS 导航 任何人都可以告诉如何集成谷歌地图进行逐段 GPS 导航 我可以在android开发中找到它 但我无法从谷歌地图的iOS开发文档中找到导航 https developers google com map
  • 键盘挂钩获取组合键(WPF)

    我尝试在这里使用这篇文章 在 WPF C 中使用全局键盘钩子 WH KEYBOARD LL https stackoverflow com questions 1639331 using global keyboard hook wh ke
  • Firemonkey 移动应用程序和远程 MySQL

    我正在使用 Delphi XE5 并且我已经创建了基本的 Firemonkey 移动应用程序 Delphi 我想连接到远程 MySQL 数据库 我应该使用哪一个数据库管道 FireDAC DBExpress 等 您可以使用标准 TSQLQu
  • UICollectionView 就像 iOS 主屏幕 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想制作一个像 iOS 主屏幕一样的 UICollectionView 我发现了几个 而且很好的 样本 例如 http mobile tu
  • 尝试使用 SwiftMailer 和 Sendgrid 发送电子邮件时出现致命错误

    我在尝试使用 swiftmailer 和 sendgrid smtp 发送电子邮件时收到此错误 致命错误 未捕获异常 Swift TransportException 消息 预期响应代码 250 但收到代码 消息 这是我的代码 hdr ne
  • 如何找到向量中第一个小于整数 X 的元素? (c++)

    如果我有以下向量 10 10 10 20 20 20 30 30 我想要一个函数返回 X 的整数的位置或直接返回 X 之后的较小元素 例如如果我正在搜索 11 我希望函数返回 2 因为第二个元素 10 是第一个较小的元素向量中大于 11 的
  • 从 WasapiLoopbackCapture 捕获音频,并转换为 muLaw

    我正在使用 WasapiLoopbackCapture 捕获音频 format IeeeFloat SampleRate 48000 BitsPerSample 32 我需要将其转换为 muLaw 8Khz 8 位 单声道 最终它将通过 S
  • 世博会错误 - 无法加载所有资源

    由于某种原因 当第一次使用命令启动我的应用程序时expo r ci no dev我收到Failed to load all assets error 收到错误的图像 https i stack imgur com pcvv4 png 如果我
  • 为什么 x = x +1 在 Elixir 中有效?

    我读到的有关 Elixir 的所有内容都表明 赋值应该被视为模式匹配 如果是这样 为什么 x x 1 在 Elixir 中有效 不存在 x x 1 的 x 值 我读到的有关 Elixir 的所有内容都表明 赋值应该被视为模式匹配 在长生不老
  • 使用 JAX-WS 的 SOAP 消息中的嵌套标记中没有命名空间

    我正在尝试使用 JAX WS 和 wsimport 编写一个使用给定 Web 服务的 Java 应用程序 它发送到服务的 SOAP 消息大部分是正确的 然而 传递给服务函数的参数之一是字符串数组 尽管在 SOAP XML 中为数组本身指定了
  • 椭圆绘制WPF动画

    我正在开发一个矩形区域的控件 当触发发生时 将在矩形区域中绘制一个椭圆形 该控件将能够承载其他控件 例如文本框 按钮等 因此在触发时将在它们周围绘制圆圈 我希望将圆圈绘制为动画 就像您用笔圈出内部控件一样 实现这一目标的最佳方法是什么 我一