Problem with Thumb.DragStarted event with MVVMLight

I am trying to fire the Slider Thumb.DragStarted event using MVVMLight EventToCommand , but it does not work. The same thing works great for Slider Event ValueChanged .

Below is my code:

 <Slider Width="150" AutoToolTipPlacement="BottomRight" AutoToolTipPrecision="2" IsSnapToTickEnabled="True" Maximum="{Binding SilderMaxValue}" Minimum="0" Value="{Binding SliderValue}"> <i:Interaction.Triggers> <i:EventTrigger EventName="ValueChanged"> <cmd:EventToCommand Command="{Binding SliderValueChangedCommand}" PassEventArgsToCommand="True" /> </i:EventTrigger> <i:EventTrigger EventName="Thumb.DragStarted"> <cmd:EventToCommand Command="{Binding SliderDragStartedCommand}" PassEventArgsToCommand="True" /> </i:EventTrigger> </Slider> 

Thanks..

+4
source share
2 answers

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 :)

+4
source

I had a problem with the code from Tom Allen, because the slider template was not available at the time when I wanted to associate it with the team. Basically, all I have to do is wait for the slider knob to load and try again. Here are the changes I need to make for it to work:

  private static void DragCompleted(DependencyObject d, DependencyPropertyChangedEventArgs e) { //the Template of the slider is not available now //we have to wait for the slider to load completely in order to do this var slider = (Slider)d; slider.Loaded += slider_Loaded; } static void slider_Loaded(object sender, RoutedEventArgs e) { var slider = (Slider)sender; var thumb = GetThumbFromSlider(slider); thumb.DragCompleted += thumb_DragCompleted; } 

Hope this helps! Relations

+1
source

All Articles