Сбросить объекты до значений до анимации в Silverlight - PullRequest
2 голосов
/ 29 января 2011

Есть ли что-то встроенное для сброса анимации всех завершенных объектов до их значений до анимации?

То, что я делаю, загружает пользовательский контроль на холсте, который запускает кучу анимаций при добавлении. Позже я удаляю usercontrol (Canvas.Children.Clear), но не удаляю его. Если я снова добавлю его обратно на холст, я хочу, чтобы отображалось , как если бы оно было перезагружено (т.е. все объекты снова начинают с своих предварительно анимированных значений и начинают анимацию), но элемент управления не перезагружается, просто снова отображается.

Как прямоугольник - это visibility.collapsed и canvas.left = 10, так как это состояние до анимации, а visibility.visible и canvas.left = 50 как его состояние после анимации. При добавлении холста, при первой загрузке или позже, просто добавив его, я хочу, чтобы он перешел в состояние перед анимацией.

Есть ли прямой способ сделать это?

Ответы [ 2 ]

2 голосов
/ 05 марта 2011

Эти анимации будут дочерними для одного или нескольких Storyboard объектов.Вам нужно остановить эти раскадровки в событии Unloaded пользовательского элемента управления.

Чего не хватает большинству разработчиков, так это того, что Storyboard без продолжительности будет работать бесконечно.Это упущено, потому что результаты этой неопределенной работы часто желательны.Например, анимация затухает элемент, разработчик хочет, чтобы он остался невидимым.Если временная шкала, к которой принадлежит анимация, остановлена, свойство непрозрачности элемента вернется к назначенному значению до запуска анимации.

В вашем случае вы также хотите, чтобы раскадровки ваших анимаций работали бесконечно, пока пользовательский контрользагружен.Однако, чтобы получить желаемый эффект, вам нужно остановить раскадровки в незагруженном событии.

Достаточно просто остановить раскадровку, у нее есть метод Stop.Хитрость заключается в том, чтобы овладеть раскадровкой.Проще всего это дать раскадровке x:Name.Теперь вы можете сделать что-то вроде этого: -

    public MyUserControl()
    {
        InitializeComponent();
        Unloaded += MyUserControl_Unloaded;

    }

    void MyUserControl_Unloaded(object sender, RoutedEventArgs e)
    {
        LoadedStoryboard.Stop();
    }

, где LoadedStoryboard - это значение x:Name для раскадровки, которая запускает загруженную анимацию.

0 голосов
/ 29 января 2011

В WPF вы можете «отменить» анимацию, применив анимацию, которая устанавливает для свойства target значение null.См. Следующее сообщение в блоге:

http://joshsmithonwpf.wordpress.com/2008/08/21/removing-the-value-applied-by-an-animation/

Это также может работать в Silverlight.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...