1 //----------------------------------------------------------------
2 // Copyright (c) Microsoft Corporation. All rights reserved.
3 //----------------------------------------------------------------
5 namespace System.Activities.Presentation.View
9 using System.Windows.Media;
10 using System.Windows.Controls;
11 using System.Windows.Input;
13 internal static class AutoScrollHelper
15 const int scrollBuffer = 30;
17 public static void AutoScroll(MouseEventArgs e, DependencyObject element, double offsetPerScroll)
19 FrameworkElement logicalView = element as FrameworkElement;
20 while (element != null)
22 element = VisualTreeHelper.GetParent(element);
23 if (element != null && element is ScrollViewer)
28 ScrollViewer scrollViewer = element as ScrollViewer;
29 if (scrollViewer != null)
31 AutoScroll(e.GetPosition(scrollViewer), scrollViewer, logicalView != null ? e.GetPosition(logicalView) : (Point?)null, logicalView,
32 25, 25, offsetPerScroll);
36 public static void AutoScroll(DragEventArgs e, ScrollViewer scrollViewer, double offsetPerScroll)
38 AutoScroll(e.GetPosition(scrollViewer), scrollViewer, offsetPerScroll);
41 public static void AutoScroll(Point position, ScrollViewer scrollViewer, double offsetPerScroll)
43 AutoScroll(position, scrollViewer, null, null,
44 50, 50, offsetPerScroll);
47 static void AutoScroll(Point positionInScrollViewer, ScrollViewer scrollViewer, Point? positionInLogicalView, FrameworkElement logicalView, double scrollOnDragThresholdX, double scrollOnDragThresholdY, double scrollOnDragOffset)
49 double scrollViewerWidth = scrollViewer.ActualWidth;
50 double scrollViewerHeight = scrollViewer.ActualHeight;
52 double logicalViewWidth = 0;
53 double logicalViewHeight = 0;
54 if (logicalView != null)
56 logicalViewWidth = logicalView.ActualWidth;
57 logicalViewHeight = logicalView.ActualHeight;
60 double heightToScroll = 0;
61 double widthToScroll = 0;
63 if (positionInScrollViewer.X > (scrollViewerWidth - scrollOnDragThresholdX)
64 && (positionInLogicalView == null
65 || positionInLogicalView.Value.X < (logicalViewWidth - scrollBuffer)))
67 widthToScroll = scrollOnDragOffset;
69 else if (positionInScrollViewer.X < scrollOnDragThresholdX
70 && (positionInLogicalView == null
71 || positionInLogicalView.Value.X > scrollBuffer))
73 widthToScroll = -scrollOnDragOffset;
76 if (positionInScrollViewer.Y > (scrollViewerHeight - scrollOnDragThresholdY)
77 && (positionInLogicalView == null
78 || positionInLogicalView.Value.Y < logicalViewHeight - scrollBuffer))
80 heightToScroll = scrollOnDragOffset;
82 else if (positionInScrollViewer.Y < scrollOnDragThresholdY
83 && (positionInLogicalView == null
84 || positionInLogicalView.Value.Y > scrollBuffer))
86 heightToScroll = -scrollOnDragOffset;
89 if (widthToScroll != 0 || heightToScroll != 0)
91 scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset + heightToScroll);
92 scrollViewer.ScrollToHorizontalOffset(scrollViewer.HorizontalOffset + widthToScroll);