3

我来自 Android 背景,正在进入 Windows Phone 8。

我有一个使用相机解码 QR 码的页面,它工作正常。在 Android 中,我将使用 Intent 启动此 Activity StartActivityForResult,然后它将解码后的值返回给原始 Activity。

我已经搜索但在 Windows Phone 8 中找不到明显的等价物。我目前的想法是使用包含解码值的查询字符串导航到调用页面并更改返回堆栈,但这似乎有点混乱。

问题

是否有与android中的过程等效的方法,如果有的话,有人可以概述该方法,以便我可以看到它的实际效果吗?

4

1 回答 1

2

首先,在 WP8 中没有这样的东西,所以你需要一个解决方法。解决方法可能不同,链接的问题(和答案)是潜在的方法之一。我个人这样做有点不同。我将在这里描述我当前项目的架构,尽管它可能不适用于您的情况,因为我的应用程序很大并且结构复杂。但我将尝试解释如何将其应用于您的情况。

特别是,我当前的应用程序包含所谓的服务(只是我的名字,不是标准的)。它们具有不同的范围(有些被 1 页使用,有些是应用程序的全局)、不同的生命周期等等。本质上,每个服务都是一个实现定义良好的接口的类,以便其他服务可以使用它。

接下来,服务可以相互依赖。我正在使用 Ninject 框架进行依赖注入。本质上,如果服务 A 依赖于服务 B,它会导致如下代码:

public class B : IB
{
...
}
public class A
{
    IB b;
    public A(IB b)
    {
        this.b = b;
    }
}

其中 IB 是服务 B 实现的接口。

然后我有视图模型(是的,我正在使用 MVVM,如果你想构建一个相当大的 WP8 应用程序,你可能也应该这样做)。视图模型使用服务来执行应用程序功能。一些服务被多个视图模型使用。例如,我有一项服务从 Web 获取一些数据,并通过定期轮询使其保持最新状态。该 Web 数据在应用程序的多个页面中使用,因此应该在不同的视图模型之间共享。再次通过依赖注入实现,让所有感兴趣的视图模型都接受这个服务实例作为构造函数参数。

public class MainPageViewModel : INotifyPropertChanged
{
    private string webData;
    public MainPageViewModel(IWebDataService service)
    {
        webData = service.CurrentWebData;
        service.WebDataChanged += (o, e) => webData = service.CurrentWebData;
    }
    ...
}

public class DetailPageViewModel : INotifyPropertChanged
{
    private string webData;
    public DetailPageViewModel(IWebDataService service)
    {
        webData = service.CurrentWebData;
        service.WebDataChanged += (o, e) => webData = service.CurrentWebData;
    }
    ...
}

public class WebDataService : IWebDataService
{
    public string CurrentWebData;
    public event EventHandler WebDataUpdated;
    ...
}

Ninject 允许我实例化 IWebDataService 的单个实例,以便主页面和详细信息页面共享它的同一个实例。当 web 数据更新时,会触发一个事件,以便两个视图模型都可以更新它们的 web 数据实例,并将这些新数据推送到视图。

所以这就是我的做法。您可能会重用此架构的某些部分,例如让不同页面可访问某个类的单例实例。一个页面将一些新数据放入该单例实例,并且当数据更新时(事件触发或在构造过程中,如果垃圾收集器有足够的时间来杀死现有页面和/或视图模型实例),另一个页面读取更新的数据。他们就是这样分享的。

如果您希望我更深入地了解某些主题的详细信息,请随时在评论中提问。Windows Phone 非常欢迎 Android 开发人员。:)

于 2013-05-16T18:20:50.320 回答