WPF textblock动画效果

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF textblock动画效果相关的知识,希望对你有一定的参考价值。

如何使TEXTBLOCK以一定的速度向右平行滑动,最好有代码,没有代码思路也行。
以下的代码是我之前用的,不行,会堵塞UI线程。

while (textblock.Margin.Left!=0)

textblock.Margin = new Thickness(textblock.Margin.Left-1, textblock.Margin.Top, textblock.Margin.Right, textblock.Margin.Bottom);
dhtext.Margin = new Thickness(dhtext.Margin.Left, dhtext.Margin.Top, textblock.Margin.Left, dhtext.Margin.Bottom);
System.Threading.Thread.Sleep(10);

这种问题应该用Animation来处理,你可以搜索关于WPF Animation方面的信息。
基本上将TextBlock放置到一个Canvas中,为TextBlock定义Animation。
<DoubleAnimation
Storyboard.TargetName="MyText"
Storyboard.TargetProperty="(Canvas.Left)"
From="0" To="100" Duration="0:0:1" />
上边表示,TextBlock用1s中从右移动100个像素。
网上示例很多,你可以参考一下。追问

那我如何用后台代码控制Animation,比如说单击按钮后textblock用1S移动100像素,然后移动完了再瞬间移动回来。
干脆你帮我创建一个方法,方法参数是移动时间和控件要移动到的位置,返回类型是void,控件名是TEXTBLOCK1

追答

Animation定义在StoryBoard中,StoryBoard有函数启动Begin()和终止Stop()动画。

这种稍微复杂一点,定义动画帧,每一个时间点不同的值。
基于这种思路自己多尝试,网上这方面的例子也都是很成熟的,建议你多去看看。

参考技术A 你要新建个线程来执行这些代码才行。

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

# WPF动画速率效果

WPF 有趣的动画效果

WPF编游戏系列 之七 动画效果

WPF编游戏系列 之六 动画效果

WPF制作歌词动画

WPF实现渐变淡入淡出的动画效果