C# WinUI项目如何为同一控件添加多个ExpressionAnimation动画
问题原因
你遇到的异常是UIElement扩展的StartAnimation方法对Translation子属性的绑定限制导致的。该方法在处理同一属性组下的多个子属性动画时,会被合成系统判定为无效参数冲突,因此抛出System.ArgumentException。
解决方案
改为直接操作控件对应的CompositionVisual来启动动画,即可正常同时运行多个指向不同目标属性的表达式动画:
// 先获取按钮对应的合成视觉对象 var buttonVisual = ElementCompositionPreview.GetElementVisual(button1); ExpressionAnimation anim1 = _compositor.CreateExpressionAnimation(); anim1.Expression = "-((self.Scale.X - 1) * (self.ActualSize.X * 0.01) * 50)"; anim1.Target = "Translation.X"; ExpressionAnimation anim2 = _compositor.CreateExpressionAnimation(); anim2.Expression = "-((self.Scale.Y - 1) * (self.ActualSize.Y * 0.01) * 50)"; anim2.Target = "Translation.Y"; // 引用参数绑定到视觉对象而非UIElement,表达式逻辑保持兼容 anim1.SetExpressionReferenceParameter("self", buttonVisual); anim2.SetExpressionReferenceParameter("self", buttonVisual); // 通过视觉对象启动两个动画,不会产生冲突 buttonVisual.StartAnimation(anim1); buttonVisual.StartAnimation(anim2);
补充说明
- 单个
ExpressionAnimation只能指定一个Target属性,无法同时更新多个属性,要实现多属性同步更新必须创建多个独立的表达式动画实例。 CompositionVisual的StartAnimation原生支持同时运行多个指向不同目标属性的动画,只要目标属性不重复就不会产生冲突。
内容的提问来源于stack exchange,提问作者Eugen M
相关产品推荐
相关产品推荐

