feat: clean up code. add event to slider.
This commit is contained in:
@@ -116,17 +116,38 @@ public class RangeSlider: TemplatedControl
|
|||||||
set => SetValue(IsSnapToTickProperty, value);
|
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()
|
static RangeSlider()
|
||||||
{
|
{
|
||||||
PressedMixin.Attach<RangeSlider>();
|
PressedMixin.Attach<RangeSlider>();
|
||||||
FocusableProperty.OverrideDefaultValue<RangeSlider>(true);
|
FocusableProperty.OverrideDefaultValue<RangeSlider>(true);
|
||||||
IsHitTestVisibleProperty.OverrideDefaultValue<RangeSlider>(true);
|
IsHitTestVisibleProperty.OverrideDefaultValue<RangeSlider>(true);
|
||||||
OrientationProperty.OverrideDefaultValue<RangeSlider>(Orientation.Horizontal);
|
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);
|
MinimumProperty.OverrideDefaultValue<RangeSlider>(0);
|
||||||
MaximumProperty.OverrideDefaultValue<RangeSlider>(100);
|
MaximumProperty.OverrideDefaultValue<RangeSlider>(100);
|
||||||
LowerValueProperty.OverrideDefaultValue<RangeSlider>(0);
|
LowerValueProperty.OverrideDefaultValue<RangeSlider>(0);
|
||||||
UpperValueProperty.OverrideDefaultValue<RangeSlider>(100);
|
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()
|
public RangeSlider()
|
||||||
|
|||||||
@@ -212,47 +212,17 @@ public class RangeTrack: Control
|
|||||||
var newThumb = args.NewValue.Value;
|
var newThumb = args.NewValue.Value;
|
||||||
if(oldThumb is not null)
|
if(oldThumb is not null)
|
||||||
{
|
{
|
||||||
oldThumb.DragDelta -= OnThumbDragDelta;
|
|
||||||
LogicalChildren.Remove(oldThumb);
|
LogicalChildren.Remove(oldThumb);
|
||||||
VisualChildren.Remove(oldThumb);
|
VisualChildren.Remove(oldThumb);
|
||||||
}
|
}
|
||||||
if (newThumb is not null)
|
if (newThumb is not null)
|
||||||
{
|
{
|
||||||
newThumb.DragDelta += OnThumbDragDelta;
|
|
||||||
newThumb.ZIndex = 5;
|
newThumb.ZIndex = 5;
|
||||||
LogicalChildren.Add(newThumb);
|
LogicalChildren.Add(newThumb);
|
||||||
VisualChildren.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)
|
private void OnOrientationChanged(AvaloniaPropertyChangedEventArgs<Orientation> args)
|
||||||
{
|
{
|
||||||
Orientation o = args.NewValue.Value;
|
Orientation o = args.NewValue.Value;
|
||||||
@@ -482,20 +452,6 @@ public class RangeTrack: Control
|
|||||||
return !double.IsInfinity(value) && !double.IsNaN(value);
|
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)
|
internal double GetRatioByPoint(double position)
|
||||||
{
|
{
|
||||||
bool isHorizontal = Orientation == Orientation.Horizontal;
|
bool isHorizontal = Orientation == Orientation.Horizontal;
|
||||||
|
|||||||
Reference in New Issue
Block a user