2

我有一个滑块,它的value属性与依赖属性相关联。我需要知道用户是否通过 GUI 更改了值。不幸的是,此滑块的值通常通过代码更改,并且在发生这种情况时会触发“Value_Changed”事件。

我知道解决这个问题的两种方法:

  1. 创建一个布尔值并在每次更改值之前在代码中将其更改为 true,之后将其更改为 false,然后在 Value_Changed 事件中检查此布尔值。
  2. 将 keypress、click 和 dragstop 事件连接到滑块。

我只是想知道是否有更好的方法来了解用户是否通过 UI 更改了值?

4

3 回答 3

2

我会这样做:

public bool PositionModifiedByUser
{ /* implement IPropertyChanged if need to bind to this property */ }

// use this property from code
public double Position
{
    get { return m_position ; }
    set { SetPropertyValue ("PositionUI", ref m_position, value) ;
          PositionModifiedByUser = false ; }
}

// bind to this property from the UI
public double PositionUI
{
    get { return m_position ; }
    set { if (SetPropertyValue ("PositionUI", ref m_position, value))
          PositionModifiedByUser = true ; }
}

SetPropertyValue 是一个帮助器,它检查是否相等并在值实际更改时触发属性更改通知。

于 2013-03-18T13:09:48.637 回答
0

可能重复的问题。快速回答:

<Slider Thumb.DragCompleted="MySlider_DragCompleted" />

另见这篇文章

于 2013-03-18T12:54:52.807 回答
0

但是安东的答案更好+1

[BindableAttribute(true)]
public double Slider1Value
{
    get { return slider1Value; }
    set
    {
        // only bind to the UI so any call to here came from the UI
        if (slider1Value == value) return;
        // do what you were going to do in value changed here
        slider1Value = value;
    }
}

private void clickHalf(object sender, RoutedEventArgs e)
{
    // manipulate the private varible so set is not called
    slider1Value = slider1Value / 2;
    NotifyPropertyChanged("Slider1Value");
}
于 2013-03-18T14:03:45.890 回答