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 コマンドで 2 番目のパラメーター null 値を使用して geometryModel3D.Transform を停止しても、役に立ちませんでした。最初の例外は引き続き発生します。

問題はここから始まると思います:

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

このコマンドは進行中のアニメーションを停止しません。したがって、 s.Begin() がまだトリガーされていないのは、何か問題があるに違いありません。

4

2 に答える 2

1

x:Key の代わりに x:Name を使用し、そのストーリーボード インスタンスで Begin() メソッドを呼び出します。

于 2013-01-23T22:02:57.230 に答える
0

少し前に、紳士が私が読んだ回答を投稿しました。

"キーでストーリーボードを呼び出してみてください。つまり、TryFindResource()"

インスタンス化された名前で呼び出すことができるかもしれませんが、kupmove

私はこれを読んだだけで、ユーザーは自分の回答を削除しました。役に立たない場合は申し訳ありません。

また、別のユーザーが投稿したように、上記ではx:Nameなくを使用keyしてストーリーボードの名前を作成し、その初期化された名前を使用して呼び出します。

于 2013-01-23T22:02:41.507 に答える