Xamarin-将数据从特定于设备的代码传递回Xamarin表单

Xamarin-将数据从特定于设备的代码传递回Xamarin表单,xamarin,xamarin.ios,xamarin.android,xamarin.forms,Xamarin,Xamarin.ios,Xamarin.android,Xamarin.forms,全部,, 我有一个Forms/iOS/Android项目,除其他事项外,需要每隔一定时间从设备检索地理位置数据。经过一些研究,我发现正确的方法是在IOS和Android中使用后台服务,而不是尝试在表单中使用。我已经这样做了,IOS和Android都通过使用依赖项服务调用一个方法,每X分钟报告一次lat/long信息。因此,作为一个概念,一切都很好 现在,我正在尝试将主PCL项目中的所有内容连接起来,我希望得到一些关于最佳方法的建议。例如,在iOS中,我有一个事件处理程序,用于处理CLLocati

全部,, 我有一个Forms/iOS/Android项目,除其他事项外,需要每隔一定时间从设备检索地理位置数据。经过一些研究,我发现正确的方法是在IOS和Android中使用后台服务,而不是尝试在表单中使用。我已经这样做了,IOS和Android都通过使用依赖项服务调用一个方法,每X分钟报告一次lat/long信息。因此,作为一个概念,一切都很好

现在,我正在尝试将主PCL项目中的所有内容连接起来,我希望得到一些关于最佳方法的建议。例如,在iOS中,我有一个事件处理程序,用于处理CLLocationManager对象触发位置更改事件的时间。如何让我的表单项目知道这一点,并将新的lat/long值传递给父项目代码?这是我的第一个特定于设备的代码密集型项目,所以我在这里遇到了未知的麻烦


非常感谢您的建议。

这是一种非常常见的情况,可以通过几种不同的方式解决。我个人的偏好是遵循Xamarin.Forms插件中使用的模式。请看一下结构是如何构成的:

// Abstraction for the information you want to access in shared (PCL) code
public interface IGeolocator
{
    event EventHandler<PositionEventArgs> PositionChanged;
    ...
}
最后,它在共享代码中使用,可以使用单例,也可以使用
DependencyService.Get()

试试看
{
//单例使用
var定位器=CrossGeolocator.Current;
//依赖服务
//var locator=DependencyService.Get();
locator.DesiredAccuracy=50;
//订阅共享代码中的事件
locator.PositionChanged+=OnPositionChanged;
}
捕获(例外情况除外)
{
...
}

所有这些代码都可以找到。你也可以考虑使用这个插件。它还有一些你可能会觉得有用的其他功能。GitHub页面显示了如何开始使用它

这是一种非常常见的情况,可以通过几种不同的方法解决。我个人的偏好是遵循Xamarin.Forms插件中使用的模式。请看一下结构是如何构成的:

// Abstraction for the information you want to access in shared (PCL) code
public interface IGeolocator
{
    event EventHandler<PositionEventArgs> PositionChanged;
    ...
}
最后,它在共享代码中使用,可以使用单例,也可以使用
DependencyService.Get()

试试看
{
//单例使用
var定位器=CrossGeolocator.Current;
//依赖服务
//var locator=DependencyService.Get();
locator.DesiredAccuracy=50;
//订阅共享代码中的事件
locator.PositionChanged+=OnPositionChanged;
}
捕获(例外情况除外)
{
...
}

所有这些代码都可以找到。你也可以考虑使用这个插件。它还有一些你可能会觉得有用的其他功能。GitHub页面显示了如何开始使用它

这将是MessagingCenter的一个很好的用途:您是如何在PCL项目中调用依赖项服务的。我认为在调用PCL项目中的依赖项服务时,应该得到lat/long值。这将是MessagingCenter的一个很好的用途:您是如何调用PCL项目中的依赖项服务的。我认为在PCL项目中调用依赖项服务时,应该得到lat/long值。
try
{
  // Singleton usage
  var locator = CrossGeolocator.Current;

  // DependencyService
  // var locator = DepedencyService.Get<IGeolocator>();

  locator.DesiredAccuracy = 50;

  // Subscribing to event in shared code
  locator.PositionChanged += OnPositionChanged;
}
catch(Exception ex)
{
  ...
}