2016-01-06 45 views
0

这个问题涉及编程,但也涉及我的体系结构,如果它需要更改。类之外的传递和事件处理程序

基本上,我有包裹在一个类中的微软频功能,我订阅了加速计更改如下类中的方法:

_bandClient.SensorManager.Accelerometer.ReadingChanged += Accelerometer_ReadingChanged; 

我希望能够调用的方法(事件从类的外部处理),所以我这样做:

public async Task ToggleAccelerometer(EventHandler<BandSensorReadingEventArgs<IBandAccelerometerReading>> del) 
     { 
      if (!_sensorState[Sensor.Accelerometer]) 
      { 
       _sensorState[Sensor.Accelerometer] = true; 
       _bandClient.SensorManager.Accelerometer.ReadingChanged += del; 
       await _bandClient.SensorManager.Accelerometer.StartReadingsAsync(); 
      } 
      else 
      { 
       _sensorState[Sensor.Accelerometer] = false; 
       await _bandClient.SensorManager.Accelerometer.StopReadingsAsync(); 
      } 
     } 

和参数德尔实现如下:

private void Accelerometer_ValuesChanged(object sender, BandSensorReadingEventArgs<IBandAccelerometerReading> e) 
     { 
      IBandAccelerometerReading accelerometer = e.SensorReading; 
      Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => 
     { 
      IBandAccelerometerReading accelerometer = e.SensorReading; 
      AccelXBlock.Text = accelerometer.AccelerationX.ToString(); 
      AccelYBlock.Text = accelerometer.AccelerationY.ToString(); 
      AccelZBlock.Text = accelerometer.AccelerationZ.ToString(); 
     }).AsTask(); 
     } 

这按预期工作,我的问题是:

我应该改变我的计划 设计(就是我试图做一个不好的做法?),如果是的话,那么有什么更好的办法?

回答

1

理想情况下,你应该在包装类中做事件冒泡。你可以看到它是如何使用event实现Publisher/Subscriber模式的。见下:

// Wrapper 
public class BandManager 
{ 
    // Callers will subscribe to this event 
    public event EventHandler<BandSensorReadingEventArgs<IBandAccelerometerReading>> ReadingChanged; 

    public async Task ToggleAccelerometer() 
    { 
     if (!_sensorState[Sensor.Accelerometer]) 
     { 
      _sensorState[Sensor.Accelerometer] = true; 
      _bandClient.SensorManager.Accelerometer.ReadingChanged += OnReadingChanged; 
      await _bandClient.SensorManager.Accelerometer.StartReadingsAsync(); 
     } 
     else 
     { 
      _sensorState[Sensor.Accelerometer] = false; 
      await _bandClient.SensorManager.Accelerometer.StopReadingsAsync(); 
     } 
    } 

    private void OnReadingChanged(object sender, BandSensorReadingEventArgs<IBandAccelerometerReading> e) 
    { 
     var readingChangedHandler = ReadingChanged; 

     if(readingChangedHandler != null) 
     { 
      ReadingChanged(this, e); 
     } 
    } 
} 

// Client 
public class MainClass 
{ 
    public async void Test() 
    { 
     var bandManager = new BandManager(); 
     bandManager.ReadingChanged += BandManager_ReadingChanged; 
     var whatever = await bandManager.ToggleAccelerometer(); 
    } 

    // This is event handler for your wrapper class 
    private void BandManager_ReadingChanged(object sender, BandSensorReadingEventArgs<IBandAccelerometerReading> e) 
    { 
     // use 'e' as you need 
    } 
} 
相关问题