using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Markup; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace Tango.Touch.Controls { [ContentProperty(nameof(Content))] public class SliderContentControl : Slider { private bool m_isBlocked; #region DependencyProperties public UIElement Content { get { return (UIElement)GetValue(ContentProperty); } set { SetValue(ContentProperty, value); } } public static readonly DependencyProperty ContentProperty = DependencyProperty.Register("Content", typeof(UIElement), typeof(SliderContentControl), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender, (d, e) => (d as SliderContentControl).OnContentChanged())); public static readonly DependencyProperty ThumbHeightProperty = DependencyProperty.Register("ThumbHeight", typeof(double), typeof(SliderContentControl), new FrameworkPropertyMetadata((double)32, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); public double ThumbHeight { get { return (double)GetValue(ThumbHeightProperty); } set { SetValue(ThumbHeightProperty, value); } } public Color ThumbColor { get { return (Color)GetValue(ThumbColorProperty); } set { SetValue(ThumbColorProperty, value); } } /// /// The thumb color property /// public static readonly DependencyProperty ThumbColorProperty = DependencyProperty.Register("ThumbColor", typeof(Color), typeof(SliderContentControl), new UIPropertyMetadata(Colors.LightGray, null)); #endregion static SliderContentControl() { DefaultStyleKeyProperty.OverrideMetadata(typeof(SliderContentControl), new FrameworkPropertyMetadata(typeof(SliderContentControl))); } public override void OnApplyTemplate() { base.OnApplyTemplate(); TouchDown -= TouchDownSlider; TouchDown += TouchDownSlider; OnValueChanged(Double.NaN, Value); IsMoveToPointEnabled = true; } private void TouchDownSlider(object sender, TouchEventArgs e) { e.Handled = true; } private double ValidateValue(double value) { if (value >= Minimum && value <= Maximum) return value; if ((value) > Maximum) return Maximum; if ((value) < Minimum) return Minimum; return double.NaN; } private void OnContentChanged() { RemoveLogicalChild(Content); AddLogicalChild(Content); } protected override void OnValueChanged(double oldValue, double newValue) { if (m_isBlocked) return; m_isBlocked = true; var validatedValue = ValidateValue(newValue); if (!double.IsNaN(validatedValue)) { Value = validatedValue; } m_isBlocked = false; } protected override void OnPreviewMouseLeftButtonDown(MouseButtonEventArgs e) { e.Handled = true; } } }