2011-05-11 71 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