如何解决WPF Sliderf跟随光标
我有滑块:
<Slider x:Name="DesktopAudioSlider"
HorizontalAlignment="Stretch"
Margin="0,5,0">
我需要像UWP Slider那样的行为,单击鼠标后跟随鼠标。我无法使用事件,因为使用MVVM,试图将sender和eventargs转换为元组并传递给command,但是无法将MouseEventargs传递给转换器。
转换器:
class SliderArgsToTupleConverter : IValueConverter
{
public object Convert(object value,Type targetType,object parameter,CultureInfo culture)
{
if(parameter is MouseEventArgs)
{
return new Tuple<object,MouseEventArgs>(value,parameter as MouseEventArgs);
}
else
{
throw new ArgumentException();
}
}
public object ConvertBack(object value,CultureInfo culture)
{
throw new NotImplementedException();
}
}
命令:
this.SlideMouseMoveCommand = new RelayCommand<Tuple<object,MouseEventArgs>>(SlideMouseMoveExecute);
触发:
<i:EventTrigger EventName="MouseMove">
<i:InvokeCommandAction Command="{Binding MixerViewModel.SlideMouseMoveCommand,Source={StaticResource Locator}}"
CommandParameter="{Binding ElementName=DesktopAudioSlider,ConverterParameter={}}"
</i:EventTrigger>
解决方法
没有办法在command中传递两个参数,我找到了一种解决方案-添加行为。
public class SliderMoveBehavior : Behavior<Slider>
{
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.MouseMove += SliderMouseMove;
}
protected override void OnDetaching()
{
base.OnDetaching();
AssociatedObject.MouseMove -= SliderMouseMove;
}
private void SliderMouseMove(object sender,MouseEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
Point position = e.GetPosition(AssociatedObject);
double d = 1.0d / AssociatedObject.ActualWidth * position.X;
var p = AssociatedObject.Maximum * d;
AssociatedObject.Value = (int)p;
}
}
}
在XAML中:
<Slider x:Name="PlaybackSpeedSlider">
<i:Interaction.Behaviors>
<behaviors:SliderMoveBehavior/>
</i:Interaction.Behaviors>
</Slider>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。