2009-03-21 10 views
9

私はいくつかのUIElementsを持つCanvasを持っています。上と下のプロパティをアニメーション化してキャンバス上で移動した後、時々、Canvas.GetTopの呼び出しによってNaNが返されます。Canvas.GetTop()NaNを返す

私はアニメーションを正しく閉じていませんか?ここで

は私が

private void InternalMove(double durationMS, FrameworkElement fElement, Point point, EventHandler callback) 
{ 
    _moveElement = fElement; 
    _destination = point; 

    Duration duration = new Duration(TimeSpan.FromMilliseconds(durationMS)); 

    DoubleAnimation moveLeftAnimation = new DoubleAnimation(Canvas.GetLeft(fElement), point.X, duration, FillBehavior.Stop); 
    Storyboard.SetTargetProperty(moveLeftAnimation, new PropertyPath("(Canvas.Left)")); 

    DoubleAnimation moveTopAnimation = new DoubleAnimation(Canvas.GetTop(fElement), point.Y, duration, FillBehavior.Stop); 
    Storyboard.SetTargetProperty(moveTopAnimation, new PropertyPath("(Canvas.Top)")); 

    // Create a storyboard to contain the animation. 
    _moveStoryboard = new Storyboard(); 
    if (callback != null) _moveStoryboard.Completed += callback; 

    _moveStoryboard.Completed += new EventHandler(s1_Completed); 
    _moveStoryboard.Children.Add(moveLeftAnimation); 
    _moveStoryboard.Children.Add(moveTopAnimation); 
    _moveStoryboard.FillBehavior = FillBehavior.Stop; 
    _moveStoryboard.Begin(fElement); 
} 

private void s1_Completed(object sender, EventArgs e) 
{ 
    if (_moveStoryboard != null) 
    { 
     _moveStoryboard.BeginAnimation(Canvas.LeftProperty, null, HandoffBehavior.Compose); 
     _moveStoryboard.BeginAnimation(Canvas.TopProperty, null, HandoffBehavior.Compose); 
    } 

    Canvas.SetLeft(_moveElement, _destination.X); 
    Canvas.SetTop(_moveElement, _destination.Y); 
} 

おかげ

答えて

14

Canvas.GetTop(x)は、値が明示的に設定されていない場合でも(私は明示的にそれを設定していますが、その結果を得ることもあります)、「Nan」を返します。

私が今使っている別の方法は、それのコンテナ内fElementの位置を返します

Vector offset = VisualTreeHelper.GetOffset(fElement); 

です。

+0

誤って下向き矢印が最初に表示されます。さて私は正直なダニを与えることを意図したものに戻ります。 – Jim

1

私は似たような状況(NaNで)に実行した動きをやっている方法ですが、別のコンテキストインチ私が思い出しているように、それは要素がコンテナ内にどのように配置されたかと関係があります。

申し訳ありません申し訳ありませんが、より多くのヘルプを提供できませんでしたが、これはいくつかのガイダンスを提供します。

関連する問題