【问题标题】:WPF Sliderf follow cursorWPF Sliderf跟随光标
【发布时间】:2021-01-15 22:41:20
【问题描述】:

我有滑块:

<Slider x:Name="DesktopAudioSlider"
                        HorizontalAlignment="Stretch"
                        Margin="0,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, Type targetType, object parameter, 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>

【问题讨论】:

    标签: wpf xaml uwp slider


    【解决方案1】:

    没有办法在命令中传递两个参数,我找到了一个解决方案 - 添加行为。

    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>
    

    【讨论】:

      猜你喜欢
      • 2020-09-04
      • 1970-01-01
      • 1970-01-01
      • 2013-03-29
      • 2011-03-24
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多