在WP8中为地图控件加入当前地图的移动和停止的检测

在WP8,地图控件经过了修整,新的Map API 在Microsoft.Phone.Maps.Controls 命名空间下,而原来的BingMap control (在Microsoft.Phone.Controls.Maps命名空间,注意区别)已经不再推荐使用了。

这个CASE的需求非常简单,假设我们当前地图中的内容正在移动的时候,触发某些事件或者显示某些提示,而在停止移动之后,继而有另外一种提示,也就是需要找到一种方法,在WP8中,检测到当前地图正在移动或者停止移动。

 

我们的研究从Microsoft.Phone.Maps.Controls.Map 对象的若干个事件入手,但是发现都没有现成的能够满足我们要求的对象。诸如CenterChangedViewChangedZoomLevelChanged这些事件,也是只在某些如Center、ZoomLevel的相关属性变动时才会触发,但是并不能直接告诉我们当前地图正在移动或停止。

我们的解决方案是在CenterChanged事件中,加入一个DispatcherTimer,这个timer每间隔一定事件就进行检测,并和前一次timer触发时center有所改变而记录下的时间来进行比较,判断当前地图是否正在移动。代码实现如下:

 

  1: DateTime lastCenterChangeTime = DateTime.Now;
  2:  
  3: bool isChanging = false; //这里完全也可以设定成一个实现INotifyPropertyChanged的ViewModel的通知属性,这样一旦属性值改变了,就可以通过绑定反馈到视图页面
  4:  
  5:  
  6:  
  7: private DispatcherTimer notifyCenterChangedTimer;
  8: const int timerInterval = 100; //timer的执行间隔
  9: const int changeMinInterval =300;//最小触发地图位置变动的时间间隔
  10:  
  11: private void sampleMap_CenterChanged(object sender, MapCenterChangedEventArgs e)
  12:  
  13: {
  14:  
  15:     if (notifyCenterChangedTimer == null)
  16:  
  17:     {
  18:  
  19:         notifyCenterChangedTimer = new DispatcherTimer ();
  20:  
  21:         notifyCenterChangedTimer.Interval = TimeSpan.FromMilliseconds(timerInterval);
  22:  
  23:         notifyCenterChangedTimer.Tick += (timerSender, timerE) => {
  24:  
  25:  
  26:  
  27:             if ((DateTime.Now - lastCenterChangeTime).Milliseconds > changeMinInterval && isChanging == true)
  28:  
  29:             {
  30:  
  31:                isChanging = false;
  32:  
  33:  
  34:  
  35:                Debug.WriteLine("sampleMap_CenterChanged" + sampleMap.Center.ToString()); 
  36:                // 这里可以来调用实现定义的Event,实现事件驱动。
  37:  
  38:             }                
  39:  
  40:         };
  41:  
  42:  
  43:  
  44:         notifyCenterChangedTimer.Start();                
  45:  
  46:     }
  47:  
  48:      
  49:  
  50:  
  51:  
  52:     lastCenterChangeTime = DateTime.Now;
  53:  
  54:     isChanging = true;
  55:  
  56: }

 

这里可以根据具体需求,加入Event,触发相关事件,或者把isChanging属性作为一个通知属性,实现PropertyChanged函数。

 

更多参考:

 

Maps and navigation for Windows Phone 8

https://msdn.microsoft.com/en-us/library/windowsphone/develop/jj207045(v=vs.105).aspx

 

-Ranger