Нелегко достичь с помощью шаблонов, потому что положение мыши не является свойством зависимости, а перемещение мыши не является перенаправленным событием.Это действительно сводится к тому, что вы хотите сделать, если просто показать вертикальную линию, если мышь, тогда я согласен с Дэни использовать украшения, так как вы на самом деле не заинтересованы в самом слайдере.Однако, если он перемещает большой палец туда, где находится мышь, я бы использовал прикрепленное свойство.
Причина, по которой я использую вложенные свойства вместо того, чтобы подключать события непосредственно к элементу управления, заключается в том, что он обеспечивает более модульную и многоразовую работукодовая база и делает его более очевидным из визуального эффекта в XAML, вместо того, чтобы смотреть на код C #.
Вот что я бы предложил
public class SliderHelperPackage
{
public static readonly DependencyProperty BindThumbToMouseProperty = DependencyProperty.RegisterAttached(
"BindThumbToMouse", typeof(bool), typeof(SliderHelperPackage), new PropertyMetadata(false, OnBindThumbToMouseChanged));
public static void SetBindThumbToMouse(UIElement element, bool value)
{
element.SetValue(BindThumbToMouseProperty, value);
}
public static bool GetBindThumbToMouse(UIElement element)
{
return (bool)element.GetValue(BindThumbToMouseProperty);
}
private static void OnBindThumbToMouseChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (e.NewValue.Equals(e.OldValue))
return;
var slider = d as Slider;
if (slider == null)
throw new ArgumentException(@"dependency object must be a slider", "d");
if ((bool) e.NewValue)
{
slider.MouseMove += SliderMouseMove;
}
else
{
slider.MouseMove -= SliderMouseMove;
}
}
static void SliderMouseMove(object sender, MouseEventArgs e)
{
var slider = (Slider) sender;
var position = e.GetPosition(slider);
// When the mouse moves, we update the slider's value so it's where the ticker is (we take into account margin's on the track)
slider.Value = (slider.Maximum - slider.Minimum)*Math.Max(position.X-5,0)/(slider.ActualWidth-10) + slider.Minimum;
}
}
И затем вы можете использоватьэто в твоем XAML вот так.Поэтому, когда вы устанавливаете это в true, мы подключаемся к событию перемещения мыши на слайдере и меняем его значение так, чтобы большой палец следовал за мышью
<Slider SliderPosn:SliderHelperPackage.BindThumbToMouse="True" Margin="5" Height="25" VerticalAlignment="Top"/>