PositionChange 中的代码是上次讲地图的时候写的code添加了一个图层来标记当前位置,当然 args.Position.Coordinate 中的属性就是我们想得到的经纬度信息了
void geolocator_PositionChanged(Geolocator sender, PositionChangedEventArgs args) { Dispatcher.BeginInvoke(() => { if (!MyMap.MapElements.Contains(MPL)) MyMap.MapElements.Add(MPL); CurrenLocation = new GeoCoordinate(args.Position.Coordinate.Latitude, args.Position.Coordinate.Longitude); MPL.Path.Add(CurrenLocation); MyMap.SetView(CurrenLocation, 15, MapAnimationKind.Parabolic); MyMap.Layers.Clear(); MapOverlay MyOverlay = new MapOverlay(); MyOverlay.Content = GetGrid(); MyOverlay.GeoCoordinate = new GeoCoordinate(CurrenLocation.Latitude, CurrenLocation.Longitude); MyOverlay.PositionOrigin = new Point(0, 0.5); MapLayer MyLayer = new MapLayer(); MyLayer.Add(MyOverlay); MyMap.Layers.Add(MyLayer); }); }
其次再给大家介绍如何使应用在后台继续跟踪定位
上面我只是实现了一个定位应用和WP7样的在后台不会继续工作,接下来我对这个项目稍作修改 让大家看看怎么做一个基于定位的后台应用。
首先呢我们需要手动修改Manifest文件,也就是右键Manifest文件文本编辑,在Tasks 下 DefaultTask节点中添加 BackgroundExecution节点如下:
<Tasks> <DefaultTask Name="_default" NavigationPage="MainPage.xaml"> <BackgroundExecution> <ExecutionType Name="LocationTracking" /> </BackgroundExecution> </DefaultTask> </Tasks>
之后呢我们打开 项目文件中的 App.xaml 在shell:PhoneApplicationService 中注册 RuningInBackground 事件用来标记此应用以及跑在后,并且我们声明两个静态属性 分别是 Geolocator 和 RunningInBackground,作用是在应用程序中共享状态。
public static Geolocator Geolocator { get; set; } public static bool RunningInBackground { get; set; } private void Application_RunningInBackground(object sender, RunningInBackgroundEventArgs args) { RunningInBackground = true; // Suspend all unnecessary processing such as UI updates } private void Application_Activated(object sender, ActivatedEventArgs e) { RunningInBackground = false; }
分别在声明周期的 RunningInBackground 和 Activated 事件中标记应用程序的后台运行情况,细心的同学可能已经发现我在前面声明 Geolocator 的时候已经是赋值给 App.Geolocator 以确保在后台也可以持续访问该对象