Canvas.GetTop(), возвращающий NaN
У меня есть холст с несколькими элементами 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 ответа
Кажется, общее согласие Canvas.GetTop(x)
возвращает 'Nan', если значение не установлено явно (даже если я его установил явно, я все еще иногда получаю этот результат).
Альтернативный метод, который я сейчас использую,
Vector offset = VisualTreeHelper.GetOffset(fElement);
который возвращает позицию fElement в своем контейнере.
Я столкнулся с похожей ситуацией (NaN), но в другом контексте. Насколько я помню, это было связано с тем, как элемент был расположен в контейнере.
Извините, я не смог предоставить больше помощи, но, возможно, это послужит некоторым руководством.
Проверьте свой файл xaml в макете свойств, убедитесь, что значение left или top показывает только число, но не смешивает (автоматически). Пример: Top 123(авто), это привело к тому, что Canvas.GetTop вернет NaN.