将Storyboard动画绑定在DataTrigger中会导致XamlParser崩溃

时间:2015-12-13 16:49:12

标签: c# wpf mvvm storyboard datatrigger

我希望我的应用程序在每次特定事件发生时将椭圆动画化为新位置。出于测试目的,我创建了一个更改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>

我相信解析器无法找到绑定的正确路径,即使代码完成显示它。有没有办法可以获得正确的绑定路径?

1 个答案:

答案 0 :(得分:2)

阅读Data Binding and Animating Animations部分:基本上冻结动画(即所有属性都是只读的,因此无法修改),必须重新创建动画以反映属性更改的通知。

查看此blog entrythis 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)。