49 Click="StartButton_Click"
50 x:Name="StartButton"/>
51 </Grid>
52 </Grid>
53 </Grid>
54 </Grid>
GridUtilsis 是我几年前写的一个工具类,可方便定义网格(Grid)的行列属性(该类适用于 WPF,Silverlight 以及Windows Phone)。如果你依序从头编写这个应用,为了能使用地图,就得加入下面的命名空间定义:
1 xmlns:maps="clr-namespace:Microsoft.Phone.Maps.Controls;assembly=Microsoft.Phone.Maps"
在构建与运行程序之前,你得先开启地图功能。打开 '''WPAppManifest.xml''',找到Capabilities 标签然后选中 ID_CAP_MAP,这时ID_CAP_LOCATION也(自动)被选中:
Capabilites 用于决定你的应用中打算加入的手机功能,从而方便用户了解这个应用能做些什么。
选中以上功能后,构建运行程序你就可以看到如上所述的界面。
地图控件的其中一项改进即它是完全基于矢量的(Windows Phone 7中的地图是基于位图),这便使得地图在缩放时的过渡更加平滑,而且还可以进行3D变换(稍后将会看到)。对我们的路线跟踪应用而言,地图控件还有其他一些有用的功能,如步行与路标。 可以通过如下的代码设置:
1 <!-- the map -->
2 <maps:Map x:Name="Map"
3 PedestrianFeaturesEnabled="True"
4 LandmarksEnabled="True"
5 ZoomLevel="16"/>
经过以上设置,地图将会显示一些有用的东西,比如街道、路标等信息:
(顺便插一句,我可没想把这50行XAML算到我的代码总行数里哈 :-P)
Windows Phone 8中的地图还有很多新特性我没在这个程序里用到。比如你可以用下新的ColorMode属性,它能让你渲染一幅‘暗色模式’的地图以便在低光环境下查看,甚至可以让这个路线跟踪应用根据当天的时间自动选择ColorMode!
定时执行
当"Start"按钮按下后程序就开始的GPS接收器就开始追踪用户的位置来标注用户的行动轨迹,如果有兴趣的话还可以计算已经跑步的时间和统计各种数据,我们先从两项功能中简单的一项开始,定时执行.当我们点击开始按钮后 DispatcherTimer就开始执行了并且记录下按钮按下的时间,另一个timer定时器来更新显示已经执行了多长时间.
01 public partial class MainPage : PhoneApplicationPage
02 {
03 private DispatcherTimer _timer = new DispatcherTimer();
04 private long _startTime;
05
06 public MainPage()
07 {
08 InitializeComponent();
09
10 _timer.Interval = TimeSpan.FromSeconds(1);
11 _timer.Tick += Timer_Tick;
12 }
13
14 private void Timer_Tick(object sender, EventArgs e)
15 {
16 TimeSpan runTime = TimeSpan.FromMilliseconds(System.Environment.TickCount -
_startTime);
17 timeLabel.Text = runTime.ToString(@"hh\:mm\:ss");
18 }
19
20 private void StartButton_Click(object sender, RoutedEventArgs e)
21 {
22 if (_timer.IsEnabled)
23 {
24 _timer.Stop();
25 StartButton.Content = "Start";
26 }
27 else
28 {
29 _timer.Start();
30 _startTime = System.Environment.TickCount;
31 StartButton.Content = "Stop";
32 }
33 }
34 }
以上代码完成后,点击"start"按钮后定时器就开始执行了
位置追踪
下一步需要做的就是在计时器运行的同时来记录位置信息。Window Phone的API 库有GeoCoordinateWatcherclass 类, 其中的一个方法 PositionChangedevent 可以用来记录用户的位置和路径。 而后用MapPolyLine方法可以很简单地在地图上用地理坐标来渲染出用户的路径。每一次这个事件被激活,就会在地图上增加一个点,具体代码如下:
01 public partial class MainPage : PhoneApplicationPage
02 {
03 private GeoCoordinateWatcher _watcher = new GeoCoordinateWatcher
(GeoPositionAccuracy.High);
04 private MapPolyline _line;
05 private DispatcherTimer _timer = new DispatcherTimer();
06 private long _startTime;
07