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