动画后关闭WPF窗口

时间:2015-06-05 19:38:03

标签: wpf animation

我正在使用动画使窗口淡出焦点,然后关闭。

但是,关闭事件会在动画后立即发生。

动画后关闭窗口的最简单方法是什么?

在以下代码中,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();
}

2 个答案:

答案 0 :(得分:4)

我接受了奥马尔的回答,但出于学习的目的,还想指出如果使用StoryboardCompleted事件可用于调用关闭窗口的方法,之后故事板中的动画已经发生。加上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();

    }