1

** 编辑问题 * *

Storyboard s = (Storyboard)TryFindResource("kupmove");
s.Stop();

这不会停止正在进行的动画,我该如何停止它?


如何在 Visual c# 中使用按钮单击事件开始情节提要?

这是我用来开始故事板的代码:

    Storyboard s = (Storyboard)TryFindResource("kupmove");
    Storyboard.SetTargetName(s, "geometryModel3D");
    s.Begin();

动画没有开始,我收到以下错误:

'Children' property value in the path '(0).(1)[2].(2)' points to immutable instance of 'System.Windows.Media.Media3D.Transform3DCollection'

这是我的 xaml 故事板:

<Storyboard x:Key="kupmove" 
            RepeatBehavior="Forever"
            AutoReverse="True">
  <Rotation3DAnimationUsingKeyFrames Storyboard.TargetProperty="(Model3D.Transform).(Transform3DGroup.Children)[2].(RotateTransform3D.Rotation)"
                                     Storyboard.TargetName="geometryModel3D">
    <EasingRotation3DKeyFrame KeyTime="0">
      <EasingRotation3DKeyFrame.EasingFunction>
        <CubicEase EasingMode="EaseInOut" />
      </EasingRotation3DKeyFrame.EasingFunction>
      <EasingRotation3DKeyFrame.Value>
        <AxisAngleRotation3D Axis="0,1,0"
                             Angle="0" />
      </EasingRotation3DKeyFrame.Value>
    </EasingRotation3DKeyFrame>
    <EasingRotation3DKeyFrame KeyTime="0:0:1">
      <EasingRotation3DKeyFrame.EasingFunction>
        <CubicEase EasingMode="EaseInOut" />
      </EasingRotation3DKeyFrame.EasingFunction>
      <EasingRotation3DKeyFrame.Value>
        <AxisAngleRotation3D Axis="0,1,0"
                             Angle="179" />
      </EasingRotation3DKeyFrame.Value>
    </EasingRotation3DKeyFrame>
    <EasingRotation3DKeyFrame KeyTime="0:0:2">
      <EasingRotation3DKeyFrame.EasingFunction>
        <CubicEase EasingMode="EaseInOut" />
      </EasingRotation3DKeyFrame.EasingFunction>
      <EasingRotation3DKeyFrame.Value>
        <AxisAngleRotation3D Axis="0,-1,0"
                             Angle="1" />
      </EasingRotation3DKeyFrame.Value>
    </EasingRotation3DKeyFrame>
    <EasingRotation3DKeyFrame KeyTime="0:0:3">
      <EasingRotation3DKeyFrame.EasingFunction>
        <CubicEase EasingMode="EaseInOut" />
      </EasingRotation3DKeyFrame.EasingFunction>
      <EasingRotation3DKeyFrame.Value>
        <AxisAngleRotation3D Axis="0.009,-0.014,1"
                             Angle="90.005" />
      </EasingRotation3DKeyFrame.Value>
    </EasingRotation3DKeyFrame>
  </Rotation3DAnimationUsingKeyFrames>


  <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(Model3D.Transform).(Transform3DGroup.Children)[4].(TranslateTransform3D.OffsetX)"
                                 Storyboard.TargetName="geometryModel3D">
    <EasingDoubleKeyFrame KeyTime="0:0:2"
                          Value="0">
      <EasingDoubleKeyFrame.EasingFunction>
        <CubicEase EasingMode="EaseInOut" />
      </EasingDoubleKeyFrame.EasingFunction>
    </EasingDoubleKeyFrame>
    <EasingDoubleKeyFrame KeyTime="0:0:3"
                          Value="0">
      <EasingDoubleKeyFrame.EasingFunction>
        <CubicEase EasingMode="EaseInOut" />
      </EasingDoubleKeyFrame.EasingFunction>
    </EasingDoubleKeyFrame>
  </DoubleAnimationUsingKeyFrames>

</Storyboard>

* 编辑 *

建议的解决方案不起作用,实际上我对触发情节提要的先前代码没有错误,它可以工作,但我认为因为已经有一个使用以下代码启动的动画,导致异常。告诉我一种在它已经运行时停止它的方法:

>    DoubleAnimation myAnimation = new DoubleAnimation();
>    myAnimation.From = 1;
>    myAnimation.To = 361;
>    myAnimation.Duration = new >Duration(TimeSpan.FromMilliseconds(1000));
>    myAnimation.RepeatBehavior = RepeatBehavior.Forever;
>    rotateTransform.Rotation.BeginAnimation(AxisAngleRotation3D.AngleProperty, myAnimation);
>    geometryModel3D.Transform = rotateTransform;

我想我必须先停止这个 -> geometryModel3D.Transform = rotateTransform; 因为我要触发的动画已经使用此代码运行。在使用 xaml 代码中声明的自己的参数重新启动我的故事板之前,我如何才能停止此操作。

使用 BeginAnimation 命令使用第二个参数空值停止 geometryModel3D.Transform,没有帮助。第一个异常仍然发生。

我认为问题从这里开始:

Storyboard s = (Storyboard)TryFindResource("kupmove");
s.Stop();

此命令不会停止正在进行的动画。所以一定有什么问题,这就是为什么 s.Begin() 还没有触发。

4

2 回答 2

1

use x:Name instead of x:Key and call the Begin() method on that storyboard instance.

于 2013-01-23T22:02:57.230 回答
0

不久前,一位绅士发布了一个我读到的答案,显示如下:

“尝试通过它的键调用情节提要,即不使用TryFindResource()

也许你可以尝试用它的实例化名称来调用它,kupmove

我只是读了这个,用户删除了他的答案。对不起,如果它没有帮助。

此外,正如另一位用户在上面发布的那样,使用x:Name而不是key, 为情节提要创建名称,然后使用该初始化名称调用它。

于 2013-01-23T22:02:41.507 回答