Как я могу создать задержку во время DoubleAnimation при использовании AutoReverse? - PullRequest
0 голосов
/ 23 марта 2020

У меня есть анимация, которая перемещает сетку в указанное c место, а затем автоматически возвращается с помощью AutoReverse. Но так как это мгновенно, пользователь не может прочитать сообщение внутри него. Как я могу поставить, например, 5-секундную задержку в анимации

Вот метод, который у меня есть до сих пор

public void ErrorMessage(Grid grid, ImageSource imageSource, String error_message)
    {
        Image_Broken_Component.Source = imageSource;
        TextBlock_Error_Message.Text = error_message;

        ThicknessAnimation ta = new ThicknessAnimation
        {
            From = grid.Margin,
            To = new Thickness(0, 50, 0, 0),
            Duration = new Duration(TimeSpan.FromSeconds(1)),
            AutoReverse = true
        };
        grid.BeginAnimation(Grid.MarginProperty, ta);
    }

Анимация должна воспроизводиться так (используя From и To -значения): 1 -> 0 -> ждать 5 с -> 1

1 Ответ

0 голосов
/ 23 марта 2020

Вместо использования свойства AutoReverse используйте Storyboard:

https://docs.microsoft.com/en-us/dotnet/framework/wpf/graphics-multimedia/storyboards-overview

Свойство BeginTime можно использовать для задержки вторая анимация для выполнения базового c секвенирования, как показано здесь:

XAML C# WPF Лучший эффективный способ сделать упорядоченную последовательность анимаций

Тогда вы можете просто последовательность два ThicknessAnimations (один вперед, один назад) и установите BeginTime второго так, чтобы была пауза, прежде чем анимация перевернута.

Пример кода:

public void ErrorMessage(Grid grid, ImageSource imageSource, String error_message)
{
    Image_Broken_Component.Source = imageSource;
    TextBlock_Error_Message.Text = error_message;

    var storyboard = new Storyboard();

    storyboard.Children.Add(new ThicknessAnimation
    {
        From = grid.Margin,
        To = new Thickness(0, 50, 0, 0),
        Duration = new Duration(TimeSpan.FromSeconds(1))
    });

    storyboard.Children.Add(new ThicknessAnimation
    {
        From = new Thickness(0, 50, 0, 0),
        To = grid.Margin,
        Duration = new Duration(TimeSpan.FromSeconds(1)),
        BeginTime = TimeSpan.FromSeconds(6)
    });

    grid.BeginStoryboard(Grid.MarginProperty, storyboard);
}
...