我正在使用动画使窗口淡出焦点,然后关闭。
但是,关闭事件会在动画后立即发生。
动画后关闭窗口的最简单方法是什么?
在以下代码中,MainWindow是正在打开的第二个窗口。在第一个窗口中单击按钮时会调用此方法。
private void CloseMethod(object sender, RoutedEventArgs e)
{
MainWindow win = new MainWindow();
win.Show();
DoubleAnimation animation = new DoubleAnimation()
{
From = 1.0,
To = 0.0,
Duration = new Duration(TimeSpan.FromSeconds(2))
};
this.BeginAnimation(Window.OpacityProperty, animation);
this.Close();
}
答案 0 :(得分:4)
我接受了奥马尔的回答,但出于学习的目的,还想指出如果使用Storyboard,Completed
事件可用于调用关闭窗口的方法,之后故事板中的动画已经发生。加上Button.Click
方法,这也可以达到预期的效果:
<Button Foreground="Red" ToolTip="Close this window." Click="ShowMainWin">
<Button.Triggers>
<EventTrigger RoutedEvent="Button.Click">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
Storyboard.TargetName="EntireWindow"
Storyboard.TargetProperty="Opacity"
From="1.0" To="0.0"
Duration="0:0:0.5"
Completed="CloseMethod"></DoubleAnimation>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
Close Window</Button>
并且,在代码中,我定义了"ShowMainWin"
和"CloseMethod"
。
"ShowMainWin"
,导致第二个窗口立即打开。 Storyboard
中的动画运行,导致第一个窗口消失。动画完成后,将调用"CloseMethod"
,导致第一个窗口关闭:
private void ShowMainWin(object sender, RoutedEventArgs e)
{
MainWindow win = new MainWindow();
win.Show();
}
public void CloseMethod(object sender, EventArgs e)
{
this.Close();
}
答案 1 :(得分:2)
当然会发生这种情况。动画本质上是异步的,关闭函数将在开始动画后直接执行。
最好的方法是在动画的Completed事件上调用close函数。在这种情况下,你写:
/////
{
DoubleAnimation anim = new DoubleAnimation();
// init you animation
anim.Completed += anim_Completed;
}
////
void anim_Completed(object sender, EventArgs e)
{
this.Close();
}