Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Помогите решить баг в коде.

Глеб Гарусин Ученик (1), на голосовании 7 месяцев назад
Я написал код для плавного открытия и закрытия окна. Но когда я окно закрываю оно становится прозрачным и не хочет закрываться (только закрывается через диспетчер задач).
 public MainWindow() 
{
InitializeComponent();
Opacity = 0;
Loaded += MainWindow_Loaded;
Closing += MainWindow_Closing;
Deactivated += MainWindow_Deactivated;
}
 private void MainWindow_Loaded(object sender, RoutedEventArgs e) 
{
DoubleAnimation animation = new DoubleAnimation
{
From = 0,
To = 1,
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.Begin();
}

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.Begin();

// Отменяем закрытие окна до завершения анимации
e.Cancel = true;
}

private async void MainWindow_Deactivated(object sender, EventArgs e)
{
// Даем анимации время для проигрывания
await Task.Delay(TimeSpan.FromSeconds(1));

// Закрываем окно после завершения анимации
Close();
}
Голосование за лучший ответ
V̲i̲s̲t̲a̲s̲t̲e̲r̲ Искусственный Интеллект (258862) 8 месяцев назад
Обработчик завершения анимации нужен, через Completed
Глеб ГарусинУченик (1) 8 месяцев назад
окно теперь при закрытии мигает
V̲i̲s̲t̲a̲s̲t̲e̲r̲ Искусственный Интеллект (258862) Глеб Гарусин,
  
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 
} 
 
Глеб ГарусинУченик (1) 8 месяцев назад
ничего не изменилось
V̲i̲s̲t̲a̲s̲t̲e̲r̲ Искусственный Интеллект (258862) Глеб Гарусин, попробуй асинхрон
     var tcs = new TaskCompletionSource(); 
    storyboard.Completed += (s, _) => tcs.SetResult(true); 
    storyboard.Begin(); 
    await tcs.Task; 
    Close(); 
    e.Cancel = true; 
Глеб ГарусинУченик (1) 8 месяцев назад
это где писать? (просто я не сильно разбираюсь)
V̲i̲s̲t̲a̲s̲t̲e̲r̲ Искусственный Интеллект (258862) Глеб Гарусин,
 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; 
} 
Глеб ГарусинУченик (1) 8 месяцев назад
окно резко закрывается без анимации
V̲i̲s̲t̲a̲s̲t̲e̲r̲ Искусственный Интеллект (258862) Глеб Гарусин, замени await tcs.Task; на await Task.WhenAny(tcs.Task, Task.Delay(TimeSpan.FromSeconds(2)));
Глеб ГарусинУченик (1) 8 месяцев назад
всё ровно резко закрывается
V̲i̲s̲t̲a̲s̲t̲e̲r̲ Искусственный Интеллект (258862) добавим цикл ожидания... заменить со строки ниже
 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); 
    } 
} 
Глеб ГарусинУченик (1) 8 месяцев назад
всё ровно резко закрывается
V̲i̲s̲t̲a̲s̲t̲e̲r̲ Искусственный Интеллект (258862) Глеб Гарусин, последний вариант асинхрона
 // Добавляем обработчик завершения анимации 
    EventHandler animationCompleted = (s, _) => Close(); 
 
    storyboard.Completed += animationCompleted; 
 
    storyboard.Begin(); 
 
    // Ожидаем завершения анимации в асинхронном методе 
    await Task.Delay(1000); // 1000 миллисекунд = 1 секунда 
 
    // Удаляем обработчик завершения анимации после его использования 
    storyboard.Completed -= animationCompleted; 
 
    // Отменяем закрытие окна (необходимо, чтобы не вызывалась дополнительная анимация закрытия) 
    e.Cancel = true; 
Похожие вопросы