FadeIn 和 FadeOut 主题动画只工作一次,而且只有一种方式,为什么?

FadeIn and FadeOut Theme Animation works only once and only one way,why?

有人可以帮助我吗? 我想要做的是,在我的文本块上随机引述淡入淡出。 我正在尝试使用一种叫做 "FadeInThemeAnimation" 的东西。 问题是我不知道如何让它无休止地工作,所以我的随机报价在设置后出现和消失。我已经在 xaml 中测试了十几个属性以查看会发生什么,但似乎我不知道该怎么做。此刻报价出现在文本块中(没有任何淡入淡出效果)并慢慢淡出,就是这样。请,我如何让它工作。我正在粘贴我得到的一大块 xaml 代码。

<TextBlock x:Name="FamousQuoteTextBlock" Grid.Row="4" HorizontalAlignment="Stretch" Margin="5,5,5,5"
                   FontSize="15" TextAlignment="Justify" TextWrapping="Wrap" VerticalAlignment="Stretch" 
                   Loaded="FamousQuoteTextBlock_Loaded"
                   FontFamily="Edwardian Script ITC"
                   DataContext="{Binding quote}"
                   Text="{Binding RandomQuote,Mode=TwoWay}"
                   />
        <StackPanel>
                <StackPanel.Resources>
                <Storyboard x:Name="EnterStoryboard">
                    <FadeInThemeAnimation Storyboard.TargetName="FamousQuoteTextBlock"/>
                </Storyboard>
                <Storyboard x:Name="ExitStoryboard">
                    <FadeOutThemeAnimation Storyboard.TargetName="FamousQuoteTextBlock"/>
                </Storyboard>
            </StackPanel.Resources>
        </StackPanel>

我尝试使用诸如 speedratio、duratio 之类的东西来查看会发生什么,但没有任何区别:(

我后面的 C# 代码:

        private void FamousQuoteTextBlock_Loaded(object sender, RoutedEventArgs e)
        {

            Delay(sender, e);

        }

        private async void Delay(object sender, RoutedEventArgs e)
        {
            await System.Threading.Tasks.Task.Delay(TimeSpan.FromSeconds(3));

            generator_Tick(this, e);
            DispatcherTimer generator = new DispatcherTimer();
            generator.Tick += generator_Tick;
            generator.Interval = TimeSpan.FromSeconds(5);
            generator.Start();


        }


        private void generator_Tick(object sender, object e)
        {
            Quote quote = new Quote();
            FamousQuoteTextBlock.DataContext = quote;
            quote.GenerateQuote();

 }

您可以像这样创建自己的动画:

<TextBlock x:Name="QuoteTextBlock" Text="My Quote here">
    <TextBlock.Resources>
        <Storyboard x:Key="FadeStoryboard">
            <DoubleAnimation From="1" To="0.1" Storyboard.TargetProperty="Opacity" 
                                 Storyboard.TargetName="QuoteTextBlock" 
                                 RepeatBehavior="Forever" AutoReverse="True">
                <DoubleAnimation.EasingFunction>
                    <CubicEase/>
                </DoubleAnimation.EasingFunction>
            </DoubleAnimation>
        </Storyboard>
    </TextBlock.Resources>
</TextBlock>

然后像这样开始:

var storyboard = QuoteTextBlock.Resources["FadeStoryboard"] as Storyboard;

if (storyboard != null)
{
    storyboard.Begin();
}

你要找的小技巧是AutoReverse,意思是动画执行完之后,反向动画会跟进。如果与 RepeatBehaviour="Forever" 结合使用,它可能会实现您想要的效果。

我添加了一个 Ease。您可以自定义缓动函数很多。这意味着动画步骤不会以 linear 方式执行,但在这种情况下将是 cubic.

一些链接可以为您提供有关此事的更多详细信息:

MSDN : Quickstart - Animating your UI using XAML

MSDN : Storyboarded Animations