ストーリーボードを削除しますが、アニメーション値を保持しますか?
-
18-09-2019 - |
質問
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 );
}