如何在wpf中动态选择TextBlock动画类型?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在wpf中动态选择TextBlock动画类型?相关的知识,希望对你有一定的参考价值。
我想创建简单的动画,其类型基于某些值。我需要在TextBlock控件中更改文本的颜色,但是目标颜色取决于有界变量。我已经创建了2个DataTriggers,并且根据我的有界变量的值,应该开始播放适当的动画。开始时,一切似乎都正常工作(AnimationValue在开始时等于0),当值更改为1时,动画运行,然后值返回为0。问题是,当值变为2时(动画也带有另一种颜色)运行),然后再次为0,则第一个动画将不再运行,但第二个动画仍然可以正常运行。
<Border
Grid.Column="0"
Background="Transparent">
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontSize="32"
Foreground="White"
Text="MyText">
<TextBlock.Style>
<Style>
<Style.Triggers>
<DataTrigger Binding="Binding Path=AnimationValue" Value="1">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty="Foreground.Color"
To="Gray"
Duration="0:0:0.2" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty="Foreground.Color"
To="White"
Duration="0:0:0.2" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.ExitActions>
</DataTrigger>
<DataTrigger Binding="Binding Path=AnimationValue" Value="2">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty="Foreground.Color"
To="Firebrick"
Duration="0:0:0.2" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty="Foreground.Color"
To="White"
Duration="0:0:0.2" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.ExitActions>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</Border>
设置正确的值没有问题-我已经使用调试器对其进行了检查,并且每次都设置了正确的值。 0始终介于1和2之间。DataContext也不是问题-View和ViewModel之间的连接没有断开。我注意到破碎的动画始终是xaml文件中的第一个动画。现在,“灰色”动画将停止正常工作,但是如果我更改xaml文件中的顺序,耐火砖动画将是残破的动画。感谢您的帮助。
答案
似乎在触发器中运行StoryBoard
很奇怪。对于它们的行为,我没有技术上的解释,但是在SO question中,我为您找到了答案。
以下是基于上述答案的一些有效的代码:
<Style>
<Style.Triggers>
<DataTrigger Binding="Binding Path=AnimationValue" Value="0">
<DataTrigger.EnterActions>
<StopStoryboard BeginStoryboardName="Animation1" />
<StopStoryboard BeginStoryboardName="Animation2" />
<BeginStoryboard x:Name="Animation0">
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty="Foreground.Color"
To="White"
Duration="0:0:0.2" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
<DataTrigger Binding="Binding Path=AnimationValue" Value="1">
<DataTrigger.EnterActions>
<StopStoryboard BeginStoryboardName="Animation0" />
<StopStoryboard BeginStoryboardName="Animation2" />
<BeginStoryboard x:Name="Animation1">
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty="Foreground.Color"
To="Gray"
Duration="0:0:0.2" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
<DataTrigger Binding="Binding Path=AnimationValue" Value="2">
<DataTrigger.EnterActions>
<StopStoryboard BeginStoryboardName="Animation0" />
<StopStoryboard BeginStoryboardName="Animation1" />
<BeginStoryboard x:Name="Animation2">
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty="Foreground.Color"
To="Firebrick"
Duration="0:0:0.2" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
</Style.Triggers>
</Style>
以上是关于如何在wpf中动态选择TextBlock动画类型?的主要内容,如果未能解决你的问题,请参考以下文章