Canvas.GetTop (), возвращающий NaN - PullRequest
9 голосов
/ 21 марта 2009

У меня есть холст с несколькими элементами UIE. После того, как я переместил их на холст, анимируя свойства top и left, очень редко последующий вызов 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);
}

спасибо

Ответы [ 2 ]

15 голосов
/ 25 августа 2009

Похоже, что общее согласие состоит в том, что Canvas.GetTop(x) возвращает 'Nan', если значение не установлено явно (даже если я его установил явно, я все еще иногда получаю этот результат).

Альтернативный метод, который я сейчас использую, это

Vector offset = VisualTreeHelper.GetOffset(fElement);

, который возвращает позицию элемента в его контейнере.

1 голос
/ 23 марта 2009

Я столкнулся с подобной ситуацией (NaN), но в другом контексте. Насколько я помню, это было связано с тем, как элемент был расположен в контейнере.

Извините, я не смог предоставить больше помощи, но, возможно, это послужит некоторым руководством.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...