ストーリーボードを削除しますが、アニメーション値を保持しますか?

StackOverflow https://stackoverflow.com/questions/1684162

質問

XAMLでストーリーボードを削除するにはどうすればよいですか(つまり、DataTriggerでのRemovestoryBoardアクション)が、アニメーション化された値を保持します。に似ています Animatable.beginanimation:

アニメーションのBegintimeがnullの場合、現在のアニメーションが削除され、プロパティの現在の値が保持されます。

役に立ちましたか?

解決

Removestoryboardの主な用途は、アニメーション値を削除し、アニメーションされていない状態に戻すことです。ほとんどの場合、特定のケースに応じて、代わりにPauseStoryboardまたはStopStoryboardに通話を切り替えることができます。唯一の例外は、ストーリーボードが保有するリソースを解放するか、別の目的に使用する必要がある場合です。

ストーリーボードを本当に削除してプロパティ値を保持したい場合は、アニメーション値をプロパティに直接設定する必要があります。これは、各値をアニメーション値に設定することで実行できます。

void CopyAnimatedValuesToLocalValues(DependencyObject obj)
{
  // Recurse down tree
  for(int i=0; i<VisualTreeHelper.GetChildrenCount(obj); i++)
    CopyAnimatedValuesToLocalValues(VisualTreeHelper.GetChild(obj, i));

  var enumerator = obj.GetLocalValueEnumerator();
  while(enumerator.MoveNext())
  {
    var prop = enumerator.Current.Property;
    var value = enumerator.Current.Value as Freezable;

    // Recurse into eg. brushes that may be set by storyboard, as long as they aren't frozen
    if(value!=null && !value.IsFrozen)
      CopyAnimatedValuesToLocalValues(value);

    // *** This is the key bit of code ***
    if(DependencyPropertyHelper.GetValueSource(obj, prop).IsAnimated)
      obj.SetValue(prop, obj.GetValue(prop));

  }
}

ストーリーボードを削除してアニメーション値をコピーする直前にこれを呼び出してください。

編集 begintime = nullでの発生を呼び出すことは同様の効果を達成するため、このコードは不要である可能性があるというコメントがなされました。

begintime = nullでのbeginanimationにより、値がローカルにコピーされているように見えるのは事実ですが、後のremovestoryboardへの呼び出しにより、値が戻ります。これは、Begintime = nullでの開始により、以前のアニメーションが新しいアニメーションの開始を保留するまでの値を保持するが、ローカルの価値に影響を与えることは何もないためです。

上記のコードは実際にローカル値を上書きするため、すべてのアニメーションを削除でき、オブジェクトにはまだ新しい値があります。したがって、本当にremovestoryboardに電話をかけたい場合は、値を保持したい場合は、上に書いたコードなどが必要です。

他のヒント

使用する際にも同様の問題がありました AnimationTimeline. 。最も簡単な解決策は、キャプチャすることであることが判明しました Completed コードのイベント背後および呼び出し前 BeginAnimation とともに null パラメーターアニメーションを削除し、プロパティの現在の値を取得し、それを使用して設定します。

これは最後のアニメーション値を取得し、設定します。

void OnCompleted( object sender, EventArgs args )
{
    // Required to copy latest animated value to local value.
    o.SomeValue = o.SomeValue;
    o.BeginAnimation( SomeClass.SomeValueProperty, null );
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top