private void MainWindow_Closing(object sender, CancelEventArgs e)
{
DoubleAnimation animation = new DoubleAnimation
{
From = 1,
To = 0,
Duration = new Duration(TimeSpan.FromSeconds(1)),
FillBehavior = FillBehavior.HoldEnd
};
Storyboard.SetTarget(animation, this);
Storyboard.SetTargetProperty(animation, new PropertyPath(OpacityProperty));
Storyboard storyboard = new Storyboard();
storyboard.Children.Add(animation);
// Добавляем обработчик завершения анимации
storyboard.Completed += (s, _) => Close();
storyboard.Begin();
// Отменяем закрытие
e.Cancel = true;
}
private void MainWindow_Deactivated(object sender, EventArgs e)
{
// управление в MainWindow_Closing
}
var tcs = new TaskCompletionSource();
storyboard.Completed += (s, _) => tcs.SetResult(true);
storyboard.Begin();
await tcs.Task;
Close();
e.Cancel = true;
private async void MainWindow_Closing(object sender, CancelEventArgs e)
{
DoubleAnimation animation = new DoubleAnimation
{
From = 1,
To = 0,
Duration = new Duration(TimeSpan.FromSeconds(1)),
FillBehavior = FillBehavior.HoldEnd
};
Storyboard.SetTarget(animation, this);
Storyboard.SetTargetProperty(animation, new PropertyPath(OpacityProperty));
Storyboard storyboard = new Storyboard();
storyboard.Children.Add(animation);
var tcs = new TaskCompletionSource();
storyboard.Completed += (s, _) => tcs.SetResult(true);
storyboard.Begin();
await tcs.Task;
Close();
e.Cancel = true;
}
var tcs = new TaskCompletionSource();
// Добавляем обработчик завершения анимации
storyboard.Completed += (s, _) => tcs.SetResult(true);
storyboard.Begin();
// Ожидаем завершения анимации в асинхронном методе
await WaitForStoryboardCompletionAsync(tcs);
// Закрываем окно после завершения анимации
Close();
// Отменяем закрытие окна (необходимо, чтобы не вызывалась дополнительная анимация закрытия)
e.Cancel = true;
}
private async Task WaitForStoryboardCompletionAsync(TaskCompletionSource tcs)
{
while (!tcs.Task.IsCompleted)
{
await Task.Delay(100);
}
}
// Добавляем обработчик завершения анимации
EventHandler animationCompleted = (s, _) => Close();
storyboard.Completed += animationCompleted;
storyboard.Begin();
// Ожидаем завершения анимации в асинхронном методе
await Task.Delay(1000); // 1000 миллисекунд = 1 секунда
// Удаляем обработчик завершения анимации после его использования
storyboard.Completed -= animationCompleted;
// Отменяем закрытие окна (необходимо, чтобы не вызывалась дополнительная анимация закрытия)
e.Cancel = true;