我将Slider的值绑定到表示联网设备上的卷的整数属性。此网络请求需要一些时间(通常<100毫秒),并以某种方式导致滑块感觉不稳定。
这是我过于简化的代码,以澄清:
Private _playbackVolume As Integer
Private _deviceForDemonstrationPurposes As New Device
Public Property PlaybackVolume As Integer
Get
Return _playbackVolume
End Get
Set(value As Integer)
_deviceForDemonstrationPurposes.Volume = value
End Set
End Property
Friend Sub UpdateVolume(volume As Integer)
' this is called by the instance of Device whenever its volume changes.
_playbackVolume = volume
RaisePropertyChanged("PlaybackVolume") ' INotifyPropertyChanged implementation.
End Sub
绑定到PlaybackVolume
属性将导致setter在仍然拖动拇指时触发。由于网络延迟问题,滑块会被锁定,但请求完成需要很多毫秒。
什么是让滑块再次感觉平滑的最佳方法?
答案 0 :(得分:1)
考虑将UI(滑块)与实际获取的组件分离并设置卷。当滑块值更改时,它应该将请求排队以将卷更改为新值,但继续以其快乐方式继续。首次从设备绘制或刷新UI时,仅从设备的音量设置滑块位置;你可能会意外地暗示音量是根据用户拖动它来设置的。
编辑
(完全披露:我自己没有做过很多WPF)
因此,在查看我的意思的实际示例后,我了解了UpdateSourceTrigger,它为您提供了多种触发绑定元素重新绑定的方法。我找到this example,它将UpdateSourceTrigger
与计时器结合在一起。拖动滑块的想法开始了一个短暂的超时,之后告诉UpdateSourceTrigger
更新其数据绑定。诀窍是当用户继续更改滑块值时超时被中断。因此,最终效果是您的设备实际上不会使用滑块值进行更新,直到用户最终确定了他们想要的值,这样可以在您正在寻找的滑动时为您提供流畅,响应迅速的UI。您仍然可以像现在一样从设备保持滑块的实时更新。我希望这会让事情变得更加清晰。