Canvas.GetTop()返回NaN

时间:2009-03-21 10:09:04

标签: c# wpf

我有一个带有一些UIElements的Canvas。通过动画顶部和左侧属性将我们在画布上移动后,偶尔会调用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);
}

感谢

3 个答案:

答案 0 :(得分:15)

似乎普遍的共识是Canvas.GetTop(x)返回'Nan'如果值没有明确设置(即使我明确设置它,我仍然有时会得到那个结果)。

我现在使用的另一种方法是

Vector offset = VisualTreeHelper.GetOffset(fElement);

返回fElement在其容器中的位置。

答案 1 :(得分:1)

我遇到了类似的情况(NaN),但是在不同的背景下。我记得,它与元素在容器中的位置有关。

抱歉,我无法提供更多帮助,但也许这会提供一些指导。

答案 2 :(得分:0)

在“属性布局”中检查您的xaml文件,确保left或top的值仅显示数字而不显示混合(自动)。 例如:Top 123(自动),这导致Canvas.GetTop将返回NaN。