如何在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动画类型?的主要内容,如果未能解决你的问题,请参考以下文章

c# wpf 多个textblock滚动字幕怎么实现?

WPF制作歌词动画

wpf 动态添加滚动条

WPF DataGrid 如何动态设置单行高度

WPF 动态生成一个button 和一个textblock 怎么给textblock添加数据

[WPF] 玩玩彩虹文字及动画