2009-03-21 10 views
9

Mam płótno z kilkoma UIElements na. Po przeniesieniu ich na płótno, animując górne i lewe właściwości, bardzo rzadko wywołuję subtelne wywołanie Canvas.GetTop w NaN.Canvas.GetTop() wracając NaN

Czy nie "zamykam" animacji prawidłowo?

Oto jak robię ruch

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); 
} 

dzięki

Odpowiedz

14

Wygląda na to, że ogólny konsensus oznacza, że ​​Canvas.GetTop(x) zwraca "Nan", jeśli wartość nie jest wyraźnie ustawiona (nawet, jeśli ja jawnie ustawiam, że wciąż otrzymuję ten wynik).

Alternatywną metodą Obecnie używam jest

Vector offset = VisualTreeHelper.GetOffset(fElement); 

który zwraca pozycję fElement ciągu jest to kontener.

+0

Ups przypadkowo uderzył w strzałkę w dół! Teraz wracam do tego, co zamierzałem dać pozytywnemu kleszczowi. – Jim

1

Zabrakło mi w podobnej sytuacji (Nan), ale w innym kontekście. Jak pamiętam, miało to jakiś związek z rozmieszczeniem elementu w pojemniku.

Przykro mi, ale nie mogę podać więcej pomocy, ale może to zapewni pewne wskazówki.