Затухание окна
В настоящее время я разрабатываю приложение wpf С#. Я добавил триггеры события в 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>
Спасибо за любую помощь, которую вы можете предложить.
Ответы
Ответ 1
Unloaded не подходит для этого, я не уверен, что это событие может произойти даже для окон. Вам нужно обработать 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);
}
Ответ 2
просто попробуйте этот образец
<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;
}
}
}
}
Ответ 3
H.B. решение хорошее, но не эффективно закрывает окно, потому что Close() вызывает window_Closing и loop. Здесь мое рабочее решение:
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();
}