2011-08-28 4 views
2

Я сделал анимацию, чтобы повернуть мой элемент управления, но когда он запускается, он просто переходит в конечную позицию и сразу же возвращается в исходное положение.WP7 - Анимация заканчивается слишком рано, и никакого эффекта нет

Регуляторы выполнены из кода позади и TextBoxes со следующими свойствами:

FontSize = 45; 
TextAlignment = TextAlignment.Center; 
Widh = 40; 
Heigh = 45; 

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

foreach (TextBlock b in arrayOfTextBoxes) 
{ 
    Rotate(b); 
} 

Animation:

public static void Rotate(UIElement target) 
{ 
     var projection = new PlaneProjection(); 
     target.Projection = projection; 

     DoubleAnimation da = new DoubleAnimation(); 
     da.From = 0; 
     da.To = 90; 
     da.Duration = TimeSpan.FromSeconds(0.25); 
     da.AutoReverse = false; 

     Storyboard.SetTargetProperty(da, new PropertyPath(PlaneProjection.RotationZProperty)); 
     Storyboard.SetTarget(da, projection); 

     Storyboard sb = new Storyboard(); 
     sb.Children.Add(da); 

     EventHandler eh = null; 
     eh = (s, args) => 
     { 
      projection.RotationZ = 90; 
      sb.Stop(); 
      sb.Completed -= eh; 
     }; 
     sb.Completed += eh; 

     sb.Begin(); 
} 

EDIT: Теперь я уверенно знаю, в чем проблема. У меня есть один (иногда два) Dispatcher Times, тикающий в фоновом режиме каждую секунду. Когда я их отключил, уклонение исчезло. Но я не могу этого сделать, потому что мне нужно, чтобы они измеряли время. Остановка их перед тем, как я запускаю анимацию, и они снова начинают их снова, не помогают. // В DispetcherTimers сделать это:

 void tikac_Tick(object sender, EventArgs e) 
    { 
     herniCas += new TimeSpan(0, 0, 1); 
    } 

+0

У меня нет ответа на ваш вопрос, просто предложение: вам не нужно создавать «EventHandler eh' var», вы можете просто использовать анонимный делегат. – jv42

+2

@ jv42: Образец использования переменной 'eh', как правило, является хорошим, поскольку он позволяет делегату удаляться из события после его выполнения. – AnthonyWJones

+0

Просто убедитесь, что вы намереваетесь, чтобы анимация была четверть секунды, IE очень быстро. Переход в конечную позицию происходит не только из-за того, что его анимация очень быстро, а затем выполнение вашего раскадровки завершено? –

ответ

2

Анимация раскадровки обычно удерживать последнее значение "пока они не будут остановлены". Они не изменяют фактическую стоимость недвижимости навсегда. Они просто меняют свое текущее значение (не являются ли свойства зависимостей замечательными? :))

Поскольку вы явно останавливаете его, когда оно заканчивается, значение возвращается к его исходному значению. Не останавливайте раскадровку, если вы хотите, чтобы значение оставалось измененным или явно устанавливало его в коде при изменении анимации.

Анимация в вашем примере настолько быстра, что она заканчивается очень быстро (время запуска для раскадровки может быть несколькими кадрами, и любое время между ними пропускается, поскольку анимации - это интерполяции с фиксированным временем, а не определенные кадры).

Смежные вопросы