1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
| public static class ScrollHelper
{
private static Dictionary<string, List<ScrollViewer>> _scrollViewers = new Dictionary<string,List<ScrollViewer>>();
public static string GetScrollGroup(ScrollViewer scrollViewer)
{
return (string)scrollViewer.GetValue(ScrollGroupProperty);
}
public static void SetScrollGroup(ScrollViewer scrollViewer, string value)
{
scrollViewer.SetValue(ScrollGroupProperty, value);
}
// Using a DependencyProperty as the backing store for ScrollGroup. This enables animation, styling, binding, etc...
public static readonly DependencyProperty ScrollGroupProperty =
DependencyProperty.RegisterAttached("ScrollGroup", typeof(string), typeof(ScrollHelper), new UIPropertyMetadata(null, ScrollGroupChanged));
private static void ScrollGroupChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
{
ScrollViewer scv = o as ScrollViewer;
if (o != null)
{
string oldGroup = e.OldValue as string;
string newGroup = e.NewValue as string;
if (oldGroup != null)
{
List<ScrollViewer> groupMembers = null;
if (_scrollViewers.TryGetValue(oldGroup, out groupMembers))
{
groupMembers.Remove(scv);
}
scv.RemoveHandler(ScrollBar.ScrollEvent, _scrollHandler);
}
if (newGroup != null)
{
List<ScrollViewer> groupMembers = null;
if (!_scrollViewers.TryGetValue(newGroup, out groupMembers))
{
groupMembers = new List<ScrollViewer>();
_scrollViewers.Add(newGroup, groupMembers);
}
groupMembers.Add(scv);
scv.AddHandler(ScrollBar.ScrollEvent, _scrollHandler);
}
}
}
private static ScrollEventHandler _scrollHandler = new ScrollEventHandler(scv_Scroll);
private static void scv_Scroll(object sender, ScrollEventArgs e)
{
ScrollViewer scv = sender as ScrollViewer;
ScrollBar scb = e.OriginalSource as ScrollBar;
if (scv != null && scb != null)
{
string group = GetScrollGroup(scv);
if (group != null)
{
List<ScrollViewer> groupMembers = null;
if (_scrollViewers.TryGetValue(group, out groupMembers))
{
foreach (var s in groupMembers)
{
if (object.ReferenceEquals(s, scv))
continue;
if (scb.Orientation == Orientation.Horizontal)
{
s.ScrollToHorizontalOffset(e.NewValue);
}
else
{
s.ScrollToVerticalOffset(e.NewValue);
}
}
}
}
}
}
} |
Partager