WP7 Проблема с несколькими элементами управления анимацией - PullRequest
1 голос
/ 08 декабря 2010

Я храню набор элементов управления в массиве и пытаюсь анимировать все элементы управления один за другим в цикле, но я вижу только последнюю анимацию?

  for (int i = 0; i < 4; i++)
            {
                Dispatcher.BeginInvoke(() =>
                {
                    var sb = new Storyboard();
                    sb = CreateStoryboard(1.0, 0.0, this.Lights[0, i]);
                    sb.Begin();
                });
               }


private Storyboard CreateStoryboard(double from, double to, DependencyObject targetControl)
        {
            Storyboard result = new Storyboard();

            DoubleAnimation animation = new DoubleAnimation();
            animation.From = from;
            animation.To = to;
            animation.Duration = TimeSpan.FromSeconds(1);
            animation.BeginTime = TimeSpan.FromSeconds(1);
            animation.AutoReverse = false;
            Storyboard.SetTarget(animation, targetControl);
            Storyboard.SetTargetProperty(animation, new PropertyPath(UIElement.OpacityProperty));

            result.Children.Add(animation);
            return result;
        }

1 Ответ

1 голос
/ 08 декабря 2010

Я затрудняюсь объяснить это поведение.Без Dispatcher.BeginInvoke вы бы просто получили все элементы одновременно.Однако я не понимаю, почему вы не получите то же самое при использовании BeginInvoke.Тем не менее ни то, что вы после.Вам нужно чередовать анимации одну за другой.

Вероятно, лучший способ сделать это - использовать одну StoryBoard с несколькими анимациями, секвенирование анимаций после всей точки Раскадровка .

    private DoubleAnimation CreateAnimation(double from, double to, DependencyObject targetControl, int index)
    {
        DoubleAnimation animation = new DoubleAnimation();
        animation.From = from;
        animation.To = to;
        animation.Duration = TimeSpan.FromSeconds(1);
        animation.BeginTime = TimeSpan.FromSeconds(1 * index);
        animation.AutoReverse = false;
        Storyboard.SetTarget(animation, targetControl);
        Storyboard.SetTargetProperty(animation, new PropertyPath(UIElement.OpacityProperty));

        return animation;
    }

Обратите внимание на дополнительный параметр index, который используется для указания времени начала анимации.

Теперь ваш код выглядит просто:1015 *

var sb = new Storyboard();     

for (int i = 0; i < 4; i++)     
{     
    sb.Children.Add(CreateAnimation(1.0, 0.0, this.Lights[0, i], i);     
}

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