如何将 GPS 观察器移至 App.xaml 超类并将事件调度至其他页面/类?

2024-01-08

我是 silverlight/WPF 和 WP7 开发新手,但我熟悉使用控制台或 Windows 窗体开发 C#,所以请耐心等待!

我正在尝试使用 Silverlight SDK 和 Microsoft.Maps.MapControl 以及 System.Device.Location 类创建一个位置感知应用程序。我遇到的问题是从其他页面访问“观察者”。做这个的最好方式是什么。我想将它放在我的 GUI 页面类之外,以便在页面之间切换时,您不会检查 UI 线程上的新位置并执行重复的工作。

以下是我认为应该如何完成的概述(将 GPS 观察器移动到应用程序超类 -> 调度程序到事件更改的页面类),请有人纠正我!主要问题是如果没有实例化或静态方法,我无法访问 Page 类(MainPage.xaml 和 ListView.xaml)。如果我在页面上创建静态方法,它是无用的,因为我无论如何都无法与页面交互(例如设置位置更改的状态栏或将地图视图移动到新位置)。做这个的最好方式是什么?我曾想过只在 App 类中设置一个新的静态位置对象并从子类访问该对象,但这是手动操作。似乎调度程序是执行此操作的方法,但是有没有一种方法可以引用页面而无需实例化?

在我使用的 Windows 窗体应用程序中 -readonly FormClass form = (FormClass)Application.OpenForms["formname"];

这是我的代码的示例...

App.xaml.cs(应用程序类)- 显然这是整个 WP7 应用程序的超类,因此我将观察器放在这里。

Public Partial Class App : Application
{
Private IGeoPositionWatcher<GeoCoordinate> _watcher;
    Public App()
   {
     //App constructor
      //Mock GPS services on WP7 emulator
            if (_watcher == null)
            {
                var events = new[] {
                    new  GeoCoordinateEventMock { Latitude=33.43, Longitude=-112.02, Time=new TimeSpan(0,0,1) },
                   };
                _watcher = new EventListGeoLocationMock(events);
            }
            //add event handlers for statuschanged and positionchanged
            _watcher.StatusChanged += WatcherStatusChanged;
            _watcher.PositionChanged += WatcherPositionChanged;
            //start watcher
            _watcher.Start();
    }
#event handlers
       public void WatcherStatusChanged(object sender, GeoPositionStatusChangedEventArgs e)
        {
            Deployment.Current.Dispatcher.BeginInvoke(() => MainPage.MyStatusChanged(e));
          Deployment.Current.Dispatcher.BeginInvoke(() => OtherPage.MyStatusChanged(e));
        }
        public void WatcherPositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)
        {
            Deployment.Current.Dispatcher.BeginInvoke(() => MainPage.MyPositionChanged(e));
           Deployment.Current.Dispatcher.BeginInvoke(() => OtherPage.MyPositionChanged(e));
        }

}

MainPage.xaml.cs (MainPage class)-
public void MyPositionChanged(GeoPositionChangedEventArgs<GeoCoordinate> e)
{
//do some stuff
}
public void MyStatusChanged(GeoPositionStatusChangedEventArgs e)
{
//do some stuff
}

更新了-这就是我如何让它按照我需要的方式工作-

为我的位置创建了一个公共类 Loc-

 public class Loc
{

    private readonly GeoCoordinateWatcher _watcher;
    public Location CurLoc { get; set; }
    public string LocStatus { get; set; }

   public Loc()
    {
        if (_watcher != null) return;
        //---get the default accuracy-

        _watcher = new GeoCoordinateWatcher(GeoPositionAccuracy.Default)


                      {
                          MovementThreshold = 1000
                      };


        //add event handlers for statuschanged and positionchanged
        _watcher.StatusChanged += WatcherStatusChanged;
        _watcher.PositionChanged += WatcherPositionChanged;

        //start watcher
        _watcher.Start();
    }

