如何爲ListBox的滾動設置動畫效果?我知道我可以使用scrollIntoView,但我怎麼能動畫它?我想按箭頭鍵從一個listBoxItem移動到另一個。滾動動畫
Q
滾動動畫
5
A
回答
7
這是基於同樣的方法,因爲下面的鏈接
http://aniscrollviewer.codeplex.com/
的VerticalOffset
屬性爲只讀,因此,你可以在ScrollViewer
這又確實ScrollToVerticalOffset
使用附加屬性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
看看這article,它解釋瞭如何動畫滾動和添加觸摸手勢。在頁面底部下載源代碼並查看WpfScrollContent解決方案。我將擴展WPF列表框並將滾動動畫添加到它,以便您可以重新使用該控件。
相關問題
- 1. 動畫滾動
- 2. 動畫UIScrollView滾動
- 3. 滾動到動畫
- 4. jQuery動畫滾動
- 5. 滾動到動畫
- 6. jquery動畫滾動
- 7. jQuery動畫滾動
- 8. Chart.js動畫滾動
- 9. 動畫JavaScript滾動
- 10. 滾動型動畫
- 11. Android:WebView滾動動畫
- 12. sjquery滾動+動畫
- 13. 動畫值滾動
- 14. 動畫與滾動
- 15. 動畫DataGrid自動滾動
- 16. 動畫滾動div與溢出滾動
- 17. 在滾動條中動畫滾動
- 18. Jquery - IE滾動中的動畫動畫
- 19. 動畫向右滾動向下滾動並向左滾動動畫
- 20. 畫布滾動
- 21. 滾動/滾動條鎖定後滾動動畫
- 22. 滾動時UITableViewCell動畫
- 23. UIScrollViewDelegate不滾動動畫
- 24. 滾動時的Android動畫
- 25. 動畫開始時滾動
- 26. 動畫滾動很buggy
- 27. 滾動時動畫漸變
- 28. 在UIPickerView上滾動動畫
- 29. 動畫翻譯滾動
- 30. jQuery動畫與滾動
如果我想水平滾動,animation.to的值是多少? – Cobold
代碼中可能有錯誤: 'scrollViewer.ScrollableHeight *((double)index/itemsControl.Items.Count); ' 應該是 'scrollViewer.ScrollableHeight *((double)index /(itemsControl.Items.Count -1)); ' 例如,如果列表中包含12個元素,我想滾動到最後一個(指數11),其結果有可能成爲 'scrollViewer.ScrollableHeight * 1' 也由零提防師: ) – sim1
@ sim1:很久沒有看過這個,所以我相信你是對的。感謝您的更新:) –