WPF滑块 - 当从UI更改值时通知

5
我需要用滑块来控制视频位置(在另一种情况下还需要控制文档页面)。但问题是我不知道如何确定滑块值是由用户更改的(点击,拖动...),还是由绑定引起的。是否可能仅在滑块值从UI更新时触发某些事件,而不是从绑定更新?
我已经实现了自定义滑块:
public class NotifyingSlider : Slider
{

    public static readonly DependencyProperty ValueChangedFromUIProperty =
        DependencyProperty.Register("ValueChangedFromUI", typeof(ICommand), typeof(NotifyingSlider));

    public ICommand ValueChangedFromUI
    {
        get
        {
            return (ICommand)GetValue(ValueChangedFromUIProperty);
        }
        set
        {
            SetValue(ValueChangedFromUIProperty, value);
        }
    }

    protected override void OnThumbDragCompleted(DragCompletedEventArgs e)
    {
        base.OnThumbDragCompleted(e);
        ValueChangedFromUI?.Execute(null);
    }

    protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e)
    {
        base.OnMouseLeftButtonUp(e);
        ValueChangedFromUI?.Execute(null);
    }
}

但是ValueChangedFromUI命令只在用户将滑块拖动到特定位置或者精确点击到刻度条的位置时执行。当用户在两个刻度之间点击(因此值/滑块被移动到更近的一个),命令不会执行 - 这是我面临的主要问题。

1个回答

2
很遗憾,我认为没有简单的方法来做到这一点。我的做法是根本不绑定值,在滑块上添加一个ValueChanged事件。然后,当您需要在滑块在视觉上发生变化时执行某些操作时,该操作将在ValueChanged事件中发生。您还需要在此事件中更新包含未绑定值的属性。这样,滑块的值和应该绑定但未绑定的值始终相同,并允许您根据更改了哪个值来指定不同的操作。
您可以指定一个额外的标志(bool IgnoreUpdate),当更新未绑定的属性时,您可以将其设置为true。
然后,当您直接更新未绑定的属性时,请使用一个检查IgnoreUpdate的方法来更新实际的滑块值。如果IgnoreUpdate为true,则不要尝试更新未绑定的属性(我认为这会导致无限循环),并在下一个值更改时将其设置回false。如果它为false,则我们已经在视觉上更改了滑块,为了反映这种变化,我们更新它所关心的属性(未绑定的属性)。
private bool IgnoreUpdate = false;

private int value = 0;
public int Value
{
    get
    {
        return this.value;
    } set
    {
        this.value = value;
        this.IgnoreUpdate = true;
        this.UpdateValue(value);
    }
}

public void UpdateValue(int ProgressValue)
{
    this.Slider.Value = ProgressValue;
    if (IgnoreUpdate)
    {
        IgnoreUpdate = false;
        return;
    }
    //Do stuff when the value changes visually
    this.Value = ProgressValue;
}

private void Slider_ValueChanged(object sender, ProgessChangedEventArgs e)
{
    this.UpdateValue(e.Value);
}

我不确定你为什么要以这种方式做,但这是我能想到的最具前瞻性的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接