   private void MyPositionChanged(GeoPositionChangedEventArgs<GeoCoordinate> e)
    {
        //called from the _watcher Position changed eventHandler

            CurLoc = new Location(e.Position.Location.Latitude, e.Position.Location.Longitude);



    }

    private void MyStatusChanged(GeoPositionStatusChangedEventArgs e)
    {
        //called from the _watcher position status changed event handler

        switch (e.Status)
        {
            case GeoPositionStatus.Disabled:
                LocStatus = "Location services disabled!";

                break;
            case GeoPositionStatus.Initializing:
                LocStatus = "Finding current location...";

                break;
            case GeoPositionStatus.NoData:
                LocStatus = "No location data available...";

                break;
            case GeoPositionStatus.Ready:
                LocStatus = "Found you";

                break;
        }
    }

    private  void WatcherStatusChanged(object sender, GeoPositionStatusChangedEventArgs e)
    {
        Deployment.Current.Dispatcher.BeginInvoke(() => MyStatusChanged(e));
    }

    private void WatcherPositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)
    {
        Deployment.Current.Dispatcher.BeginInvoke(() => MyPositionChanged(e));

    }
}

然后,我在 App.xaml.cs 类中将此类实例化为静态对象,以便我可以在应用程序操作期间利用这些信息。

public partial class App 
{
    /// <summary>
    /// Provides easy access to the root frame of the Phone Application.
    /// </summary>
    /// <returns>The root frame of the Phone Application.</returns>
    public PhoneApplicationFrame RootFrame { get; private set; }

           public static Loc AppLoc = new Loc();

然后在我的应用程序中,每当我需要访问位置信息时,我都可以使用-

App.AppLoc.CurLoc 或 App.AppLoc.LocStatus


使用 PhoneApplicationPage 方法 OnNavigateTo() 和 OnNavigedFrom() 来注册/取消注册位置接收。 观察者对象可以根据您的计划在应用程序类中定义。 各个页面可以使用静态属性Application.Current 来访问Application 对象。

我想你已经拥有了你需要的一切。

顺便说一句,您不需要事件分派,因为 GeoCoordinateWatcher 在 UI 线程上下文中传递事件。

旁注: 我们(Resco)刚刚发布了位置库的更新。或许本文 http://www.resco.net/developer/company/articles.aspx?file=articles/article32可以让您了解 GPS 和基于位置的服务可以做什么。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 GPS 观察器移至 App.xaml 超类并将事件调度至其他页面/类? 的相关文章

随机推荐

  • 将 Maven 项目的依赖项复制到特定文件夹

    我试图在特定文件夹中获取 Maven 项目所需的所有 jar 我用过mvn dependency copy dependencies命令 它给了我里面需要的jar文件taget dependeny folder 虽然我可以使用 move 或
  • 将异常写入 Windows 日志文件

    我想捕获异常并将其记录在 Windows 日志文件中 如何打开并写入 Windows 日志 您可以使用系统 诊断 EventLog WriteEntry http msdn microsoft com en us library syste
  • 如何在OpenCV中检测已知物体?

    我尝试在窗口中实时绘制形状 屏幕上的形状如缠结 矩形 圆形 半圆形和 Z 使用黄色 尺寸和形状可能与原始图像不同 但程序知道所有原始形状 因为它们是预定义的 我想知道如何识别正确的形状 举个例子 有可能做到这一点的方法吗 我可以为此使用模板
  • 通过在 XSLT 中硬编码节点值来对节点进行分组

  • sass 的 webpack 实时热重载

    我正在为 React Starter 构建一个工作流程 并且希望在更改我的 scss 文件时自动重新加载我的浏览器 目前 当我在 index js 文件 设置为入口点 中进行更改时 webpack 将热重载 但是 当我在 scss 文件中更
  • 下载并缓存 UITableViewCell 中的图像

    注意 请勿使用图书馆 这对我来说很重要 值得学习 此外 关于这个问题有各种各样的答案 但我发现没有一个很好地解决了这个问题 请不要标记为重复 提前致谢 我遇到的问题是 如果您在表格中滚动得非常快 您会看到旧图像并闪烁 我读到的问题的解决方案
  • 将值插入到空的 multidim 中。 numpy 数组 [重复]

