DependencyProperty を値からターゲット値 (コード内) にアニメーション化しようとし、アニメーションが終了 (またはキャンセル) されたら、最終値をプロパティに設定します。最終値は、アニメーションが終了した場合は To 値、またはアニメーションがキャンセルされた場合は (アニメーションによって)現在計算された値のいずれかになります。
デフォルトでは、アニメーションにはこの動作がなく、アニメーションは完了しても実際の値を変更しません。
失敗した試み
少し前に、前述の動作を実現するためにこのヘルパー メソッドを作成しました。
static void AnimateWithAutoRemoveAnimationAndSetFinalValue(IAnimatable element,
DependencyProperty property,
AnimationTimeline animation)
{
var obj = element as DependencyObject;
if (obj == null)
throw new ArgumentException("element must be of type DependencyObject");
EventHandler handler = null;
handler = (sender, e) =>
{
var finalValue = obj.GetValue(property);
//remove the animation
element.BeginAnimation(property, null);
//reset the final value
obj.SetValue(property, finalValue);
animation.Completed -= handler;
};
animation.Completed += handler;
element.BeginAnimation(property, animation);
}
残念ながら、誰かが BeginAnimation(property,null ) を呼び出してアニメーションが削除された場合、Completed イベントは発生しないように見えるため、アニメーションがキャンセルされたときに最終値を正しく設定できません。さらに悪いことに、イベントハンドラーも削除できません...
誰かがこれをきれいな方法で行う方法を知っていますか?