2009-03-21 4 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)로 실행 한 이동을하고 있어요 방법,하지만 다른 상황이다. 기억 하듯이, 요소가 컨테이너에 어떻게 배치되었는지와 관련이 있습니다.

미안 죄송합니다. 도움을 더 드릴 수 없지만 약간의 도움이 될 것입니다.