Avalonia 11.1 已知问题 IterationCount 为 Infinite 的动画播放出现异常

news/2024/9/19 16:58:10/文章来源:https://www.cnblogs.com/lindexi/p/18375091

如果在 Avalonia 后台代码播放一个动画,这个动画的 Animation 的 IterationCount 被设置为 Infinite 那么将在播放的时候抛出 InvalidOperationException 异常

本文所使用的 Avalonia 为 11.1.0 版本,由于 Avalonia 行为和 API 变动较多,如大家使用其他版本还请重新测试

如以下代码,将会抛出 InvalidOperationException 异常

        var content = Content;var textBlock = (TextBlock) content!;var animation = new Animation(){Duration = TimeSpan.FromSeconds(10),IterationCount = IterationCount.Infinite,PlaybackDirection = PlaybackDirection.Alternate,Children ={new KeyFrame(){Setters ={new Setter(TranslateTransform.XProperty, 0d),},KeyTime = TimeSpan.FromSeconds(0)},new KeyFrame(){Setters ={new Setter(TranslateTransform.XProperty, 500d),},KeyTime = TimeSpan.FromSeconds(10)}}};textBlock.RenderTransform = new TranslateTransform();await animation.RunAsync(textBlock);

以上代码是从 Avalonia 后台代码简单播放动画示例 修改的

运行以上代码,将可以看到如下错误信息

System.InvalidOperationException:“Looping animations must not use the Run method.”

经过阅读 Avalonia 的代码,我理解了 Avalonia 的意图。在 Avalonia 里面,认为如果一个动画是无限播放的,那就不应该使用 RunAsync 等待,防止等待的逻辑永不返回

然而 Avalonia 却允许调用 RunAsync 方法播放动画,换句话说就是只要使用 RunAsync 而不进行等待就不会炸掉

只需将 await animation.RunAsync(textBlock); 修改为 _ = animation.RunAsync(textBlock); 即可

如果即可运行一个无限播放的动画

我认为这是 Avalonia 的设计问题,但是不太确定,于是就在 Avalonia 提了一个讨论

详细请看 https://github.com/AvaloniaUI/Avalonia/discussions/16757

为什么不等待 RunAsync 也可以?这是因为在 RunAsync 里面是采用 TaskCompletionSource 作为等待机制,判断如果是无限循环的动画,则设置 TaskCompletionSource 异常而已

            var run = new TaskCompletionSource<object?>();if (this.IterationCount == IterationCount.Infinite)run.SetException(new InvalidOperationException("Looping animations must not use the Run method."));

这就意味着在不等待 RunAsync 时,将只是 TaskCompletionSource 被设置异常状态,不会真的出现任何异常。也就是尽管 InvalidOperationException 被 new 了,但是没有地方抛出

本文代码放在 github 和 gitee 上,可以使用如下命令行拉取代码。我整个代码仓库比较庞大,使用以下命令行可以进行部分拉取,拉取速度比较快

先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码

git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 2b7efe38fb648e446b13d9449c92ae5bd4e7cd9a

以上使用的是国内的 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码,将 gitee 源换成 github 源进行拉取代码。如果依然拉取不到代码,可以发邮件向我要代码

git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin 2b7efe38fb648e446b13d9449c92ae5bd4e7cd9a

获取代码之后,进入 AvaloniaIDemo/LicajearyaWenewernichiji 文件夹,即可获取到源代码

更多技术博客,请参阅 博客导航

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/785895.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

11 Large Companies That Use Java

https://terenbro.com/blog/11-large-companies-that-use-javaWhat is Java? Why do Companies Use Java? 11 Companies That Use Java Overview List of Companies That Use Java Consider Terenbro as Your Trusted Partner Final ThoughtsTOP-5 PostsPopular Java Use Cas…

mysql全片篇

零,快速总结篇# 1)、查询所有数据库 show databases ; # 2)、查询当前数据库 select database() ; # 3)、创建数据库 create database [ if not exists ] 数据库名 [ default charset 字符集 ] [ collate 排序规则 ] ; # 4)、删除数据库 drop database [ if exists ] 数据库名…

最简单100%解决pip 不是内部或外部命令,也不是可运行的程序 或批处理文件

相信你看了不少教程还是没有解决pip的问题 最关键的问题还是在于没有找到正确的路径。 解决办法: 在cmd中输入python -m pip install --upgrade pip, 它会告诉你 WARNING: Ignoring invalid distribution -ip (d:\python3.9\lib\site-packages)Requirement already satisfie…

为 OpenWrt 路由器编译 minieap-sysu 项目

学校的校园网要使用锐捷认证,于是想把认证客户端装到刷了 OpenWrt 的路由器上面。然而认证客户端 Linux 版只支持 x86 架构,我的路由器处理器却是 AArch64 架构,装不了,所以只能想办法找 AArch64 架构的解决方案。 经过一番搜索,我找到了 minieap-sysu 这个项目,不过需要…

线性dp:最长上升子序列

最长上升子序列本文与leetcode300.最长递增子序列,这题题意一样,阅读完本文可以挑战一下力扣链接 题目叙述: 给定一个无序的整数数组,找出其中最长上升子序列(LIS)的长度。 输入: [5,7,1,9,4,6,2,8,3]输出 4解释最长上升子序列是[1,4,6,8],其长度为4。动态规划的设计…

Day01 Uboot编译

一. 安装环境1. 安装依赖sudo apt-get install gcc make cmake rsync wget unzip build-essential git bc swig libncurses5-dev libpython3-dev libssl-dev python3-distutils android-tools-mkbootimg -y   2. 安装编译器wget http://releases.linaro.org/components/toolc…

三维模型单体化软件:地理信息与遥感领域的精细化革命

在地理信息与遥感科学日新月异的发展浪潮中,单体化软件作为一股强大的驱动力,正引领着我们迈向空间信息处理与应用的新纪元。本文旨在深度解析单体化软件的核心价值、技术前沿、实践应用及面临的挑战,共同探讨这一技术如何塑造行业的未来。单体化软件:精细化时代的钥匙单体…

EasyExcel文档

源自官方文档,仅供我个人使用,其他人请移步官方地址:https://easyexcel.opensource.alibaba.com/,官方文档更详细更好!! 新手必读官方网站:https://easyexcel.opensource.alibaba.com/ github地址:https://github.com/alibaba/easyexcel gitee地址:https://gitee.com/…

在VS Code中使用Snippet Craft扩展提高编码效率

Snippet Craft 一个VS Code代码片段管理插件 功能 创建和插入代码片段 在编辑器区域右键菜单中点击插入Snippet,或在代码片段视图中点击条目,则会将代码片段插入到当前激活文档的光标位置。代码片段编辑 代码片段在左侧栏中,根据创建时的文件内容类型,分组显示代码片段,可…

cmake Makefile面试问题

摘自:https://wenku.baidu.com/view/4db705bdba0d6c85ec3a87c24028915f814d8462.html?_wkts_=1724332395577&bdQuery=cmake+%E9%9D%A2%E8%AF%95%E9%A2%98

Modern CMake 简介

摘自:https://zhuanlan.zhihu.com/p/76975231 Modern CMake 简介历史背景CMake是一个构建系统生成器(build-system generator)。常见的构建系统,有Visual Studio,XCode,Make等等。CMake可以支持不同平台下构建系统的生成。 CMake的出现已经有接近20年的历史,它的发展过程…