2011-05-11 44 views
16

我目前正在開發一個wpf c#應用程序。我已經添加到事件觸發器到窗體的xaml中,當窗口加載時淡入,當窗體關閉時淡出。淡出窗口

衰落工作完全沒有任何問題,但淡出不起作用。

我已經設置好窗口在加載時會淡入,有一個定時器持續5秒,然後調用窗體淡出事件。

但是,窗口不會淡出它只是馬上關閉沒有動畫。下面是我在淡入和淡出的事件

<Window.Triggers> 
     <EventTrigger RoutedEvent="Window.Loaded"> 
      <BeginStoryboard> 
       <Storyboard Name="FormFade"> 
        <DoubleAnimation Name="FormFadeAnimation" 
            Storyboard.TargetProperty="(Window.Opacity)" 
            From="0.0" To="1.0" Duration="0:0:1" 
            AutoReverse="False" RepeatBehavior="1x" /> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger> 
     <EventTrigger RoutedEvent="Window.Unloaded"> 
      <BeginStoryboard> 
       <Storyboard Name="FormFadeOut" Completed="FormFadeOut_Completed"> 
        <DoubleAnimation Name="FormFadeOutAnimation" 
            Storyboard.TargetName="FormFadeOut" 
            Storyboard.TargetProperty="(Window.Opacity)" 
            From="1.0" To="0.0" Duration="0:0:1" 
            AutoReverse="False" RepeatBehavior="1x" /> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger> 
    </Window.Triggers> 

感謝您可以提供任何幫助的代碼。

+0

可能重複(http://stackoverflow.com/questions/867656/fading-out-a-wpf-window-on-close) – 2011-05-11 02:45:43

+0

只需注意以上幾點:Windows Vista或更高版本可以渲染分層Windows'(WindowStyle = None,AllowsTransparency = True,Background = Transparent)'並且在淡出時避免黑色矩形。 – AlexO 2015-10-02 09:16:41

回答

29

Unloaded是不適合這個事件,我不知道這個事件是否可以發生在Windows。您需要處理Closing,防止其實際關閉,開始動畫並在動畫的Completed事件發生時關閉它。

例如

<Window ... 
     Closing="Window_Closing"> 
private void Window_Closing(object sender, CancelEventArgs e) 
{ 
    Closing -= Window_Closing; 
    e.Cancel = true; 
    var anim = new DoubleAnimation(0, (Duration)TimeSpan.FromSeconds(1)); 
    anim.Completed += (s, _) => this.Close(); 
    this.BeginAnimation(UIElement.OpacityProperty, anim); 
} 
+0

我已經嘗試了你的建議,它現在想出一個異常,說'Window.Closing值不能分配給屬性'RoutedEvent的對象System.Windows.EventTrigger – Boardy 2011-05-11 02:38:46

+0

你可以看到代碼?這根本不是** EventTriggers的內部。 – 2011-05-11 02:44:19

+0

對不起,我誤讀你的代碼,完美地工作,感謝您的幫助 – Boardy 2011-05-11 11:47:12

6

只是嘗試這個樣本

<Window x:Class="FadeInAndOutWindow.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window1" Height="300" Width="300" Closing="Window_Closing" x:Name="winHelp"> 
<Window.Triggers> 
    <EventTrigger RoutedEvent="Window.Loaded"> 
     <BeginStoryboard> 
      <Storyboard Name="FormFade"> 
       <DoubleAnimation Name="FormFadeAnimation" 
            Storyboard.TargetName="winHelp" 
            Storyboard.TargetProperty="(Window.Opacity)" 
            From="0.0" 
            To="1.0" 
            Duration="0:0:1" 
            AutoReverse="False" 
            RepeatBehavior="1x" /> 
      </Storyboard> 
     </BeginStoryboard> 
    </EventTrigger> 
    <EventTrigger RoutedEvent="Window.Unloaded"> 
     <BeginStoryboard> 
      <Storyboard Name="FormFadeOut" 
         Completed="FormFadeOut_Completed"> 
       <DoubleAnimation Name="FormFadeOutAnimation" 
            Storyboard.TargetName="winHelp" 
            Storyboard.TargetProperty="(Window.Opacity)" 
            From="1.0" 
            To="0.0" 
            Duration="0:0:1" 
            AutoReverse="False" 
            RepeatBehavior="1x" /> 
      </Storyboard> 
     </BeginStoryboard> 
    </EventTrigger> 
</Window.Triggers>  
<Grid> 

</Grid> 

namespace FadeInAndOutWindow 
{ 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 
     } 

     private bool closeCompleted = false; 


     private void FormFadeOut_Completed(object sender, EventArgs e) 
     { 
      closeCompleted = true; 
      this.Close(); 
     } 

     private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) 
     { 

      if (!closeCompleted) 
      { 
       FormFadeOut.Begin(); 
       e.Cancel = true; 
      } 
     } 

    } 
} 
5

H.B.解決方案是好的,但不要有效地關閉窗口,因爲Close()調用window_Closing和循環。在這裏我的工作液:淡出關閉時WPF窗口]的

private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     AlreadyFaded = false; 
    } 

    bool AlreadyFaded; 
    private void window_Closing(object sender, CancelEventArgs e) 
    { 
     if (!AlreadyFaded) 
     { 
      AlreadyFaded = true; 
      e.Cancel = true; 
      var anim = new DoubleAnimation(0, (Duration)TimeSpan.FromSeconds(1)); 
      anim.Completed += new EventHandler(anim_Completed); 
      this.BeginAnimation(UIElement.OpacityProperty, anim); 
     } 
    } 

    void anim_Completed(object sender, EventArgs e) 
    { 
     Close(); 
    } 
+0

該解決方案效果很好。我創建了一個BaseWindow類,並且我的所有窗口都從它繼承。我所有的窗戶現在都有這種行爲。感謝您提供這個改進版本。 – alexandrudicu 2012-07-26 08:59:23

+0

工程很好,但由於某種原因,它顯示出一個黑色的矩形,當它淡出..任何想法呢? – Mittchel 2012-10-23 21:20:58

相關問題