2011-08-22 12 views
5

ListBoxのスクロールをどのようにアニメーション化できますか?私はscrollIntoViewを使用することができますが、どのように私はそれをアニメーションできますか?あるリストボックスアイテムから別のリストボックスアイテムに移動するには、矢印キーを押したいと思います。スクロールアニメーション

答えて

7

は、次のリンク
http://aniscrollviewer.codeplex.com/

と同じアプローチに基づいラフ実装ですVerticalOffsetプロパティは読み取り専用ですので、代わりにあなたが順番にScrollToVerticalOffsetを行いScrollViewerに添付プロパティVerticalOffsetを使用することができます。このアタッチされたプロパティはアニメ化できます。

ItemsControlの拡張方法を作成してAnimateScrollIntoViewとすることもできます。

この

listBox.AnimateScrollIntoView(yourItem); 

ScrollViewerBehavior

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

のようにそれを呼び出して、あなたはまた、0123のホールドを取得する必要がありますので、この

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

水平にスクロールしたい場合、animation.toの値は何ですか? – Cobold

+2

コードにエラーがある可能性があります。 'scrollViewer.ScrollableHeight *((double)index/itemsControl.Items.Count); ' は である必要があります。' scrollViewer.ScrollableHeight *((double)index /(itemsControl.Items.Count -1));リストには12個の要素が含まれていると私は最後の1(指数11)までスクロールしたい場合は、 '例えば は、結果はゼロによる除算の用心、 'も* 1 ' をscrollViewer.ScrollableHeightになることがあります。 ) – sim1

+0

@ sim1:これは長い間見ていないので、私はあなたが正しいと確信しています。アップデートありがとう: –

0

このarticleを見ると、スクロールアニメーションやタッチジェスチャーのアニメーションの仕組みが説明されています。ページの下部にあるソースをダウンロードし、WpfScrollContentソリューションを確認します。 WPFリストボックスを拡張してスクロールアニメーションを追加すると、コントロールを再利用できます。ここで

+1

壊れたリンクが必要になります.... – patrickbadley

+0

2年以上も前に投稿...リンクだけを含んでいない回答は落胆している正確な理由です – evanb

+1

@evanb。 –

関連する問題