WPF - 如何在拖动时更新滑块的值

Guy*_*she 2 c# wpf

你可能会说它是如何在拖动时停止更新滑块值的重复但老实说,解决方案从2011年开始,并没有为我工作(甚至评论了其他用户接受的答案),其他答案与我无关.所以请耐心等待.

这是我的问题:我有一个绑定到这样的值的滑块:

<Slider Name="AudioSlider" Value="{Binding AudioValue}" 
        Grid.Column="1"    Grid.Row="1"    Height="30" 
        SmallChange="1"    Maximum="100" 
        IsSnapToTickEnabled="True"                                      
        IsMoveToPointEnabled="True"/>
Run Code Online (Sandbox Code Playgroud)

这就是价值:

        private double _audioValue;
        public double AudioValue
        {
            get { return _audioValue; }
            set
            {
                if (_audioValue == value)
                    return;
                _audioValue = value;
                SendPacket(cockpitType, (byte)Index.AudioSlider, (byte)_audioValue);
                OnPropertyChanged("AudioValue");
            }
        }
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,每次值发生变化时我都会发送一个数据包,当它更新拖动值时,它只是在服务器上发送垃圾邮件,这是必须要防止的.

我试图将滑块绑定到一个函数(mouseUp),但我无法通过这种方式获取值.

任何想法我能做什么?

非常感谢.

编辑:

这里的答案WPF:在用户拖动后触发事件的滑块对我没有帮助,因为它是数据模板中生成的滑块,事件与我无关.

Sza*_*zsi 10

如果您使用的是WPF 4.5,则可以使用

Value="{Binding AudioValue, Delay=500}"
Run Code Online (Sandbox Code Playgroud)

这将限制更改通知.如果用户快速拖动滑块,这将"重置"内部计时器并将丢弃挂起的通知.当用户停止并且500毫秒延迟结束时,它将调用您的setter方法一次.

有很多方法可以做到这一点,所以这只是一个建议.您可以在VM中使用Rx及其Throttle方法执行此操作.这基本上BindingDelay房产一样.

我有一个问题,就是只覆盖OnThumbDragCompleted其他答案中建议的方法.这意味着只有在Slider通过拖动拇指进行操作时才会传播更改.例如,如果单击拇指旁边的,则不会通知您的属性.基本上,我的意思是,你必须确保它的值同步,Value并且FinalValue如果你与你来自哪里,得到的解决方案去Slider.