滑块的双向值绑定延迟会导致波动行为

时间:2012-05-07 03:21:11

标签: .net wpf vb.net data-binding wpf-controls

我将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在仍然拖动拇指时触发。由于网络延迟问题,滑块会被锁定,但请求完成需要很多毫秒。

什么是让滑块再次感觉平滑的最佳方法?

1 个答案:

答案 0 :(得分:1)

考虑将UI(滑块)与实际获取的组件分离并设置卷。当滑块值更改时,它应该将请求排队以将卷更改为新值,但继续以其快乐方式继续。首次从设备绘制或刷新UI时,仅从设备的音量设置滑块位置;你可能会意外地暗示音量是根据用户拖动它来设置的。

编辑

(完全披露:我自己没有做过很多WPF)

因此,在查看我的意思的实际示例后,我了解了UpdateSourceTrigger,它为您提供了多种触发绑定元素重新绑定的方法。我找到this example,它将UpdateSourceTrigger与计时器结合在一起。拖动滑块的想法开始了一个短暂的超时,之后告诉UpdateSourceTrigger更新其数据绑定。诀窍是当用户继续更改滑块值时超时被中断。因此,最终效果是您的设备实际上不会使用滑块值进行更新,直到用户最终确定了他们想要的值,这样可以在您正在寻找的滑动时为您提供流畅,响应迅速的UI。您仍然可以像现在一样从设备保持滑块的实时更新。我希望这会让事情变得更加清晰。