I saw your post while I tried to do something similar (albeit with Thumb.DragCompleted). In any case, I used an attached property. I will send my decision if it is used to anyone.
SliderDragBehavoirs.cs:
using System; using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; using System.Windows.Input; using System.Windows.Media; namespace WpfApplication1 { public static class SliderDragBehaviors { public static readonly DependencyProperty DragCompletedCommandProperty = DependencyProperty.RegisterAttached("DragCompletedCommand", typeof(ICommand), typeof(SliderDragBehaviors), new FrameworkPropertyMetadata(new PropertyChangedCallback(DragCompleted))); private static void DragCompleted(DependencyObject d, DependencyPropertyChangedEventArgs e) { var slider = (Slider)d; var thumb = GetThumbFromSlider(slider); thumb.DragCompleted += thumb_DragCompleted; } private static void thumb_DragCompleted(object sender, DragCompletedEventArgs e) { FrameworkElement element = (FrameworkElement)sender; element.Dispatcher.Invoke(() => { var command = GetDragCompletedCommand(element); var slider = FindParentControl<Slider>(element) as Slider; command.Execute(slider.Value); }); } public static void SetDragCompletedCommand(UIElement element, ICommand value) { element.SetValue(DragCompletedCommandProperty, value); } public static ICommand GetDragCompletedCommand(FrameworkElement element) { var slider = FindParentControl<Slider>(element); return (ICommand)slider.GetValue(DragCompletedCommandProperty); } private static Thumb GetThumbFromSlider(Slider slider) { var track = slider.Template.FindName("PART_Track", slider) as Track; return track == null ? null : track.Thumb; } private static DependencyObject FindParentControl<T>(DependencyObject control) { var parent = VisualTreeHelper.GetParent(control); while (parent != null && !(parent is T)) { parent = VisualTreeHelper.GetParent(parent); } return parent; } } }
A couple of things are worth noting here. Since the team is connected to the slider, but the event is triggered on Thumb, you must be able to look up / down the visual tree to get one from the other.
XAML example:
<Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:behaviors="clr-namespace:WpfApplication1" Title="MainWindow" Height="350" Width="525"> <Grid x:Name="grid"> <Slider behaviors:SliderDragBehaviors.DragCompletedCommand="{Binding Path=DragCompletedCommand}"/> </Grid> </Window>
Hope some use :)
source share