Обратный переход визуального состояния wpf

У меня есть настраиваемый элемент управления WPF с двумя визуальными состояниями: включено и отключено. Отключенное состояние имеет простую анимацию перехода, которая отключает элемент управления, а затем исчезает после небольшой задержки. Затем у меня есть обратная анимация, где она исчезает в элементе управления и снова включает ее (без задержки) при переходе в состояние «Включено».

Проблема, с которой я сталкиваюсь, заключается в том, что если я изменю состояние с «Отключено», а затем снова вернусь к включенному до того, как оно начнет исчезать, тогда мне все равно придется ждать анимации постепенного появления, прежде чем он снова включит элемент управления, где на самом деле, он может просто сразу включить управление и избежать постепенного появления.

Как правильно это исправить? Мне как бы нужно установить начальную точку раскадровки перехода «Включено» на основе текущего времени в раскадровке перехода «Отключено» (минус начальная задержка).

Другой способ, я думаю, состоит в том, чтобы иметь два состояния: одно с надписью «Отключено» и одно с надписью «исчезло». После завершения анимации отключенного состояния, если бы можно было изменить визуальные состояния из раскадровки, я мог бы войти в состояние «Затухание» после завершения отключенной раскадровки. Затем я могу определить разные переходы от Disabled к Enabled и Faded к Enabled.

Это возможно?

Спасибо!


person Mark    schedule 09.02.2012    source источник


Ответы (1)


для включения и отключения анимации, правильно ли я предполагаю, что у вас определены значения «От» и «До»? это объясняет поведение, которое вы описываете.

если вы опустите значение From, указав только значение To, указанное свойство будет анимироваться от любого значения, которое оно имеет в данный момент (например, наполовину исчезло), до того, что вы укажете. это вместо того, чтобы извлекать значение из указанного вами значения From, а затем анимировать значение To.

person dtm    schedule 22.03.2012
comment
В моей раскадровке есть несколько шагов, чтобы перейти от отключенного состояния к включенному. Но, к вашему сведению, в простой анимации, например. просто изменив непрозрачность, вы можете близко приблизиться к желаемому поведению, не устанавливая свойство From. Но все же есть недостаток — анимация длится столько же, сколько и должна была бы, независимо от того, начинается ли она с 0 или 50% непрозрачности. Это означает, что обратное затухание кажется более медленным, и задержка становится раздражающей. - person Mark; 28.03.2012
comment
Я пытаюсь вернуть затухание, чтобы оно заняло половину времени, если бы затухание было разрешено выполнять только в течение половины его нормальной продолжительности. Да, если вам интересно, я перфекционист. - person Mark; 28.03.2012
comment
Похоже, вам нужно установить свойство SpeedRatio в зависимости от того, как далеко должна пройти анимация. - person dtm; 28.03.2012
comment
Итак... как мне узнать, как далеко должна зайти анимация? Мне нужно было бы получить текущее время анимации изменения состояния, а затем установить правильное время начала в анимации обратного изменения состояния. Это возможно? - person Mark; 29.03.2012
comment
ну, я больше думал о сравнении текущего значения любого свойства, которое вы анимируете, со значением To. отношение полной разницы к этой разнице и есть SpeedRatio. на самом деле, вы хотите, чтобы скорость изменения свойства была одинаковой. этого можно добиться, изменив либо продолжительность, либо соотношение скоростей, чтобы (SpeedRatio) * (To value — текущее значение) / (Duration) было одинаковым во всех случаях. - person dtm; 29.03.2012
comment
Итак, как вы можете сделать любую из этих вещей в шаблоне элемента управления XAML, помня, что это настраиваемый элемент управления без внешнего вида, где поведение анимации определено в XAML... - person Mark; 30.03.2012
comment
я думаю, вам придется сделать это в небольшом коде для вашего пользовательского элемента управления (я знаю, я знаю - я ненавижу это говорить). всякий раз, когда вы активируете включение или отключение, установите SpeedRatio соответствующим образом. хотите опубликовать упрощенный пример кода для вашего пользовательского элемента управления? - person dtm; 30.03.2012