在 DataTrigger 中绑定情节提要动画会使 XamlParser 崩溃
Binding a Storyboard Animation inside a DataTrigger crashes the XamlParser
我希望我的应用程序在每次发生特定事件时将椭圆动画到一个新位置。出于测试目的,我制作了一个按钮来更改视图模型 属性 并且此 属性 绑定到触发动画的数据触发器,但后来我希望视图模型根据我没有的其他事件触发它'尚未实施 - 这就是为什么我不能直接在视图中使用绑定到该按钮的事件触发器,我需要视图模型。
因为椭圆应该在每次被触发时被动画移动到一个新位置,所以我需要将 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>
我相信解析器无法找到绑定的正确路径,即使代码完成显示了它。有什么方法可以获得绑定的正确路径吗?
阅读 Data Binding and Animating Animations 部分:基本上动画是冻结创建的(即其所有属性都是只读的,因此无法修改),必须重新创建动画以反映 属性 更改通知。
看看这个 blog entry and at this SOF 问题。
根据您的评论更新:
首先为什么DataTrigger和StoryBoard绑定不起作用?
The answer is provided by Storyboards Overview as follows:
You can't use dynamic resource references or data binding expressions
to set Storyboard or animation property values. That's because
everything inside a Style must be thread-safe, and the timing system
must Freeze Storyboard objects to make them thread-safe. A Storyboard
cannot be frozen if it or its child timelines contain dynamic resource
references or data binding expressions. For more information about
freezing and other Freezable features, see the Freezable Objects
Overview.
为什么绑定适用于 EventTrigger 但不适用于 DataTrigger?
再次来自同一来源:
Animations applied by property Trigger objects behave in a more
complex fashion than EventTrigger animations or animations started
using Storyboard methods. They "handoff" with animations defined by
other Trigger objects, but compose with EventTrigger and
method-triggered animations.
我会假设他们的意思是,对于 EventTriggers,StoryBoard 在事件发生时重新创建,但对于 DataTriggers 则不是这种情况 - "handoff" 似乎暗示着 StoryBoard 的共享。我将创建一个 SO 问题来验证这是什么意思(此处创建的问题:)。
我希望我的应用程序在每次发生特定事件时将椭圆动画到一个新位置。出于测试目的,我制作了一个按钮来更改视图模型 属性 并且此 属性 绑定到触发动画的数据触发器,但后来我希望视图模型根据我没有的其他事件触发它'尚未实施 - 这就是为什么我不能直接在视图中使用绑定到该按钮的事件触发器,我需要视图模型。 因为椭圆应该在每次被触发时被动画移动到一个新位置,所以我需要将 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>
我相信解析器无法找到绑定的正确路径,即使代码完成显示了它。有什么方法可以获得绑定的正确路径吗?
阅读 Data Binding and Animating Animations 部分:基本上动画是冻结创建的(即其所有属性都是只读的,因此无法修改),必须重新创建动画以反映 属性 更改通知。
看看这个 blog entry and at this SOF 问题。
根据您的评论更新:
首先为什么DataTrigger和StoryBoard绑定不起作用?
The answer is provided by Storyboards Overview as follows:
You can't use dynamic resource references or data binding expressions to set Storyboard or animation property values. That's because everything inside a Style must be thread-safe, and the timing system must Freeze Storyboard objects to make them thread-safe. A Storyboard cannot be frozen if it or its child timelines contain dynamic resource references or data binding expressions. For more information about freezing and other Freezable features, see the Freezable Objects Overview.
为什么绑定适用于 EventTrigger 但不适用于 DataTrigger?
再次来自同一来源:
Animations applied by property Trigger objects behave in a more complex fashion than EventTrigger animations or animations started using Storyboard methods. They "handoff" with animations defined by other Trigger objects, but compose with EventTrigger and method-triggered animations.
我会假设他们的意思是,对于 EventTriggers,StoryBoard 在事件发生时重新创建,但对于 DataTriggers 则不是这种情况 - "handoff" 似乎暗示着 StoryBoard 的共享。我将创建一个 SO 问题来验证这是什么意思(此处创建的问题: