【问题标题】:Close WPF window after animation动画后关闭 WPF 窗口
【发布时间】:2015-06-05 19:38:03
【问题描述】:

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

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

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

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

【问题讨论】:

  • “淡出焦点”是什么意思?慢慢变得透明直到完全消失?
  • @AlexandreSeverino 是的,你是对的。抱歉,不清楚。
  • 只是为了确定我是否理解。在调用this.Close(); 指令之前,动画是否完整运行?
  • 就像现在一样,第一个窗口(调用动画的)立即关闭,没有动画,然后显示第二个窗口。如果我注释掉this.Close(),则会显示第二个窗口,并且动画会出现在第一个窗口上。

标签: wpf animation


【解决方案1】:

我接受了Omar的回答,但是为了学习也想指出,如果使用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();
}

【讨论】:

    【解决方案2】:

    这当然会发生。动画本质上是异步的,关闭函数将在启动动画后直接执行。

    最好的方法是在动画的 Completed 事件上调用 close 函数。在这种情况下,你写:

    /////
     {
     DoubleAnimation anim = new DoubleAnimation();
            // init you animation
     anim.Completed += anim_Completed;
      }  
      ////
        void anim_Completed(object sender, EventArgs e)
        {
            this.Close();
    
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-14
      • 1970-01-01
      • 2016-01-22
      • 1970-01-01
      • 2011-09-26
      • 2013-07-25
      • 2012-06-28
      • 2011-04-03
      相关资源
      最近更新 更多