feat: clean up code. add event to slider.

This commit is contained in:
rabbitism
2024-01-19 22:32:26 +08:00
parent 48bdb2cfb9
commit c17f5cbfa3
2 changed files with 23 additions and 46 deletions

View File

@@ -116,19 +116,40 @@ public class RangeSlider: TemplatedControl
set => SetValue(IsSnapToTickProperty, value);
}
public static readonly RoutedEvent<RangeValueChangedEventArgs> ValueChangedEvent =
RoutedEvent.Register<RangeSlider, RangeValueChangedEventArgs>(nameof(ValueChanged), RoutingStrategies.Bubble);
public event EventHandler<RangeValueChangedEventArgs> ValueChanged
{
add => AddHandler(ValueChangedEvent, value);
remove => RemoveHandler(ValueChangedEvent, value);
}
static RangeSlider()
{
PressedMixin.Attach<RangeSlider>();
FocusableProperty.OverrideDefaultValue<RangeSlider>(true);
IsHitTestVisibleProperty.OverrideDefaultValue<RangeSlider>(true);
OrientationProperty.OverrideDefaultValue<RangeSlider>(Orientation.Horizontal);
OrientationProperty.Changed.AddClassHandler<RangeSlider, Avalonia.Layout.Orientation>((o,e)=>o.OnOrientationChanged(e));
OrientationProperty.Changed.AddClassHandler<RangeSlider, Orientation>((o,e)=>o.OnOrientationChanged(e));
MinimumProperty.OverrideDefaultValue<RangeSlider>(0);
MaximumProperty.OverrideDefaultValue<RangeSlider>(100);
LowerValueProperty.OverrideDefaultValue<RangeSlider>(0);
UpperValueProperty.OverrideDefaultValue<RangeSlider>(100);
LowerValueProperty.Changed.AddClassHandler<RangeSlider, double>((o, e) => o.OnValueChanged(e, true));
UpperValueProperty.Changed.AddClassHandler<RangeSlider, double>((o, e) => o.OnValueChanged(e, false));
}
private void OnValueChanged(AvaloniaPropertyChangedEventArgs<double> args, bool isLower)
{
var oldValue = args.OldValue.Value;
var newValue = args.NewValue.Value;
if (oldValue != newValue)
{
RaiseEvent(new RangeValueChangedEventArgs(ValueChangedEvent, this, oldValue, newValue, isLower));
}
}
public RangeSlider()
{
UpdatePseudoClasses(Orientation);

View File

@@ -212,47 +212,17 @@ public class RangeTrack: Control
var newThumb = args.NewValue.Value;
if(oldThumb is not null)
{
oldThumb.DragDelta -= OnThumbDragDelta;
LogicalChildren.Remove(oldThumb);
VisualChildren.Remove(oldThumb);
}
if (newThumb is not null)
{
newThumb.DragDelta += OnThumbDragDelta;
newThumb.ZIndex = 5;
LogicalChildren.Add(newThumb);
VisualChildren.Add(newThumb);
}
}
private void OnThumbDragDelta(object sender, VectorEventArgs e)
{
return;
if(sender is not Thumb thumb) return;
bool lower = thumb == LowerThumb;
double scale = IsDirectionReversed ? -1 : 1;
double originalValue = lower ? LowerValue : UpperValue;
double value;
if (Orientation == Orientation.Horizontal)
{
value = scale * e.Vector.X * _density;
}
else
{
value = -1 * scale * e.Vector.Y * _density;
}
var factor = e.Vector / value;
if (lower)
{
SetCurrentValue(LowerValueProperty, MathUtilities.Clamp(originalValue + value, Minimum, UpperValue));
}
else
{
SetCurrentValue(UpperValueProperty, MathUtilities.Clamp(originalValue + value, LowerValue, Maximum));
}
}
private void OnOrientationChanged(AvaloniaPropertyChangedEventArgs<Orientation> args)
{
Orientation o = args.NewValue.Value;
@@ -481,20 +451,6 @@ public class RangeTrack: Control
{
return !double.IsInfinity(value) && !double.IsNaN(value);
}
internal double GetThumbLength()
{
return Orientation == Orientation.Horizontal
? LowerThumb?.Bounds.Width ?? 0 + UpperThumb?.Bounds.Width ?? 0
: LowerThumb?.Bounds.Height ?? 0 + UpperThumb?.Bounds.Height ?? 0;
}
internal double GetTrackLength()
{
return Orientation == Orientation.Horizontal
? Bounds.Width
: Bounds.Height;
}
internal double GetRatioByPoint(double position)
{