09 {
10 InitializeComponent();
11
12 //初始化一个line类用来记录路径
13 _line = new MapPolyline();
14 _line.StrokeColor = Colors.Red;
15 _line.StrokeThickness = 5;
16 Map.MapElements.Add(_line);
17
18 _watcher.PositionChanged += Watcher_PositionChanged;
19
20 //..计时器代码在此处省略..
21 }
22
23 //.. 计时器代码此处被省略<span></span> ...
24
25 private void StartButton_Click(object sender, RoutedEventArgs e)
26 {
27 if (_timer.IsEnabled)
28 {
29 _watcher.Stop();
30 _timer.Stop();
31 StartButton.Content = "Start";
32 }
33 else
34 {
35 _watcher.Start();
36 _timer.Start();
37 _startTime = System.Environment.TickCount;
38 StartButton.Content = "Stop";
39 }
40 }
41
42
43 private void Watcher_PositionChanged(object sender,
GeoPositionChangedEventArgs<GeoCoordinate> e)
44 {
45 var coord = new GeoCoordinate(e.Position.Location.Latitude,
e.Position.Location.Longitude);
46
47 Map.Center = coord;
48 _line.Path.Add(coord);
49 }
50 }
上面的代码可以就可以实现把用户的路径层加到地图上,如下图所示。
PositionChanged 事件可以进一步的扩展成计算总运行距离,卡路里消耗和速度.使用GeoCoordinate.GetDistanceTo可以用来计算两个地点之间的距离:
01 private double _kilometres;
02 private long _previousPositionChangeTick;
03
04 private void Watcher_PositionChanged(object sender,
GeoPositionChangedEventArgs<GeoCoordinate> e)
05 {
06 var coord = new GeoCoordinate(e.Position.Location.Latitude,
e.Position.Location.Longitude);
07
08 if (_line.Path.Count > 0)
09 {
10 // find the previos point and measure the distance travelled
11 var previousPoint = _line.Path.Last();
12 var distance = coord.GetDistanceTo(previousPoint);
13
14 // compute pace
15 var millisPerKilometer = (1000.0 / distance) * (System.Environment.TickCount -
_previousPositionChangeTick);
16
17 // compute total distance travelled
18 _kilometres += distance / 1000.0;
19
20 paceLabel.Text = TimeSpan.FromMilliseconds(millisPerKilometer).ToString(@"mm\:ss");
21 distanceLabel.Text = string.Format("{0:f2} km", _kilometres);
22 caloriesLabel.Text = string.Format("{0:f0}", _kilometres * 65);
23 }