重复故事板转换确定次数

时间:2014-03-18 10:17:57

标签: c# silverlight xaml animation windows-phone-8

我正在尝试将不透明度转换为Windows Phone 8中的ButtonTextBlock元素。

这是我转换的ButtonTextBlock元素:

<Button
                x:Name="letterHole" 
                Width="230"
                Height="387"
                Opacity="0"
                BorderThickness="0"
                HorizontalAlignment="Center"
                VerticalAlignment="Center"
                Click="letterHole_Click">
                <Button.Background>
                    <ImageBrush ImageSource="/Assets/Main/letterHoleBackground@2x.png"/>
                </Button.Background>
            </Button>
            <TextBlock
                Name="letter"
                Text=""
                FontSize="60"
                TextAlignment="Center"
                Foreground="Blue"
                Margin="378,268,376,109"/>

Button有背景图片,TextBlock位于其顶部。

这些是我使用的故事板转换:

        <Storyboard x:Name="fadeInAnimation">
            <DoubleAnimation
                Storyboard.TargetName="letterHole"
                Storyboard.TargetProperty="Opacity"
                From="0.0" To="1.0" Duration="0:0:1"/>
        </Storyboard>
        <Storyboard x:Name="wait">
            <DoubleAnimation
                Storyboard.TargetName="letterHole"
                Storyboard.TargetProperty="Opacity"
                From="1.0" To="1.0" Duration="0:0:2"/>
        </Storyboard>
        <Storyboard x:Name="fadeOutAnimation">
            <DoubleAnimation
                Storyboard.TargetName="letterHole"
                Storyboard.TargetProperty="Opacity"
                From="1.0" To="0.0" Duration="0:0:1"/>
        </Storyboard>

我按以下顺序运行它们:fadeInAnimationwaitfadeOutAnimation,结果是元素淡入,等待2秒然后淡出。

我想让这个动画序列重复一定次数, - 现在6 - 并且每次重复更改TextBlock&#39; s {{1} } property。

这是我使用的C#代码:

Text

我添加了一些变量:

public ConstructorOfClass() { InitializeComponent(); string[] letters = {"A", "B", "C", "D", "E", "F"}; int i = 0; int show = 6; animate(); } private void animate() { if(show > 0) { fadeInAnimation.Begin(); fadeInAnimation.Completed += fadeInAnimation_Completed; } } private void fadeInAnimation_Completed(object sender, EventArgs e) { letter.Text = letters[i]; wait.Begin(); wait.Completed += wait_Completed; } private void wait_Completed(object sender, EventArgs e) { fadeOutAnimation.Begin(); fadeOutAnimation.Completed +=fadeOutAnimation_Completed; } private void fadeOutAnimation_Completed(object sender, EventArgs e) { show--; i++; animate(); } - 重复次数

int show - int i数组的索引

每次重复都必须出示一封新信。

问题letters[]i不会增加我的计划方式,所以经过2-3次重复show降到0。

此外,在尝试调试问题后,我注意到在方法show中有时候fadeOutAnimation_Completed()方法没有被调用,导致由于某种原因导致{{1} }和animate()再次增加2或3次。

我错过了什么?

2 个答案:

答案 0 :(得分:2)

每次wait完成后,您都会

fadeOutAnimation.Completed += fadeOutAnimation_Completed;

这意味着fadeOutAnimation_Completed将在第一次运行期间被调用一次,在第二次运行期间将被调用两次,在第三次运行期间将被调用3次,因此如果您在第一次运行后以show = 6开始,它将是5,第二次运行3如果你在第二个上使用BeginTime,我认为你在2个故事板中可以做的是你在2中做的事情:

<Storyboard x:Name="fadeInAnimation" Completed="fadeInAnimation_Completed">
    <DoubleAnimation 
        From="0" 
        To="1" 
        Storyboard.TargetProperty="Opacity" 
        Storyboard.TargetName="letterHole" 
        Duration="0:0:1"/>                
</Storyboard>
<Storyboard x:Name="fadeOutAnimation" Completed="fadeOutAnimation_Completed">
    <DoubleAnimation 
        From="1" 
        To="0" 
        Storyboard.TargetProperty="Opacity" 
        Storyboard.TargetName="letterHole" 
        Duration="0:0:1" 
        BeginTime="0:0:3"/>
</Storyboard>

答案 1 :(得分:1)

您的代码存在的问题是,您多次订阅Completed Storyboards次事件(每次执行Completed个事件时,您都会重新订阅Completed下一个故事板的事件,这意味着下次再次执行它时。)

您只需订阅XAML中的已完成事件:

<Storyboard x:Name="fadeInAnimation" Completed="fadeInAnimation_Completed">
    <DoubleAnimation
        Storyboard.TargetName="letterHole"
        Storyboard.TargetProperty="Opacity"
        From="0.0" To="1.0" Duration="0:0:1"/>
</Storyboard>
<Storyboard x:Name="wait" Completed="wait_Completed">
    <DoubleAnimation
        Storyboard.TargetName="letterHole"
        Storyboard.TargetProperty="Opacity"
        From="1.0" To="1.0" Duration="0:0:2"/>
</Storyboard>
<Storyboard x:Name="fadeOutAnimation" Completed="fadeOutAnimation_Completed">
    <DoubleAnimation
        Storyboard.TargetName="letterHole"
        Storyboard.TargetProperty="Opacity"
        From="1.0" To="0.0" Duration="0:0:1"/>
</Storyboard>

然后在你的代码隐藏中(我刚删除了事件订阅):

private void animate()
{
    if (show > 0)
    {
        fadeInAnimation.Begin();
    }
}

private void fadeInAnimation_Completed(object sender, EventArgs e)
{
    letter.Text = letters[i];
    wait.Begin();
}

private void wait_Completed(object sender, EventArgs e)
{
    fadeOutAnimation.Begin();
}

private void fadeOutAnimation_Completed(object sender, EventArgs e)
{
    show--;
    i++;
    animate();
}