2011-08-22 24 views
5

ListBox için kaydırmayı nasıl canlandırabilirim? ScrollIntoView uygulamasını kullanabileceğimi biliyorum, ancak bunu nasıl canlandırabilirim? Bir listBoxItem diğerine taşımak için ok tuşlarına basmak istiyorum.Kaydırma animasyonu

cevap

7

İşte VerticalOffset mülkiyet salt okunur böylece yerine sırayla ScrollToVerticalOffset yapar ScrollViewer üzerine iliştirilmiş bir özellik VerticalOffset kullanabileceğiniz aşağıdaki linke
http://aniscrollviewer.codeplex.com/

aynı yaklaşımına dayalı kaba bir uygulamasıdır. Bu ekli özellik animasyonlu olabilir.

AnimateScrollIntoView adı verilen ItemsControl için bir uzantı yöntemi de oluşturabilirsiniz. Bu

listBox.AnimateScrollIntoView(yourItem); 

ScrollViewerBehavior

gibi

Çağrı bunu

public class ScrollViewerBehavior 
{ 
    public static DependencyProperty VerticalOffsetProperty = 
     DependencyProperty.RegisterAttached("VerticalOffset", 
              typeof(double), 
              typeof(ScrollViewerBehavior), 
              new UIPropertyMetadata(0.0, OnVerticalOffsetChanged)); 

    public static void SetVerticalOffset(FrameworkElement target, double value) 
    { 
     target.SetValue(VerticalOffsetProperty, value); 
    } 
    public static double GetVerticalOffset(FrameworkElement target) 
    { 
     return (double)target.GetValue(VerticalOffsetProperty); 
    } 
    private static void OnVerticalOffsetChanged(DependencyObject target, DependencyPropertyChangedEventArgs e) 
    { 
     ScrollViewer scrollViewer = target as ScrollViewer; 
     if (scrollViewer != null) 
     { 
      scrollViewer.ScrollToVerticalOffset((double)e.NewValue); 
     } 
    } 
} 

ItemsControlExtensions

public static class ItemsControlExtensions 
{ 
    public static void AnimateScrollIntoView(this ItemsControl itemsControl, object item) 
    { 
     ScrollViewer scrollViewer = VisualTreeHelpers.GetVisualChild<ScrollViewer>(itemsControl); 

     UIElement container = itemsControl.ItemContainerGenerator.ContainerFromItem(item) as UIElement; 
     int index = itemsControl.ItemContainerGenerator.IndexFromContainer(container); 
     double toValue = scrollViewer.ScrollableHeight * ((double)index/itemsControl.Items.Count); 
     Point relativePoint = container.TranslatePoint(new Point(0.0, 0.0), Window.GetWindow(container)); 

     DoubleAnimation verticalAnimation = new DoubleAnimation(); 
     verticalAnimation.From = scrollViewer.VerticalOffset; 
     verticalAnimation.To = toValue; 
     verticalAnimation.DecelerationRatio = .2; 
     verticalAnimation.Duration = new Duration(TimeSpan.FromMilliseconds(1000)); 
     Storyboard storyboard = new Storyboard(); 
     storyboard.Children.Add(verticalAnimation); 
     Storyboard.SetTarget(verticalAnimation, scrollViewer); 
     Storyboard.SetTargetProperty(verticalAnimation, new PropertyPath(ScrollViewerBehavior.VerticalOffsetProperty)); 
     storyboard.Begin(); 
    } 
} 

Ve ayrıcabir tutun almak gerekir çünküsen .... bu

public static class VisualTreeHelpers 
{ 
    public static T GetVisualChild<T>(DependencyObject parent) where T : Visual 
    { 
     T child = default(T); 

     int numVisuals = VisualTreeHelper.GetChildrenCount(parent); 
     for (int i = 0; i < numVisuals; i++) 
     { 
      Visual v = (Visual)VisualTreeHelper.GetChild(parent, i); 
      child = v as T; 
      if (child == null) 
      { 
       child = GetVisualChild<T>(v); 
      } 
      if (child != null) 
      { 
       break; 
      } 
     } 
     return child; 
    } 
} 
+0

Yatay olarak kaydırmak istersem, anim.to değeri ne olurdu? – Cobold

+2

Kodda bir hata olabilir: 'scrollViewer.ScrollableHeight * ((çift) index/itemsControl.Items.Count); 'scrollViewer.ScrollableHeight * ((double) index/(itemsControl.Items.Count -1)); Liste 12 elementleri içerir ve ben sonuncusu (endeks 11) ilerleyin istiyorsanız ' örneğin, sonuç haline gelmeli ' scrollViewer.ScrollableHeight * 1' da, sıfıra bölme dikkat : – sim1

+0

@ sim1: Uzun süredir buna bakmadığınızdan eminim ki haklısınız. Güncelleme için teşekkürler :) –

0

Bu article belgesine bir bakın, animasyonun nasıl hareket edeceğini ve dokunma hareketlerini nasıl ekleyeceğini açıklar. Kaynağı sayfanın en altında indirin ve WpfScrollContent çözümüne bakın. WPF ListBox'u genişletirim ve kaydırma animasyonunu, kontrolü yeniden kullanabileceğiniz şekilde eklerdim.

+1

kırık link gerekir – patrickbadley

+0

yayınlanmıştır 2 yıl önce ... linkleri başka bir şey içermeyen cevaplar cesaretini neden tam da – evanb

+1

@evanb. –