发布网友 发布时间:2022-04-25 00:04
共1个回答
热心网友 时间:2023-10-16 16:36
将ID_CAP_LOCATION 添加到应用清单 XML 文件中。在“解决方案资源管理器”中,展开“属性”文件夹,然后双击 WMAppManifest.xml。在清单设计器的“功能”选项卡上,选中 ID_CAP_LOCATION 旁边的复选框。通过修改应用清单文件启用后台执行。对于此任务,您需要直接编辑应用清单,而不是使用清单编辑器。为此,右键单击 WMAppManifest.xml,单击“打开方式”,然后选择“XML(文本)编辑器”。使用以下代码覆盖 DefaultTasks 元素: XAML <DefaultTask Name="_default" NavigationPage="MainPage.xaml"> <BackgroundExecution> <ExecutionType Name="LocationTracking" /> </BackgroundExecution> </DefaultTask>在App.xaml 中,使用以下代码覆盖 shell:PhoneApplicationService 元素。这将为 RunningInBackground 事件注册事件处理程序。 XAML <shell:PhoneApplicationService Launching="Application_Launching" Closing="Application_Closing" Activated="Application_Activated" Deactivated="Application_Deactivated" RunningInBackground="Application_RunningInBackground"/> 在App.xaml.cs 中,添加声明以便使用 Windows.Devices.Geolocation 命名空间。在App.xaml.cs 中,声明一些将作为应用程序的全局变量的静态变量。其中包括一个可以在页面和布尔变量之间共享的 Geolocator 对象 RunningInBackground,将用于跟踪应用是否在后台或前台运行。这使应用在后台运行时能够挂起不必要的任务,例如更新 UI。 C# publicstatic Geolocator Geolocator { get; set; } publicstaticbool RunningInBackground { get; set; } 在App.xaml.cs 中,添加 RunningInBackground 事件处理程序。当它活跃地跟踪位置时,在用户导航离开应用并且应用开始在后台运行时会引发此事件。在此事件处理程序中,RunningInBackground 全局变量设置为 true。 C# privatevoid Application_RunningInBackground(object sender, RunningInBackgroundEventArgs args) { RunningInBackground = true; // Suspend all unnecessary processing such as UI updates } 在App.xaml.cs 中,更新 Application_Activated 方法以将 RunningInBackground 全局变量设置回 false。如果应用正在后台运行,并且用户启动了该应用(例如通过点击应用的开始图块),将调用此方法(Activated 事件的处理程序)。此时,应用应恢复前台任务,比如更新 UI。 C# privatevoid Application_Activated(object sender, ActivatedEventArgs e) { RunningInBackground = false; } 当位置应用在后台运行时,它处理应用重启的方式与标准应用相比稍有不同。此示例应用使用了两个页面,以便您能够了解其工作方式。第一页将链接到第二页,这将实现位置跟踪。在 MainPage.xaml 中,将名为 ContentPanel 的 Grid 元素替换为以下代码。这会添加一个 HyperlinkButton,将导航至应用的另一页面。 XAML <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <HyperlinkButton NavigateUri="/Page2.xaml" Content="go to page 2"/> </Grid> 将第二个页面添加到应用,方式是进入“项目”菜单,单击“添加新项...”,然后选择“Windows Phone 纵向页面”。将新页面命名为“Page2.xaml”。在Page2.xaml 中,将名为 ContentPanel 的 Grid 元素替换为以下代码。这会添加两个 TextBlock 控件,以在应用在后台运行时显示纬度和经度。 XAML <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <StackPanel> <TextBlock x:Name="LatitudeTextBlock" Text="latitude"/> <TextBlock x:Name="LongitudeTextBlock" Text="longitude"/> </StackPanel> </Grid> 重写OnNavigatedTo(NavigationEventArgs) 方法以初始化 Geolocator 对象(如果尚未初始化),同时挂接 PositionChanged 事件的处理程序。在这里,您还可以挂接 StatusChanged 事件。将以下方法粘贴到 Page2.xaml.cs 中。 C# protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { if (App.Geolocator == null) { App.Geolocator = new Geolocator(); App.Geolocator.DesiredAccuracy = PositionAccuracy.High; App.Geolocator.MovementThreshold = 100; // The units are meters. App.Geolocator.PositionChanged += geolocator_PositionChanged; } } 在Page2.xaml.cs 中,添加 OnRemovedFromJournal(JournalEntryRemovedEventArgs) 方法的重写。当页面从应用的日记移除时,会调用此方法。这意味着,如果应用再次显示此页面,将创建新的实例。在此方法中,删除事件处理程序,并将 Geolocator 设置为 null。 C# protected override void OnRemovedFromJournal(System.Windows.Navigation.JournalEntryRemovedEventArgs e) { App.Geolocator.PositionChanged -= geolocator_PositionChanged; App.Geolocator = null; } 实现PositionChanged 事件处理程序。检查全局变量 RunningInBackground 的值。如果值为 false,则应用在后台运行,并且 BeginInvoke(Action) 被用于更新 UI 线程上具有当前位置的文本块。如果值为 true,则应用正在后台运行。不应更新 UI。相反,在本示例中,启动了具有当前位置的 ShellToast。