2011-05-10 3 views
0

Um ... c'est à peu près tout. Comment puis-je animer une action ScrollIntoView dans Silverlight 4?Comment puis-je animer une action ScrollIntoView dans Silverlight 4?

: Edits

Je sais comment animer le défilement. Je crée juste mon propre DependencyProperty et fais défiler le ScrollViewer quand il change. Qu'est-ce que je dois faire, est de définir combien il devrait être changé? Comment puis-je calculer cela? Que fait réellement ScrollIntoView?

Répondre

1

De réflecteur:

public static void ScrollIntoView(this ScrollViewer viewer, FrameworkElement element, double horizontalMargin, double verticalMargin, Duration duration) 
{ 
    if (viewer == null) 
    { 
     throw new ArgumentNullException("viewer"); 
    } 
    if (element == null) 
    { 
     throw new ArgumentNullException("element"); 
    } 
    Rect? itemRect = element.GetBoundsRelativeTo(viewer); 
    if (itemRect.HasValue) 
    { 
     double verticalOffset = viewer.VerticalOffset; 
     double verticalDelta = 0.0; 
     double hostBottom = viewer.ViewportHeight; 
     double itemBottom = itemRect.Value.Bottom + verticalMargin; 
     if (hostBottom < itemBottom) 
     { 
      verticalDelta = itemBottom - hostBottom; 
      verticalOffset += verticalDelta; 
     } 
     double itemTop = itemRect.Value.Top - verticalMargin; 
     if ((itemTop - verticalDelta) < 0.0) 
     { 
      verticalOffset -= verticalDelta - itemTop; 
     } 
     double horizontalOffset = viewer.HorizontalOffset; 
     double horizontalDelta = 0.0; 
     double hostRight = viewer.ViewportWidth; 
     double itemRight = itemRect.Value.Right + horizontalMargin; 
     if (hostRight < itemRight) 
     { 
      horizontalDelta = itemRight - hostRight; 
      horizontalOffset += horizontalDelta; 
     } 
     double itemLeft = itemRect.Value.Left - horizontalMargin; 
     if ((itemLeft - horizontalDelta) < 0.0) 
     { 
      horizontalOffset -= horizontalDelta - itemLeft; 
     } 
     if (duration == TimeSpan.Zero) 
     { 
      viewer.ScrollToVerticalOffset(verticalOffset); 
      viewer.ScrollToHorizontalOffset(horizontalOffset); 
     } 
     else 
     { 
      Storyboard storyboard = new Storyboard(); 
      SetVerticalOffset(viewer, viewer.VerticalOffset); 
      SetHorizontalOffset(viewer, viewer.HorizontalOffset); 
      DoubleAnimation verticalOffsetAnimation = new DoubleAnimation { 
       To = new double?(verticalOffset), 
       Duration = duration 
      }; 
      DoubleAnimation horizontalOffsetAnimation = new DoubleAnimation { 
       To = new double?(verticalOffset), 
       Duration = duration 
      }; 
      Storyboard.SetTarget(verticalOffsetAnimation, viewer); 
      Storyboard.SetTarget(horizontalOffsetAnimation, viewer); 
      Storyboard.SetTargetProperty(horizontalOffsetAnimation, new PropertyPath(HorizontalOffsetProperty)); 
      Storyboard.SetTargetProperty(verticalOffsetAnimation, new PropertyPath(VerticalOffsetProperty)); 
      storyboard.Children.Add(verticalOffsetAnimation); 
      storyboard.Children.Add(horizontalOffsetAnimation); 
      storyboard.Begin(); 
     } 
    } 
} 
+0

réflecteur? C'est de la triche! * plaisante * – Jordan

+0

Ouais, je suis un idiot. ScrollIntoView est auto-animant. – Jordan

Questions connexes