2013-03-26 2 views
0

Мне не удалось создать раскадровку в коде и запустить ее несколько раз прикованными друг к другу. Так или иначе, похоже, что раскадровка держится в контексте и не будет сброшена.Попытка запуска WPF StoryBoard несколько раз с различными выполненными действиями

Я оживляю несколько элементов, и X раз я рекурсивно запускаю анимационный метод, но с различными действиями обратного вызова в событии Completed. Первая анимация работает отлично, но в остальном она вообще не оживляет (завершенные огни события).

Если я создаю StoryBoard в методе и запустил его, не должен ли он быть удален после его завершения? Я пытаюсь сделать storyboard.Remove().

private void SlideLeft(int numberOfStepsToSlide) 
{ 
    if (numberOfStepsToSlide < 1) return; 
    Slide(() => SlideLeft(numberOfStepsToSlide - 1)); 
} 

protected void Slide(Action callBackAfterAnimation = null) 
{ 
    var sb = new Storyboard(); 
    sb.FillBehavior = FillBehavior.Stop; //i thought maybe this would fix it, but no 

    //.. 
    //.. a number of double animations created and added to storyboard 
    //.. 

    sb.Completed += (sender, e) => 
         { 
          sb.Stop(); 
          sb.Remove(); 

          //.. 
          //..sending message to ViewModel and manipulating values 
          //.. 

          if (callBackAfterAnimation != null) 
           callBackAfterAnimation(); 
         }; 
    sb.Begin(); 
} 

Спасибо за ваше время!

+0

Чтобы немного перефразировать то, что вы пытаетесь сделать: вы хотите запустить одиночную раскадровку N раз, где N определяется во время анимации, и каждый раз, когда выполнялся другой обработчик Completed? – JerKimball

+0

@JerKimball Извините за то, что неясно! Не совсем: я хочу запустить одну доску истории N раз, где N определяется _before_ анимацией. Изменить: я вызываю SlideLeft (3), который должен запускать раскадровку три раза. – cederlof

ответ

1

Извините, полностью забыл об этом вопросе!

Вы не хотите называть Remove - это в основном убивает анимация мертвых, убивая все мультипликационные часы созданы, чтобы запустить его ... Попробуйте что-то вроде этого вместо (быстрый и грязный пример):

var win = new Window(); 
win.Width = 50; 
win.Height = 50; 

int runCount = 3; 
int halfSteps = runCount * 2; 
double toWidth = 500.0; 

var sb = new Storyboard(); 
var biggerator = new DoubleAnimation(toWidth, new Duration(TimeSpan.FromSeconds(2))); 
sb.Children.Add(biggerator); 
Storyboard.SetTarget(biggerator, win); 
Storyboard.SetTargetProperty(biggerator, new PropertyPath("Width")); 

sb.Completed += (o,e) => 
{ 
    sb.Stop();   
    halfSteps--; 
    if(halfSteps <= 0) 
    { 
     win.Height = 150; 
    } 
    else 
    { 
     biggerator.To = biggerator.To == 0 ? toWidth : 0; 
     sb.Begin(); 
    } 
}; 

sb.Begin();  
win.Show(); 
Смежные вопросы