WaveProgressBar.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. using System.Windows;
  2. using System.Windows.Controls.Primitives;
  3. using System.Windows.Media;
  4. using HandyControl.Data;
  5. using HandyControl.Expression.Drawing;
  6. namespace HandyControl.Controls;
  7. /// <summary>
  8. /// 波浪进度条
  9. /// </summary>
  10. [TemplatePart(Name = ElementWave, Type = typeof(FrameworkElement))]
  11. [TemplatePart(Name = ElementClip, Type = typeof(FrameworkElement))]
  12. public class WaveProgressBar : RangeBase
  13. {
  14. private const string ElementWave = "PART_Wave";
  15. private const string ElementClip = "PART_Clip";
  16. private FrameworkElement _waveElement;
  17. private const double TranslateTransformMinY = -20;
  18. private double _translateTransformYRange;
  19. private TranslateTransform _translateTransform;
  20. static WaveProgressBar()
  21. {
  22. FocusableProperty.OverrideMetadata(typeof(WaveProgressBar), new FrameworkPropertyMetadata(ValueBoxes.FalseBox));
  23. MaximumProperty.OverrideMetadata(typeof(WaveProgressBar), new FrameworkPropertyMetadata(ValueBoxes.Double100Box));
  24. }
  25. protected override void OnMinimumChanged(double oldMinimum, double newMinimum) => UpdateWave(Value);
  26. protected override void OnMaximumChanged(double oldMaximum, double newMaximum) => UpdateWave(Value);
  27. protected override void OnValueChanged(double oldValue, double newValue)
  28. {
  29. base.OnValueChanged(oldValue, newValue);
  30. UpdateWave(newValue);
  31. }
  32. private void UpdateWave(double value)
  33. {
  34. if (_translateTransform == null || MathHelper.IsVerySmall(Maximum)) return;
  35. var scale = 1 - value / Maximum;
  36. var y = _translateTransformYRange * scale + TranslateTransformMinY;
  37. _translateTransform.Y = y;
  38. }
  39. public override void OnApplyTemplate()
  40. {
  41. base.OnApplyTemplate();
  42. _waveElement = GetTemplateChild(ElementWave) as FrameworkElement;
  43. var clipElement = GetTemplateChild(ElementClip) as FrameworkElement;
  44. if (_waveElement != null && clipElement != null)
  45. {
  46. var clipElementHeight = clipElement.Height;
  47. _translateTransform = new TranslateTransform
  48. {
  49. Y = clipElementHeight
  50. };
  51. _translateTransformYRange = clipElementHeight - TranslateTransformMinY;
  52. _waveElement.RenderTransform = new TransformGroup
  53. {
  54. Children = { _translateTransform }
  55. };
  56. UpdateWave(Value);
  57. }
  58. }
  59. public static readonly DependencyProperty TextProperty = DependencyProperty.Register(
  60. nameof(Text), typeof(string), typeof(WaveProgressBar), new PropertyMetadata(default(string)));
  61. public string Text
  62. {
  63. get => (string) GetValue(TextProperty);
  64. set => SetValue(TextProperty, value);
  65. }
  66. public static readonly DependencyProperty ShowTextProperty = DependencyProperty.Register(
  67. nameof(ShowText), typeof(bool), typeof(WaveProgressBar), new PropertyMetadata(ValueBoxes.TrueBox));
  68. public bool ShowText
  69. {
  70. get => (bool) GetValue(ShowTextProperty);
  71. set => SetValue(ShowTextProperty, ValueBoxes.BooleanBox(value));
  72. }
  73. public static readonly DependencyProperty WaveFillProperty = DependencyProperty.Register(
  74. nameof(WaveFill), typeof(Brush), typeof(WaveProgressBar), new PropertyMetadata(default(Brush)));
  75. public Brush WaveFill
  76. {
  77. get => (Brush) GetValue(WaveFillProperty);
  78. set => SetValue(WaveFillProperty, value);
  79. }
  80. public static readonly DependencyProperty WaveThicknessProperty = DependencyProperty.Register(
  81. nameof(WaveThickness), typeof(double), typeof(WaveProgressBar), new PropertyMetadata(ValueBoxes.Double0Box));
  82. public double WaveThickness
  83. {
  84. get => (double) GetValue(WaveThicknessProperty);
  85. set => SetValue(WaveThicknessProperty, value);
  86. }
  87. public static readonly DependencyProperty WaveStrokeProperty = DependencyProperty.Register(
  88. nameof(WaveStroke), typeof(Brush), typeof(WaveProgressBar), new PropertyMetadata(default(Brush)));
  89. public Brush WaveStroke
  90. {
  91. get => (Brush) GetValue(WaveStrokeProperty);
  92. set => SetValue(WaveStrokeProperty, value);
  93. }
  94. }