Давайте представим, что у нас есть анимация, которая изменяет ширину прямоугольника с 50 до 150 , когда пользователь перемещает курсор над ним, и обратно с 150 до 50 , когда пользователь перемещает курсор в сторону.Пусть продолжительность каждой анимации будет 1 секунда .
Все в порядке, если пользователь наводит курсор на прямоугольник, затем ждет 1 секунду для завершения анимации, а затем перемещает курсор в сторонуиз прямоугольника.Две анимации занимают всего 2 секунды, и их скорость соответствует ожидаемой.
Но если пользователь отодвинет курсор до завершения первой анимации (50 -> 150), продолжительность второй анимации будет равна1 секунда, но скорость будет очень медленной.Я имею в виду, что вторая анимация будет анимировать ширину прямоугольника не от 150 до 50 , а, скажем, от 120 до 50 или от 70 до 50 , если вы возьмете курсорочень быстроНо для той же 1 секунды !
Итак, я хочу понять, как сделать так, чтобы продолжительность анимации «назад» была динамической .Динамический в зависимости от того, в какой момент первая анимация была остановлена.Или, если я укажу значения From
и To
для 150 и 50, от Duration
до 1 секунды, а ширина прямоугольника будет равна 100 - WPF сама рассчитает, что анимация выполнена на 50%.
Iтестировал различные способы использования анимации, такие как Triggers, EventTrigger в стиле и VisualStateGroups, но безуспешно.
Вот пример XAML, который показывает мою проблему.Если вы хотите сами увидеть, о чем я говорю, наведите курсор на прямоугольник, подождите 1-2 секунды (первая анимация закончена), а затем переместите курсор в сторону.После этого наведите курсор на прямоугольник примерно на 0,25 секунды и уберите его.Вы увидите, что ширина прямоугольника меняется очень медленно.
<Rectangle Width="50"
Height="100"
HorizontalAlignment="Left"
Fill="Black">
<Rectangle.Triggers>
<EventTrigger RoutedEvent="MouseEnter">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="Width"
To="150"
Duration="0:0:1" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="MouseLeave">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="Width" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Rectangle.Triggers>
Кроме того, я хотел бы объяснить, какие вычисления я ожидаю увидеть.Итак, давайте представим другую анимацию, которая идет от 100 до 1100 и имеет продолжительность 2 секунд .Если мы остановим его в точке 300 , он должен начать возвращаться к 100 , но не на 2 секунды, а на:
((300 - 100) / (1100 - 100)) * 2s = 0.4s
Если мы остановимсяв 900 продолжительность будет:
((900 - 100) / (1100 - 100)) * 2s = 1.6s
И если мы позволим анимации закончиться нормально, это будет:
((1100 - 100) / (1100 - 100)) * 2s = 2s