2

我正在尝试从 Kinects 加速度计获取数据,但它没有更改通知事件,因此为了获取数据,我现在正在使用 while 循环。有没有办法将 AccelerometerGetCurrentReading () 方法的结果绑定到一个属性,然后使用 propertychanged 事件,或者别的什么?

4

1 回答 1

3

当然。

  • 创建一个实现 INotifyPropertyChanged 的​​类 AccelerometerReader。
  • 添加一个属性,该属性将表示您从加速度计读取的当前(最新)值。
  • 在属性设置器中,让属性在值不同时触发 PropertyChanged 事件。
  • 当类被实例化时,启动一个不断从加速度计读取的任务,并在属性中设置值。
  • 由于该值仅在更改时触发,因此仅在发生更改时才通知任何观察者。
  • 明智的做法是在无限循环中添加延迟,或者添加计时机制,这样您每 x 毫秒才读取一次
  • 您可能希望将课程设置为一次性的,以便您可以停止任务或停止计时器。

使用循环的示例。一个简单的布尔值用于停止循环,该布尔值在对象被释放时设置。警告:此代码尚未经过测试!

class AccelerometerReader: INotifyPropertyChanged, IDisposable {
    #region Constructor

    public AccelerometerReader() {
        new Task(ReadAccelerometer).Start();
    }

    #endregion
    #region INotifyPropertyChanged

    public event PropertyChangedEventHandler PropertyChanged;

    void FirePropertyChanged(string propertyName) {
        var propertyChanged = PropertyChanged;
        if (propertyChanged != null) {
            propertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    #endregion
    #region Properties

    int _value;
    public int Value {
        get { return _value; }
        set { 
            if (value != _value) {
                _value = value;
                FirePropertyChanged("Value");
            }
        }
    }

    #endregion
    #region Accelerometer reading

    bool _stopLoop = false;

    void StartReadLoop() {
        while (!_stopLoop) {
            Value = ReadAccelerometer();
            // TODO: Delay a little
        }
    }

    int ReadAccelerometer() {
        // TODO: Read from accelerometer...
    }

    #endregion
    #region IDisposable

    public void Dispose() {
        _stopLoop = true;

        // TODO: Add a proper IDisposable implementation
    }

    #endregion
}
于 2013-11-07T10:18:28.717 回答