以编程方式反转Storyboard

时间:2009-12-21 03:32:36

标签: wpf storyboard

我有以下故事板:

<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(this,true)但是在这第一个毫秒时按钮位于它们的最后位置。

然后我在隐藏窗口之前尝试了storyBoard.seek(TimeSpan.Zero),但它失败了:

  

System.Windows.Media.Animation   警告:6:无法执行操作   因为指定的故事板是   从未应用于此对象   互动控制。行动=“寻求”;   故事板= '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(this),效果相同:按钮位于最后位置。

有什么想法吗?

谢谢。

2 个答案:

答案 0 :(得分:2)

以这种方式使用StoryBoard.Remove() - 您应该继续引用您的storyboard对象。

像这样:

Storyboard myStoryBoard; 

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

}

void sbRemoveEvent()
{
    myStoryBoard.Remove();  
}

答案 1 :(得分:1)

我认为Storyboard.Stop()应该在这里工作。但是如果你没有找到任何优雅的东西,你可以在隐藏窗口后尝试重置按钮的变换。 E.g:

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

希望我在施法时没有犯任何错误。

注意:您也可以在MSDN中找到有用的示例:How to: Control a Storyboard After It Starts