AutoScrollDecorator.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Windows;
  6. using System.Windows.Controls;
  7. using System.Windows.Input;
  8. namespace Aga.Diagrams
  9. {
  10. public static class AutoScrollDecorator
  11. {
  12. public static readonly DependencyProperty IsEnabledProperty =
  13. DependencyProperty.RegisterAttached(
  14. "IsEnabled",
  15. typeof(bool),
  16. typeof(AutoScrollDecorator), new PropertyMetadata(false, IsEnabledValueChanged));
  17. public static void SetIsEnabled(DependencyObject element, bool value)
  18. {
  19. element.SetValue(IsEnabledProperty, value);
  20. }
  21. public static bool GetIsEnabled(DependencyObject element)
  22. {
  23. return (bool)element.GetValue(IsEnabledProperty);
  24. }
  25. public static readonly DependencyProperty SensivityProperty =
  26. DependencyProperty.RegisterAttached(
  27. "Sensivity",
  28. typeof(double),
  29. typeof(AutoScrollDecorator), new PropertyMetadata(20.0));
  30. public static void SetSensivity(DependencyObject element, double value)
  31. {
  32. element.SetValue(SensivityProperty, value);
  33. }
  34. public static double GetSensivity(DependencyObject element)
  35. {
  36. return (double)element.GetValue(SensivityProperty);
  37. }
  38. public static readonly DependencyProperty StepProperty =
  39. DependencyProperty.RegisterAttached(
  40. "Step",
  41. typeof(double),
  42. typeof(AutoScrollDecorator), new PropertyMetadata(16.0));
  43. public static void SetStep(DependencyObject element, double value)
  44. {
  45. element.SetValue(StepProperty, value);
  46. }
  47. public static double GetStep(DependencyObject element)
  48. {
  49. return (double)element.GetValue(StepProperty);
  50. }
  51. static void IsEnabledValueChanged(DependencyObject depObj, DependencyPropertyChangedEventArgs e)
  52. {
  53. var view = depObj as ScrollViewer;
  54. if (view != null && e.NewValue is bool)
  55. {
  56. if ((bool)e.NewValue)
  57. view.PreviewMouseMove += ViewPreviewMouseMove;
  58. else
  59. view.PreviewMouseMove -= ViewPreviewMouseMove;
  60. }
  61. }
  62. private static void ViewPreviewMouseMove(object sender, MouseEventArgs e)
  63. {
  64. var _scrollView = sender as ScrollViewer;
  65. if (_scrollView == null || !(_scrollView.Content is DependencyObject))
  66. return;
  67. if (!GetIsEnabled((DependencyObject)_scrollView.Content))
  68. return;
  69. var point = e.GetPosition(_scrollView);
  70. double sensivity = GetSensivity(_scrollView);
  71. double step = GetStep(_scrollView);
  72. double dx = 0;
  73. double dy = 0;
  74. if (point.X < sensivity)
  75. dx = -step;
  76. else if (point.X > _scrollView.ActualWidth - sensivity)
  77. dx = +step;
  78. if (point.Y < sensivity)
  79. dy = -step;
  80. else if (point.Y > _scrollView.ActualHeight - sensivity)
  81. dy = +step;
  82. _scrollView.ScrollToHorizontalOffset(_scrollView.HorizontalOffset + dx);
  83. _scrollView.ScrollToVerticalOffset(_scrollView.VerticalOffset + dy);
  84. }
  85. }
  86. }