【问题标题】:Delay in slider's two-way value binding causes choppy behaviour滑块的双向值绑定延迟导致不稳定的行为
【发布时间】:2012-05-07 03:21:11
【问题描述】:

我将Slider 的值绑定到一个整数属性,该属性表示联网设备上的音量。这个网络请求需要一点时间(通常

这是我过于简化的代码来澄清:

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

什么被认为是让滑块再次变得平滑的最佳方法?

【问题讨论】:

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


    【解决方案1】:

    考虑将 UI(滑块)与实际获取和设置音量的组件分离。当滑块值更改时,它应该排队请求将音量更改为新值,但继续其愉快的方式。仅在您第一次从设备绘制或刷新 UI 时从设备的音量设置滑块位置;您可能可以暗示音量设置为用户将其拖动到的位置。

    编辑

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

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

    【讨论】:

    • 可以,但用户也可以通过其他方式(例如物理遥控器或应用程序的第二个实例)更改音量。这会导致滑块显示不正确的值,这是我一直希望避免的。
    • 基本上你的建议是将绑定模式设置为 OneWayToSource(或其他任何名称)并在设置器上实现某种形式的异步。
    • 好的,我想你可以把关于它的部分只从加载或刷新的设备中删除。您可以保留设备组件通知 UI 并设置滑块值的部分,但添加在用户仍在拖动滑块时暂时禁用更新的逻辑。
    • 听起来不错,但我该怎么做呢?我在 WPF 方面不是很有经验(仍在学习基础知识),所以你需要对我有耐心。 :D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 2011-11-05
    • 2019-08-24
    • 2018-10-08
    • 2014-03-10
    相关资源
    最近更新 更多