    这个问题在这里已经有答案了 我需要创建一个形状的空 numpy 数组 10 10 3 意味着我不知道将插入多少个元素 然后我有很多形状的 numpy 数组 1 10 10 3 我想将其一一插入到准备好的数组中 所以 标记将随着插入的元素而增
  • 相机在 Nougat 7.0 中无法工作

    我的相机代码适用于所有 Android 版本 但在 Nougat 7 0 中出现以下错误 java lang NullPointerException Attempt to invoke virtual method java lang S
  • JS获取生成的textnode的值

    我在 for 循环中有这个 Javascript renderAElements i document createElement a renderAElements i setAttribute href renderAElements
  • Pandas read_csv 中的分段错误

    我在 Os X 10 9 上安装了 Python 2 7 5 Pandas 版本为 0 12 0 943 gaef5061 当我下载时这个 train csv 文件 http www kaggle com c crowdflower wea
  • 谁能解释一下这个密码匹配指令吗?

    谁能解释一下这段代码是如何工作的 HTML 标记
  • MPI_Comm_spawn 和 MPI_Reduce

    我有两个程序 主人 产生 工作人员 执行一些计算 我希望主人从工作人员那里获取结果并存储总和 我正在尝试使用 MPI Reduce 从工作人员收集结果 工作人员使用 MPI Reduce 将结果发送给主机 MPI Comm 我不确定这是否正
  • 蓝牙无法在后台模式下扫描附近的设备 Android 11+

    我尝试在后台模式下扫描附近的蓝牙设备 但它在 Android 11 等某些设备上不起作用 这是我的示例代码 在前台工作得很好 授予所有权限
  • chrome mobile和safari mobile中的陀螺仪值不同

    我目前正在构建一个小型全景照片查看器 它可以选择使用陀螺仪导航场景 我从 deviceOrientation 事件中获取数据 并将欧拉角转换为旋转矩阵 然后对其进行一些变换 最终通过 3dMatrix 变换移动 css 立方体 我的问题是
  • Bootstrap 材料设计 CDN

    我想使用 Bootstrap Material design github 页面说我可以从jsdelivr com http www jsdelivr com bootstrap material design 但随后入门 https fe
  • 可滚动元素的顶部被隐藏[重复]

    这个问题在这里已经有答案了 我正在开发一个项目 其中包括一个带有可滚动单元格的表格 这看起来可能不是使用表格的最优雅的方式 但这正是我的用例的方法 不幸的是 我的单元格内容的顶部仍然隐藏 我无法滚动到它 这是该项目的一个非常小的样本 一个大
  • 如何将相同的元素添加到javascript数组n次

    var fruits fruits push lemon lemon lemon lemon 与其推送相同的元素 不如这样编写一次 fruits push lemon 4 times 对于基元 使用 fill var fruits new
  • 创建 MSBuild 自定义任务以在*编译之前*修改 C# 代码

    我想创建一个自定义 MSBuild 任务 在 csc exe 编译我的 cs 文件之前更改它们 但是 当然 这不会就地修改它们 我不希望触及实际的源文件 我知道 PostSharp 和其他 NET AOP 框架 但它们不是这个特定项目的选择
  • 将逗号分隔的浮点数字符串转换为列表?

    我需要定义一个函数txtnum L 需要一串逗号分隔的浮点数 例如 1 5 2 5 3 5 作为参数并将其转换为列表 1 5 2 5 3 5 我尝试过使用 split join map 等 并且无法获取任何内容来返回不包含引号的列表 我对
  • 如何将 GPS 观察器移至 App.xaml 超类并将事件调度至其他页面/类?

    我是 silverlight WPF 和 WP7 开发新手 但我熟悉使用控制台或 Windows 窗体开发 C 所以请耐心等待 我正在尝试使用 Silverlight SDK 和 Microsoft Maps MapControl 以及 S