feat: clean up code. add event to slider.
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user