【问题标题】:FadeIn and FadeOut Theme Animation works only once and only one way,why?FadeIn 和 FadeOut Theme Animation 只工作一次且只有一种方式,为什么?
【发布时间】:2015-03-24 21:20:03
【问题描述】:

有人可以帮帮我吗? 我想要做的是,在我的文本块上制作一个随机引用淡入淡出。 我正在尝试使用名为“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();

 }

【问题讨论】:

  • 在情节提要中,您可以使用以不透明度为目标的 DoubleAnimation。也可以设置一个行为以无限运行并反转动画(意味着淡入将导致淡出)。

标签: c# xaml windows-phone-8.1 windows-8.1


【解决方案1】:

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

<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

【讨论】:

  • 非常感谢。你一直很有帮助。如您所见,我是初学者。你知道我可以从基础学习 Xaml 到高级概念(如动画)的任何书吗?
  • 我为您提供的链接现在应该有所帮助。有很多关于 MVA (Microsoft Virtual Academy) 的视频教程,用于构建通用应用程序(Windows 8.1 + Windows Phone 8.1)。而且他们是免费的。看看他们。
  • 谢谢你:)祝你有美好的一天。
  • 如何通过自动反转让它只运行一次
  • 不要使用 RepeatBehavior="Forever"。
猜你喜欢
  • 1970-01-01
  • 2012-03-09
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
  • 2016-10-07
  • 2012-09-21
  • 2019-10-08
  • 1970-01-01
相关资源
最近更新 更多