我正在尝试将不透明度转换为Windows Phone 8中的Button
和TextBlock
元素。
这是我转换的Button
和TextBlock
元素:
<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>
我按以下顺序运行它们:fadeInAnimation
,wait
,fadeOutAnimation
,结果是元素淡入,等待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次。
我错过了什么?
答案 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();
}