2015-06-05 135 views
1

我正在使用動畫導致窗口淡出焦點,然後關閉。關閉動畫後的WPF窗口

但是,關閉事件在動畫之後立即發生。

在動畫之後關閉窗口最簡單的方法是什麼?

在以下代碼中,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

你是什麼意思「淡出焦點」?慢慢變得透明直到完全消失? –

+0

@AlexandreSeverino是的,你是對的。對不起,那還不清楚。 –

+1

只是爲了確保我能理解。在調用'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(); 

    } 
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(); 
}