【问题标题】:Binding a Storyboard Animation inside a DataTrigger crashes the XamlParser在 DataTrigger 中绑定 Storyboard Animation 会使 XamlParser 崩溃
【发布时间】:2016-03-19 03:24:04
【问题描述】:

我希望我的应用程序在每次发生特定事件时将椭圆动画到一个新位置。出于测试目的,我制作了一个更改视图模型属性的按钮,并且该属性绑定到触发动画的数据触发器,但稍后我希望视图模型根据我尚未实现的其他事件触发它 - 这就是为什么我可以'不要在视图中直接使用绑定到该按钮的事件触发器,我需要视图模型。 因为椭圆应该在每次被触发时被动画移动到一个新位置,所以我需要将 DoubleAnimation 的 TO-Property 绑定到视图模型中的一个值。当我使用普通事件触发器时,这可以正常工作,但使用数据触发器会使 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>

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

【问题讨论】:

    标签: c# wpf mvvm storyboard datatrigger


    【解决方案1】:

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

    看看这个blog entrythis SOF 问题。

    根据您的评论更新:

    首先为什么DataTrigger和StoryBoard绑定不起作用?

    Storyboards Overview提供的答案如下:

    您不能使用动态资源引用或数据绑定表达式 设置情节提要或动画属性值。那是因为 Style 中的所有内容都必须是线程安全的,并且计时系统 必须冻结 Storyboard 对象以使其成为线程安全的。故事板 如果它或其子时间线包含动态资源,则不能被冻结 引用或数据绑定表达式。有关更多信息 冻结和其他可冻结功能,请参阅可冻结对象 概览。

    为什么绑定可以使用 EventTrigger 而不能使用 DataTrigger?

    再次来自同一来源:

    属性触发对象应用的动画表现得更 比 EventTrigger 动画或动画开始复杂的时尚 使用情节提要方法。他们用定义的动画“切换” 其他 Trigger 对象,但与 EventTrigger 和 方法触发的动画。

    我会假设他们的意思是,使用 EventTriggers,StoryBoard 会在事件发生时重新创建,但 DataTriggers 的情况并非如此——“移交”似乎意味着共享故事板。我将创建一个 SO 问题来验证其含义(此处创建的问题:Storyboard: EventTrigger vs DataTrigger)。

    【讨论】:

    • 谢谢。但是如果动画是只读的,我怎么可能在事件触发器中绑定完全相同的故事板呢?在我更改值并将动画播放到新位置后,它甚至可以工作。自从我从事件触发器切换到数据触发器后,该应用程序无法编译。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 2012-02-20
    • 2018-05-31
    • 1970-01-01
    • 2011-01-15
    相关资源
    最近更新 更多