#c# #silverlight #storyboard
#c# #silverlight #раскадровка
Вопрос:
Я некоторое время пытался создать класс / серию классов, которые при обнаружении изменения размера в связанном объекте пытаются остановить изменение размера объекта и создать для него плавную анимацию изменения размера. Однако у меня всегда была проблема с «мерцанием» объектов на экране в течение секунды при целевом размере перед запуском анимации.
Короче говоря, после некоторой серьезной отладки и сомнений в себе у меня сложилось впечатление, что вызов Storyboard.Begin()
не влияет на целевое значение до следующего тика часов. Я предполагаю, что это как-то связано с тем, что Storyboard.Seek()
это не происходит до следующего тика часов. (Смотрите ссылку на MSDN). И как таковой, объект принимает свою новую высоту для одного кадра перед запуском анимации, которая возвращает его к начальной высоте.
Я потратил много времени, пытаясь заставить это работать, потому что это далеко не так просто, как кажется. Я не могу установить FrameworkElement.Height
значение e.PreviousSize.Height
в FrameworkElement.SizeChanged
обработчике событий, потому что это влияет на «истинную» высоту объекта. В качестве примера того, почему это не работает, можно привести то, что если что-то изменяет «истинную» высоту объекта во время воспроизведения анимации, то повторная настройка FrameworkElement.Height
на целевую высоту, которая была получена при начале анимации, может установить ее как неправильное, устаревшее значение.
Я пробовал еще много чего, и я уверен, что они появятся по мере поступления ответов, но любые ваши идеи будут очень высоко оценены.
Комментарии:
1. Может быть, это полностью отличается от того, что вы пытаетесь сделать, но вы пробовали расширять / модифицировать / разбирать функциональность FluidLayout ExtendedVisualStateManager, которая относительно хорошо справляется с подобными ситуациями?
2. @dain — Это почти именно то, что я хочу, однако это не работает, когда
VisualState
для свернутого или развернутого содержится в стиле каждого экземпляра. В одном случае на экране есть четыре экземпляра элемента управления, иExtendedVisualStateManager
работает только в том случае, если контейнер для четырех экземпляров содержит состояния, что в данном случае невозможно. (Я надеюсь, что это имеет смысл.) Кроме того, мне также приходится иметь дело с элементами управления, которые изменяют размер из-за изменения содержимого, а не из-за изменения состояния. Но все равно спасибо!
Ответ №1:
Вероятно, вам повезло бы больше, создав контейнер макета, который обрабатывает изменение размера дочерних объектов, что-то вроде анимированной панели Робби Ингебретсена.
Комментарии:
1. Спасибо Брайанту. Решил это давно, но это было в том же направлении, что и решение Робби Ингебретсена, поэтому я отмечу ваше. Однако есть пара СЕРЬЕЗНЫХ проблем с его решением. Самая большая из них заключается в том, что бесконечное измерение как по высоте, так и по ширине может привести к огромным проблемам с компоновкой.