我在使用数据触发器时,遇到了一个动画Canvas对象的渲染变换的困难。作为一个测试用例,我在Canvas上放置了一个椭圆和两个按钮。当我按下每个按钮时,我希望椭圆的位置动画到该按钮的X坐标:
在这个特定的示例中,我使用按钮并不重要,关键是我试图通过绑定到视图模型中的属性的DataTrigger来触发这些动画。
当我运行这个程序时,我可以点击第一个动画然后再点击第二个动画,这两次的操作都是正确的。但是反过来点击它们就不起作用了……“右”按钮会正确地进行动画,而“左”按钮则不会有任何反应。似乎“右”动画仍在运行或锁定属性等,换句话说,如果我在Xaml中交换Storyboard声明的顺序,情况就会反转。
![enter image description here](https://istack.dev59.com/rhM30.webp)
// this is the property my DataTrigger will bind to
private string _Anim;
public string Anim
{
get { return this._Anim; }
set
{
this._Anim = value;
RaisePropertyChanged(() => this.Anim);
}
}
// a command handler for the buttons that sets my animation property
public ICommand AnimCommand { get { return new RelayCommand<string>(OnAnim); } }
private void OnAnim(string value)
{
this.Anim = String.Empty; // cancel any existing animation, probably not needed...
this.Anim = value;
}
以下是我用来实现此功能的Xaml。它基本上只是一个包含椭圆和两个按钮的画布,椭圆有两个故事板,会在响应后端属性设置为不同字符串(即“左”和“右”)时触发:
<Viewbox xmlns:sys="clr-namespace:System;assembly=mscorlib">
<Canvas Width="350" Height="150" Background="CornflowerBlue">
<Ellipse x:Name="MyEllipse" Width="20" Height="20" Fill="Red">
<Ellipse.RenderTransform>
<TranslateTransform x:Name="myTransform" X="50" Y="50" />
</Ellipse.RenderTransform>
<Ellipse.Style>
<Style TargetType="Ellipse">
<Style.Triggers>
<DataTrigger Binding="{Binding Anim}" Value="Left">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="(Ellipse.RenderTransform).(TranslateTransform.X)" To="100" Duration="0:0:1" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
<DataTrigger Binding="{Binding Anim}" Value="Right">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="(Ellipse.RenderTransform).(TranslateTransform.X)" To="200" Duration="0:0:1" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Ellipse.Style>
</Ellipse>
<Button x:Name="btnLeft" Content="Left" Command="{Binding AnimCommand}" CommandParameter="Left" Canvas.Left="100" Canvas.Top="100" Width="32" Height="24" />
<Button x:Name="btnRight" Content="Right" Command="{Binding AnimCommand}" CommandParameter="Right" Canvas.Left="200" Canvas.Top="100" Width="32" Height="24" />
</Canvas>
</Viewbox>
当我运行这个程序时,我可以点击第一个动画然后再点击第二个动画,这两次的操作都是正确的。但是反过来点击它们就不起作用了……“右”按钮会正确地进行动画,而“左”按钮则不会有任何反应。似乎“右”动画仍在运行或锁定属性等,换句话说,如果我在Xaml中交换Storyboard声明的顺序,情况就会反转。
使用EventTriggers没有问题,只有DataTriggers出现了这种情况。我也尝试了调整FillBehaviours和HandoffBehaviors,但没有效果。请问有人能解释为什么会发生这种情况以及如何解决吗?
x:Name
分配给 BeginStoryboard 元素,并通过 ExitAction 中的 RemoveStoryboard 移除它。 - Clemens