2009-12-21 4 views
2

У меня есть следующая раскадровка:Программные обратный раскадровки

<Window.Resources> 
    <Storyboard x:Key="ButtonsAnim"> 
     <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="topRightButton" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y)"> 
      <SplineDoubleKeyFrame KeyTime="00:00:00" Value="0"/> 
      <SplineDoubleKeyFrame KeyTime="00:00:00.2000000" Value="-100"/> 
     </DoubleAnimationUsingKeyFrames> 
     <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="topRightButton" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)"> 
      <SplineDoubleKeyFrame KeyTime="00:00:00" Value="0"/> 
      <SplineDoubleKeyFrame KeyTime="00:00:00.2000000" Value="100"/> 
... 

Это в основном двигается несколько кнопок вокруг в холсте.

Это код, который запускает анимацию:

void MainWindow_Loaded(object sender, RoutedEventArgs e) 
{ 
    Storyboard sb = (Storyboard)Resources["ButtonsAnim"]; 
    storyBoard = sb; 
    storyBoard.Begin(this, true); 

} 

То, что я пытаюсь сделать, это сбросить анимацию, когда я нажимаю кнопку, которая скрывает окно. Когда окно снова появится, анимация должна начинаться с самого начала.

Я попытался использовать storyBoard.Begin (это, правда), когда приложение снова появится, но для этого первого миллисекунды кнопки находятся на последнем месте.

Затем я попытался storyBoard.seek (TimeSpan.Zero), прежде чем скрыть окно, но оно не:

System.Windows.Media.Animation Предупреждение: 6: Невозможно выполнить действие из-за указанного раскадровки был не применялся к этому объекту для интерактивного управления; Действие = 'Seek'; Раскадровка = 'System.Windows.Media.Animation.Storyboard'; Storyboard.HashCode = '24901833'; Storyboard.Type = 'System.Windows.Media.Animation.Storyboard'; TargetElement = 'System.Windows.Media.Animation.Storyboard'; TargetElement.HashCode = '24901833'; TargetElement.Type = «» System.Windows.Media.Animation.Storyboard

Я также попытался storyBoard.remove (это), прежде чем скрыть окно, тот же эффект: кнопки находятся на последнем месте.

Любые идеи?

спасибо.

ответ

1

Думаю, Storyboard.Stop() должен работать здесь. Но если вы не найдете ничего элегантного, вы можете попробовать преобразовать кнопки «преобразовать» после того, как вы скрыли окно. Например:

((TranslateTransform)((TransformGroup)topRightButton.RenderTransform)[3]).X = 0; 
((TranslateTransform)((TransformGroup)topRightButton.RenderTransform)[3]).Y = 0; 

Надеюсь, что я не ошибся при кастинге.

NB: Вы также можете найти полезным этот пример из MSDN: How to: Control a Storyboard After It Starts

+0

Stop делает обратный эффект анимации - но, видимо, он делает это мгновенно, а не анимировать его в обратном направлении. – McGarnagle

2

Чтобы использовать StoryBoard.Remove() этот путь - вы должны иметь ссылку на ваш объект раскадровки.

Как это:

Storyboard myStoryBoard; 

void MainWindow_Loaded(object sender, RoutedEventArgs e) 
{ 
    myStoryBoard = (Storyboard)Resources["myStoryBoard"]; 
    myStoryBoard.Begin(); 

} 

void sbRemoveEvent() 
{ 
    myStoryBoard.Remove(); 
} 
Смежные вопросы