From 4c66d0dcf936df0ca31b1cd3158e2613507c985d Mon Sep 17 00:00:00 2001 From: NaBian <836904362@qq.com> Date: Thu, 7 Mar 2019 23:37:34 +0800 Subject: [PATCH] add WaveProgressBar --- HandyControl/Controls/Attach/LinkElement.cs | 4 +- .../Controls/ProgressBar/WaveProgressBar.cs | 89 +++++++++++++++--- .../Styles/Base/ProgressBarBaseStyle.xaml | 57 ++++++++++- HandyControl/Themes/Styles/ProgressBar.xaml | 20 ++++ .../UserControl/Controls/BadgeDemoCtl.xaml | 36 +++---- .../Controls/ProgressBarDemoCtl.xaml | 29 ++++-- .../UserControl/Main/LeftMainContent.xaml | 4 +- README.md | 8 +- Resources/WaveProgressBar.gif | Bin 0 -> 110689 bytes 9 files changed, 203 insertions(+), 44 deletions(-) create mode 100644 Resources/WaveProgressBar.gif diff --git a/HandyControl/Controls/Attach/LinkElement.cs b/HandyControl/Controls/Attach/LinkElement.cs index 5da5d111..d962952c 100644 --- a/HandyControl/Controls/Attach/LinkElement.cs +++ b/HandyControl/Controls/Attach/LinkElement.cs @@ -14,7 +14,7 @@ namespace HandyControl.Controls { if (d is UIElement element) { - CreateTrriger(element, (string) e.NewValue); + CreateTrigger(element, (string) e.NewValue); } } @@ -27,7 +27,7 @@ namespace HandyControl.Controls private static CommandBinding GetCommandBinding(DependencyObject element) => (CommandBinding) element.GetValue(CommandBindingProperty); - private static void CreateTrriger(UIElement element, string link) + private static void CreateTrigger(UIElement element, string link) { element.CommandBindings.Remove(GetCommandBinding(element)); element.SetCurrentValue(CommandBindingProperty, DependencyProperty.UnsetValue); diff --git a/HandyControl/Controls/ProgressBar/WaveProgressBar.cs b/HandyControl/Controls/ProgressBar/WaveProgressBar.cs index 5f07b0be..196665ca 100644 --- a/HandyControl/Controls/ProgressBar/WaveProgressBar.cs +++ b/HandyControl/Controls/ProgressBar/WaveProgressBar.cs @@ -2,19 +2,75 @@ using System.Windows.Controls.Primitives; using System.Windows.Media; using HandyControl.Data; +using HandyControl.Expression.Drawing; namespace HandyControl.Controls { + /// + /// 波浪进度条 + /// + [TemplatePart(Name = ElementWave, Type = typeof(FrameworkElement))] + [TemplatePart(Name = ElementClip, Type = typeof(FrameworkElement))] public class WaveProgressBar : RangeBase { + private const string ElementWave = "PART_Wave"; + + private const string ElementClip = "PART_Clip"; + + private FrameworkElement _waveElement; + + private const double TranslateTransformMinY = -20; + + private double _translateTransformYRange; + + private TranslateTransform _translateTransform; + + public WaveProgressBar() => Loaded += (s, e) => UpdateWave(Value); + static WaveProgressBar() { - FocusableProperty.OverrideMetadata(typeof(CircleProgressBar), + FocusableProperty.OverrideMetadata(typeof(WaveProgressBar), new FrameworkPropertyMetadata(ValueBoxes.FalseBox)); - MaximumProperty.OverrideMetadata(typeof(CircleProgressBar), + MaximumProperty.OverrideMetadata(typeof(WaveProgressBar), new FrameworkPropertyMetadata(ValueBoxes.Double100Box)); } + protected override void OnValueChanged(double oldValue, double newValue) + { + base.OnValueChanged(oldValue, newValue); + + UpdateWave(newValue); + } + + private void UpdateWave(double value) + { + if (_translateTransform == null || MathHelper.IsVerySmall(Maximum)) return; + var scale = 1 - value / Maximum; + var y = _translateTransformYRange * scale + TranslateTransformMinY; + _translateTransform.Y = y; + } + + public override void OnApplyTemplate() + { + base.OnApplyTemplate(); + + _waveElement = GetTemplateChild(ElementWave) as FrameworkElement; + var clipElement = GetTemplateChild(ElementClip) as FrameworkElement; + + if (_waveElement != null && clipElement != null) + { + _translateTransform = new TranslateTransform + { + Y = clipElement.Height + }; + _translateTransformYRange = clipElement.Height - TranslateTransformMinY; + _waveElement.RenderTransform = new TransformGroup + { + Children = {_translateTransform} + }; + } + } + public static readonly DependencyProperty TextProperty = DependencyProperty.Register( "Text", typeof(string), typeof(WaveProgressBar), new PropertyMetadata(default(string))); @@ -33,22 +89,31 @@ namespace HandyControl.Controls set => SetValue(ShowTextProperty, value); } - public static readonly DependencyProperty WaveBrushProperty = DependencyProperty.Register( - "WaveBrush", typeof(Brush), typeof(WaveProgressBar), new PropertyMetadata(default(Brush))); + public static readonly DependencyProperty WaveFillProperty = DependencyProperty.Register( + "WaveFill", typeof(Brush), typeof(WaveProgressBar), new PropertyMetadata(default(Brush))); - public Brush WaveBrush + public Brush WaveFill { - get => (Brush)GetValue(WaveBrushProperty); - set => SetValue(WaveBrushProperty, value); + get => (Brush) GetValue(WaveFillProperty); + set => SetValue(WaveFillProperty, value); } - public static readonly DependencyProperty WaveDiameterProperty = DependencyProperty.Register( - "WaveDiameter", typeof(double), typeof(WaveProgressBar), new PropertyMetadata(default(double))); + public static readonly DependencyProperty WaveThicknessProperty = DependencyProperty.Register( + "WaveThickness", typeof(double), typeof(WaveProgressBar), new PropertyMetadata(ValueBoxes.Double0Box)); - public double WaveDiameter + public double WaveThickness { - get => (double)GetValue(WaveDiameterProperty); - set => SetValue(WaveDiameterProperty, value); + get => (double) GetValue(WaveThicknessProperty); + set => SetValue(WaveThicknessProperty, value); + } + + public static readonly DependencyProperty WaveStrokeProperty = DependencyProperty.Register( + "WaveStroke", typeof(Brush), typeof(WaveProgressBar), new PropertyMetadata(default(Brush))); + + public Brush WaveStroke + { + get => (Brush) GetValue(WaveStrokeProperty); + set => SetValue(WaveStrokeProperty, value); } } } \ No newline at end of file diff --git a/HandyControl/Themes/Styles/Base/ProgressBarBaseStyle.xaml b/HandyControl/Themes/Styles/Base/ProgressBarBaseStyle.xaml index df26dbfe..e6279918 100644 --- a/HandyControl/Themes/Styles/Base/ProgressBarBaseStyle.xaml +++ b/HandyControl/Themes/Styles/Base/ProgressBarBaseStyle.xaml @@ -5,6 +5,7 @@ + @@ -70,13 +71,12 @@ + + \ No newline at end of file diff --git a/HandyControl/Themes/Styles/ProgressBar.xaml b/HandyControl/Themes/Styles/ProgressBar.xaml index ce272123..117fc66b 100644 --- a/HandyControl/Themes/Styles/ProgressBar.xaml +++ b/HandyControl/Themes/Styles/ProgressBar.xaml @@ -196,6 +196,26 @@ + + + + + + + + + +