Можно ли обновить DoubleAnimation.FromProperty без перезапуска всей анимации? - PullRequest
0 голосов
/ 19 августа 2010

Я пока не очень хорошо знаком с большим количеством WPF, поэтому, если этот запрос выдает какие-то явные недоразумения, я был бы признателен за их указание.

Что я пытаюсь сделать (навсегда илиплохо) - это синхронизация DoubleAnimation.FromProperty с фактической шириной StackPanel, содержащей / запускающей анимацию.

Первоначально я пытался сделать это с привязкой данных, например,

BindingOperations.SetBinding(anim, 
   DoubleAnimation.FromProperty, 
   new Binding {Source = panel, Path = new PropertyPath(ActualWidthProperty)});

Но это не такКажется, не работает.Хотя я могу привязать текстовое поле к свойству From и увидеть, что оно меняется, анимация продолжает выполняться с начального значения.Это как-то связано с зависанием раскадровки?(о котором я ничего не знаю, но только что слышал)

Тогда я подумал, почему бы не остановить и не перезапустить раскадровку (выключить и снова включить!), изменив тем самым FromProperty, обработав StackPanel.SizeChanged событие.Примерно так:

void panel_SizeChanged(object sender, SizeChangedEventArgs e)
{
    if (myStoryBoard != null && myStoryBoard.GetCurrentState(panel) == ClockState.Active)
    {
        myStoryBoard.Stop(panel);
        foreach(var child in myStoryBoard.Children)
        {
            var anim = child as DoubleAnimation;
            if (anim == null) continue;
            anim.From = panel.ActualWidth;
        }
        myStoryBoard.Begin(panel, true);
    }
}

Это работает, но, конечно, анимация запускается с нуля при каждом изменении размера панели.Я предпочел бы возобновить анимацию с того места, где она была прервана, но с новым FromProperty.Это вообще возможно?

1 Ответ

1 голос
/ 19 августа 2010

Это намного проще, чем вы думаете. Крутая вещь в анимациях в WPF и Silverlight заключается в том, что они могут соответствовать текущей ситуации. Единственное, что вам нужно сделать, чтобы создать относительную анимацию, это создать, например, DoubleAnimation с заполнением To, но НЕ заполнять From.

Пример ниже, чтобы анимировать непрозрачность стековой панели от текущего значения до 1:

<DoubleAnimation Duration="0:0: To="1" 
     Storyboard.TargetName="LayoutRoot" 
     Storyboard.TargetProperty="StackPanel.Opacity" />

EDIT1:
Верните цикл анимации к исходному значению, не используя цикл from и навсегда

<Storyboard AutoReverse="True" RepeatBehavior="Forever">
    <DoubleAnimation Duration="0:0:2" 
                        To="1"
                        Storyboard.TargetName="LayoutRoot"
                        Storyboard.TargetProperty="StackPanel.Opacity"
                        />
</Storyboard>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...