2011-08-22 20 views
5

मैं ListBox के लिए स्क्रॉलिंग को कैसे एनिमेट कर सकता हूं? मुझे पता है कि मैं scrollIntoView का उपयोग कर सकता हूं लेकिन मैं इसे कैसे एनिमेट कर सकता हूं? मैं एक सूची बॉक्स Item से दूसरे में स्थानांतरित करने के लिए तीर कुंजियों को दबा देना चाहता हूं।स्क्रॉल एनीमेशन

उत्तर

7

यहाँ एक किसी न किसी तरह कार्यान्वयन नीचे दिए गए लिंक
http://aniscrollviewer.codeplex.com/

VerticalOffset संपत्ति केवल पढ़ने के लिए है, ताकि इसके बजाय आप ScrollViewer जो बारी में ScrollToVerticalOffset करता है पर एक संलग्न संपत्ति VerticalOffset उपयोग कर सकते हैं के रूप में ही दृष्टिकोण पर आधारित है। यह संलग्न संपत्ति एनिमेटेड हो सकती है।

आप ItemsControlAnimateScrollIntoView नामक एक एक्सटेंशन विधि भी बना सकते हैं।

यह इस

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

और चूंकि आप भीपर भी नियंत्रण प्राप्त करने की जरूरत हैआप .... इस

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

अगर मैं क्षैतिज स्क्रॉल करना चाहता हूं तो एनीमेशन क्या होगा? – Cobold

+2

कोड में कोई त्रुटि हो सकती है: 'scrollViewer.ScrollableHeight * ((डबल) अनुक्रमणिका/आइटम नियंत्रण। ITems.Count); ' 'scrollViewer.ScrollableHeight * ((डबल) अनुक्रमणिका/(itemsControl.Items.Count -1) होना चाहिए; ' उदाहरण के लिए, यदि सूची 12 तत्व शामिल हैं और मैं पिछले एक (सूचकांक 11) करने के लिए स्क्रॉल करना चाहते हैं, परिणाम बनना पड़ता है ' scrollViewer.ScrollableHeight * 1' भी शून्य से भाग से सावधान:) – sim1

+0

@ sim1: इसे लंबे समय तक नहीं देखा है, इसलिए मुझे यकीन है कि आप सही हैं। अद्यतन के लिए धन्यवाद :) –

0

इस article पर एक नज़र डालें, यह बताता है कि कैसे स्क्रॉलिंग एनिमेट करें और टच जेस्चर जोड़ें। पृष्ठ के निचले हिस्से में स्रोत डाउनलोड करें और WpfScrollContent समाधान देखें। मैं डब्ल्यूपीएफ लिस्टबॉक्स का विस्तार करूंगा और उस पर स्क्रॉल एनीमेशन जोड़ूंगा जिससे आप नियंत्रण का पुन: उपयोग कर सकें।

+1

टूटा हुआ लिंक की आवश्यकता होगी साल – patrickbadley

+0

पोस्ट पर 2 पहले ... – evanb

+1

@evanb जो यही कारण है कि जवाब है कि लेकिन लिंक कुछ भी नहीं होते हैं हतोत्साहित किया जाता है। –

संबंधित मुद्दे