我正在尝试从 Kinects 加速计获取数据,但它没有更改通知事件,因此为了获取数据,我现在正在使用 while 循环。有没有办法将 AccelerometerGetCurrentReading () 方法结果绑定(bind)到属性,然后使用 propertychanged 事件或其他事件?
最佳答案
当然。
- 创建一个实现 INotifyPropertyChanged 的 AccelerometerReader 类。
- 添加一个属性,该属性将代表您从加速度计读取的当前(最新)值。
- 在属性 setter 中,让属性在值不同时触发 PropertyChanged 事件。
- 实例化该类后,启动一个任务,该任务连续读取加速度计,并设置属性中的值。
- 由于该值仅在发生更改时触发,因此只有在发生更改时才会通知任何观察者。
- 明智的做法是在无限循环中添加延迟,或者添加计时机制,这样您只需每 x 毫秒读取一次
- 您可能希望使该类成为一次性的,以便您可以停止任务或停止计时器。
使用循环的示例。使用一个简单的 bool 值来停止循环,并在处理对象时设置该 bool 值。 警告:此代码尚未经过测试!
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
}
关于c# - 连续获取方法数据,无需 while,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19833158/