我希望我的应用程序在每次特定事件发生时将椭圆动画化为新位置。出于测试目的,我创建了一个更改viewmodel属性的按钮,此属性绑定到触发动画的数据触发器,但稍后我希望viewmodel根据我尚未实现的其他事件触发它 - 这就是为什么我可以不要直接在视图中使用eventtrigger绑定到该按钮,我需要viewmodel。 因为椭圆应该在每次被触发时被动画移动到新位置,所以我需要将DoubleAnimation的TO-Property绑定到viewmodel中的值。当我使用普通的eventtrigger时,这很好用,但是使用datatrigger会使XamlParser与该绑定崩溃。除了XAMLParseException之外,我没有得到任何特定的错误,但是,如果我将绑定更改为固定值,例如5,它将正常工作。
这是xaml:
<Window x:Class="AnimationExample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:AnimationExample"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<local:MainWindowViewModel />
</Window.DataContext>
<Canvas Name="CanvasWrapper" Width="525" Height="350">
<Button Content="Next Animation" Command="{Binding NextAnimation}"/>
<Ellipse Fill="Red" Width="60" Height="60" Canvas.Left="60" Canvas.Top="60">
<Ellipse.Style>
<Style>
<Style.Triggers>
<DataTrigger Binding="{Binding CanAnimate}" Value="True" >
<DataTrigger.EnterActions>
<BeginStoryboard >
<Storyboard>
<!-- Works fine without the binding -->
<DoubleAnimation
Storyboard.TargetProperty="(Canvas.Left)"
Duration="0:0:10" To="{Binding NextPosX}" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Ellipse.Style>
</Ellipse>
</Canvas>
</Window>
我相信解析器无法找到绑定的正确路径,即使代码完成显示它。有没有办法可以获得正确的绑定路径?
答案 0 :(得分:2)
阅读Data Binding and Animating Animations部分:基本上冻结动画(即所有属性都是只读的,因此无法修改),必须重新创建动画以反映属性更改的通知。
查看此blog entry和this SOF问题。
根据您的评论进行更新:
首先为什么DataTrigger和StoryBoard绑定不起作用?
答案由Storyboards Overview提供,如下所示:
您无法使用动态资源引用或数据绑定表达式 设置Storyboard或动画属性值。那是因为 Style中的所有内容都必须是线程安全的,并且是计时系统 必须冻结Storyboard对象才能使它们具有线程安全性。故事板 如果它或其子时间轴包含动态资源,则不能被冻结 引用或数据绑定表达式。有关的更多信息 冻结和其他Freezable功能,请参阅Freezable对象 概述
为什么绑定使用EventTrigger而不使用DataTrigger?
同样来自同一个来源:
属性应用的动画触发器对象的行为更多 复杂时尚比EventTrigger动画或动画开始 使用Storyboard方法。他们&#34;切换&#34;动画由。定义 其他触发器对象,但使用EventTrigger和 方法触发的动画。
我将假设他们的意思是使用EventTriggers在事件发生时重新创建StoryBoard,但DataTriggers并非如此 - &#34;切换&#34;似乎意味着共享StoryBoard。我将创建一个SO问题来验证这是什么意思(这里创建的问题:Storyboard: EventTrigger vs DataTrigger)。