我希望我的应用程序在每次发生特定事件时将椭圆动画到新位置。出于测试目的,我制作了一个更改视图模型属性的按钮,并且该属性绑定到触发动画的数据触发器,但后来我希望视图模型根据我尚未实现的其他事件触发它 - 这就是为什么我可以不要直接在视图中使用绑定到该按钮的事件触发器,我需要视图模型。
因为椭圆应该在每次触发时由动画移动到新位置,所以我需要将 DoubleAnimation 的 TO 属性绑定到视图模型中的值。当我使用普通的事件触发器时,这工作得很好,但使用数据触发器会使带有该绑定的 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>
我相信解析器无法找到绑定的正确路径,即使代码完成显示它。有没有办法获得正确的绑定路径?
阅读本节数据绑定和动画 https://msdn.microsoft.com/library/ms752312(v=vs.100).aspx:基本上动画是冻结创建的(即它的所有属性都是只读的,因此无法修改),必须重新创建动画以反映属性更改的通知。
看看这个博客条目 http://blogs.microsoft.co.il/tamir/2007/03/19/how-to-bind-to-animation-to-and-from-properties/ and at this https://stackoverflow.com/questions/2186933/wpf-animation-binding-to-the-to-attribute-of-storyboard-animationSOF问题。
根据您的评论更新:
首先,为什么 DataTrigger 和 StoryBoard 绑定不起作用?
答案由提供故事板概述 https://msdn.microsoft.com/de-de/library/ms742868(v=vs.85).aspx如下:
您不能使用动态资源引用或数据绑定表达式
设置 Storyboard 或动画属性值。那是因为
Style 中的所有内容都必须是线程安全的,并且计时系统
必须冻结 Storyboard 对象以使其线程安全。故事板
如果它或其子时间线包含动态资源,则无法冻结
引用或数据绑定表达式。欲了解更多信息
冻结和其他 Freezable 功能,请参阅 Freezable 对象
概述。
为什么绑定适用于 EventTrigger 而不适用于 DataTrigger?
再次来自同一来源:
通过属性 Trigger 对象应用的动画的行为方式更多
比 EventTrigger 动画或启动动画复杂的方式
使用故事板方法。他们用定义的动画“切换”
其他 Trigger 对象,但与 EventTrigger 组合
方法触发的动画。
I will assume他们的意思是,使用 EventTriggers 时,故事板会在事件发生时重新创建,但使用 DataTriggers 时情况并非如此 - “切换”似乎意味着共享故事板。我将创建一个 SO 问题来验证这是什么意思(此处创建的问题:故事板:EventTrigger 与 DataTrigger https://stackoverflow.com/questions/34265487/storyboard-eventtrigger-vs-datatrigger ).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)