我目前正在开发一个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 :(得分:35)
Unloaded不是一个合适的事件,我不确定这个事件是否甚至可以发生在Windows上。您需要处理Closing
,阻止它实际关闭,启动动画并在动画的Completed
事件发生时关闭它。
e.g。
<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);
}
答案 1 :(得分: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;
}
}
}
}
答案 2 :(得分:5)
H.B。解决方案是好的,但不要有效地关闭窗口,因为Close()调用window_Closing和循环。这是我的工作解决方案:
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();
}