|
public class ScrollAction : Behavior<FrameworkElement> { /// <summary> /// Attached될 FrameworkElement 의 AutomationPeer /// </summary> private AutomationPeer _peer { get; set; } /// <summary> /// ScrollProvider /// </summary> public IScrollProvider ScrollProvider { get { //AssociatedObject로 부터 peer를 구함 _peer = FrameworkElementAutomationPeer.FromElement(AssociatedObject); //만약에 없다면 하나 만들어줌 if (_peer == null) _peer = FrameworkElementAutomationPeer.CreatePeerForElement(AssociatedObject); //peer의 Scroll Pattern 을 구해서 반환 return _peer.GetPattern(PatternInterface.Scroll) as IScrollProvider; } } protected override void OnAttached() { base.OnAttached(); AssociatedObject.MouseWheel += new MouseWheelEventHandler(AssociatedObject_MouseWheel); } protected override void OnDetaching() { base.OnDetaching(); AssociatedObject.MouseWheel -= new MouseWheelEventHandler(AssociatedObject_MouseWheel); _peer = null; } void AssociatedObject_MouseWheel(object sender, MouseWheelEventArgs e) { if (e.Delta > 0) { //ScrollProvider로 Scroll처리 ScrollProvider.Scroll(ScrollAmount.NoAmount, ScrollAmount.SmallDecrement); } else { ScrollProvider.Scroll(ScrollAmount.NoAmount, ScrollAmount.SmallIncrement); } } |
하지만 단점은 위의 소스에서 보시는 것처런 Scroll 함수가 인자로 ScrollAmount를 받는데 이 enum타입은 딱 5가지 정도로 정해져 있기 때문에 세밀한 Scroll은 힘듭니다.
따라서 DataGrid와 같은 경우(내부적으로 ScrollViwer를 사용하지 않는경우)는 어쩔수 없이 위와 같은 꼼수를 통해서 사용 하지만 ScollViewer 를 사용하는 것들(ListBox등)은 ScollViwer용 Behavior(ScrollAmount를 따보 받을수 있게 Property를 빼주는)를 따로 만드셔서 ScrollViewer 자체에 붙여서 사용하시는게 좋을것 같습니다. :)