LoadingBase.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. using System.Windows;
  2. using System.Windows.Controls;
  3. using System.Windows.Data;
  4. using System.Windows.Media;
  5. using System.Windows.Media.Animation;
  6. using System.Windows.Shapes;
  7. using HandyControl.Data;
  8. namespace HandyControl.Controls;
  9. public abstract class LoadingBase : ContentControl
  10. {
  11. protected Storyboard Storyboard;
  12. public static readonly DependencyProperty IsRunningProperty = DependencyProperty.Register(
  13. nameof(IsRunning), typeof(bool), typeof(LoadingBase), new PropertyMetadata(ValueBoxes.TrueBox, (o, args) =>
  14. {
  15. var ctl = (LoadingBase) o;
  16. var v = (bool) args.NewValue;
  17. if (v)
  18. {
  19. ctl.Storyboard?.Resume();
  20. }
  21. else
  22. {
  23. ctl.Storyboard?.Pause();
  24. }
  25. }));
  26. public bool IsRunning
  27. {
  28. get => (bool) GetValue(IsRunningProperty);
  29. set => SetValue(IsRunningProperty, ValueBoxes.BooleanBox(value));
  30. }
  31. public static readonly DependencyProperty DotCountProperty = DependencyProperty.Register(
  32. nameof(DotCount), typeof(int), typeof(LoadingBase),
  33. new FrameworkPropertyMetadata(ValueBoxes.Int5Box, FrameworkPropertyMetadataOptions.AffectsRender));
  34. public static readonly DependencyProperty DotIntervalProperty = DependencyProperty.Register(
  35. nameof(DotInterval), typeof(double), typeof(LoadingBase),
  36. new FrameworkPropertyMetadata(ValueBoxes.Double10Box, FrameworkPropertyMetadataOptions.AffectsRender));
  37. public static readonly DependencyProperty DotBorderBrushProperty = DependencyProperty.Register(
  38. nameof(DotBorderBrush), typeof(Brush), typeof(LoadingBase),
  39. new FrameworkPropertyMetadata(default(Brush), FrameworkPropertyMetadataOptions.AffectsRender));
  40. public static readonly DependencyProperty DotBorderThicknessProperty = DependencyProperty.Register(
  41. nameof(DotBorderThickness), typeof(double), typeof(LoadingBase),
  42. new FrameworkPropertyMetadata(ValueBoxes.Double0Box, FrameworkPropertyMetadataOptions.AffectsRender));
  43. public static readonly DependencyProperty DotDiameterProperty = DependencyProperty.Register(
  44. nameof(DotDiameter), typeof(double), typeof(LoadingBase),
  45. new FrameworkPropertyMetadata(6.0, FrameworkPropertyMetadataOptions.AffectsRender));
  46. public static readonly DependencyProperty DotSpeedProperty = DependencyProperty.Register(
  47. nameof(DotSpeed), typeof(double), typeof(LoadingBase),
  48. new FrameworkPropertyMetadata(4.0, FrameworkPropertyMetadataOptions.AffectsRender));
  49. public static readonly DependencyProperty DotDelayTimeProperty = DependencyProperty.Register(
  50. nameof(DotDelayTime), typeof(double), typeof(LoadingBase),
  51. new FrameworkPropertyMetadata(80.0, FrameworkPropertyMetadataOptions.AffectsRender));
  52. protected readonly Canvas PrivateCanvas = new()
  53. {
  54. ClipToBounds = true
  55. };
  56. protected LoadingBase()
  57. {
  58. Content = PrivateCanvas;
  59. }
  60. public int DotCount
  61. {
  62. get => (int) GetValue(DotCountProperty);
  63. set => SetValue(DotCountProperty, value);
  64. }
  65. public double DotInterval
  66. {
  67. get => (double) GetValue(DotIntervalProperty);
  68. set => SetValue(DotIntervalProperty, value);
  69. }
  70. public Brush DotBorderBrush
  71. {
  72. get => (Brush) GetValue(DotBorderBrushProperty);
  73. set => SetValue(DotBorderBrushProperty, value);
  74. }
  75. public double DotBorderThickness
  76. {
  77. get => (double) GetValue(DotBorderThicknessProperty);
  78. set => SetValue(DotBorderThicknessProperty, value);
  79. }
  80. public double DotDiameter
  81. {
  82. get => (double) GetValue(DotDiameterProperty);
  83. set => SetValue(DotDiameterProperty, value);
  84. }
  85. public double DotSpeed
  86. {
  87. get => (double) GetValue(DotSpeedProperty);
  88. set => SetValue(DotSpeedProperty, value);
  89. }
  90. public double DotDelayTime
  91. {
  92. get => (double) GetValue(DotDelayTimeProperty);
  93. set => SetValue(DotDelayTimeProperty, value);
  94. }
  95. protected abstract void UpdateDots();
  96. protected override void OnRender(DrawingContext drawingContext)
  97. {
  98. base.OnRender(drawingContext);
  99. UpdateDots();
  100. }
  101. protected virtual Ellipse CreateEllipse(int index)
  102. {
  103. var ellipse = new Ellipse();
  104. ellipse.SetBinding(WidthProperty, new Binding(DotDiameterProperty.Name) { Source = this });
  105. ellipse.SetBinding(HeightProperty, new Binding(DotDiameterProperty.Name) { Source = this });
  106. ellipse.SetBinding(Shape.FillProperty, new Binding(ForegroundProperty.Name) { Source = this });
  107. ellipse.SetBinding(Shape.StrokeThicknessProperty, new Binding(DotBorderThicknessProperty.Name) { Source = this });
  108. ellipse.SetBinding(Shape.StrokeProperty, new Binding(DotBorderBrushProperty.Name) { Source = this });
  109. return ellipse;
  110. }
  111. }