AxisCanvas.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. using System;
  2. using System.Globalization;
  3. using System.Threading;
  4. using System.Windows;
  5. using System.Windows.Controls;
  6. using System.Windows.Media;
  7. using System.Windows.Media.Animation;
  8. namespace Aitex.Sorter.UI.Controls.Common
  9. {
  10. public class AxisCanvas : Canvas
  11. {
  12. public static readonly DependencyProperty AxisLeftProperty;
  13. static AxisCanvas()
  14. {
  15. DefaultStyleKeyProperty.OverrideMetadata(typeof(AxisCanvas), new FrameworkPropertyMetadata(typeof(AxisCanvas)));
  16. AxisLeftProperty = DependencyProperty.Register("AxisLeft", typeof(int), typeof(AxisCanvas), new UIPropertyMetadata(8));
  17. }
  18. public int AxisLeft
  19. {
  20. get
  21. {
  22. return (int)GetValue(AxisLeftProperty);
  23. }
  24. set
  25. {
  26. SetValue(AxisLeftProperty, value);
  27. }
  28. }
  29. //protected override void OnRender(DrawingContext dc)
  30. //{
  31. // base.OnRender(dc);
  32. // var text = new FormattedText(
  33. //CurrentAngle.ToString(),
  34. //CultureInfo.GetCultureInfo("en-us"),
  35. //FlowDirection.LeftToRight,
  36. //new Typeface("Verdana"),
  37. //14,
  38. //Brushes.Black);
  39. // dc.DrawText(text, new Point(AxisLeft, 60));
  40. //}
  41. public double CurrentAngle
  42. {
  43. get
  44. {
  45. if (RenderTransform is RotateTransform)
  46. {
  47. return (RenderTransform as RotateTransform).Angle;
  48. }
  49. return 0;
  50. }
  51. }
  52. public void Rotate(int angle, bool absolute = true, int ms = 0, double accelerationRatio = 0, double decelerationRatio = 0, Action onComplete = null)
  53. {
  54. var oldAngle = 0d;
  55. if (RenderTransform is RotateTransform)
  56. {
  57. oldAngle = (RenderTransform as RotateTransform).Angle;
  58. }
  59. var newAngle = absolute ? angle : oldAngle + angle;
  60. var leftPoint = new Point(AxisLeft, Height / 2);
  61. if (ms <= 0)
  62. {
  63. RenderTransform = new RotateTransform(newAngle, leftPoint.X, leftPoint.Y);
  64. InvalidateVisual();
  65. }
  66. else
  67. {
  68. var storyBoard = new Storyboard();
  69. var rotateTransform = new RotateTransform();
  70. rotateTransform.CenterX = leftPoint.X;
  71. rotateTransform.CenterY = leftPoint.Y;
  72. RenderTransform = rotateTransform;
  73. var animation = new DoubleAnimation(oldAngle, newAngle, TimeSpan.FromMilliseconds(ms));
  74. animation.AccelerationRatio = accelerationRatio;
  75. animation.DecelerationRatio = decelerationRatio;
  76. storyBoard.Children.Add(animation);
  77. Storyboard.SetTarget(animation, this);
  78. Storyboard.SetTargetProperty(animation, new PropertyPath("RenderTransform.Angle"));
  79. storyBoard.Completed += (s, e) =>
  80. {
  81. InvalidateVisual();
  82. if (onComplete != null)
  83. {
  84. onComplete();
  85. }
  86. };
  87. storyBoard.Begin();
  88. }
  89. }
  90. }
  91. }