使用NFC与Mvx WP8应用程序

时间:2013-07-04 13:05:10

标签: c# windows-phone-8 nfc mvvmcross

我正在尝试在使用MvvmCross框架的Windows Phone 8应用程序中使用NFC。现在,您通常会通过向Extension添加WMAppManifest.xml来订阅在WP8上接收NFC事件,如下所示:

<Extensions>
    <Protocol Name="my-resource" NavUriFragment="encodedLaunchUri=%s" TaskId="_default" />
</Extensions>

这将启动_default任务,如果它找到以my-resource://开头的uri,则在新项目中MainPage.xaml。在这种情况下,我将其设置为Views\ScanView.axml,即MvxPhonePage

然后,要获取_default任务中的数据,您可以覆盖OnNavigatedTo并抓取e.Uri,这是来自NFC标记的数据。即:/Protocol?encodedLaunchUri=my-resource://ni?EkkeEkkeEkkeEkkePtangyaZiiinngggggggNi

现在似乎MvxPhonePage会自行覆盖OnNavigatedTo并将其用于某些保存状态。所以我的问题是。如何获得原始Uri而不是保存状态?

我可以使用MainPage.axml解决这个问题,然后在我完成加载NFC功能后导航到Views\ScanView.axml吗?

2 个答案:

答案 0 :(得分:2)

我通过创建自定义AppStart解决了这个问题,这个问题在本Slide Deck中进行了简要描述,Stuart Lodge告诉我这一点。

因此,在我的ScanViewModel中,我添加了一个Init(string url)方法,该方法使用额外的参数处理导航,在这种情况下我想要的Url,然后我可以按照我的意愿处理它。

在通常调用App.xaml.cs的{​​{1}}方法的Start()中,我添加了一些条件:

AppStart

然后我必须创建自己的var start = Mvx.Resolve<IMvxAppStart>(); var url = navigatingCancelEventArgs.Uri.ToString(); if(url.StartsWith(@"/Protocol?encodedLaunchUri=my-resource") start.Start(url.SubString("/Protocol?encodedLaunchUri=".Length)); else start.Start();

AppStart

我使用public class MyCustomAppStart : MvxNavigatingObject, IMvxAppStart { public void Start(object hint = null) { if(hint is string) ShowViewModel<ScanViewModel>(new {url = (string)hint}); else ShowViewModel<ScanViewModel>(); } } MvxApplcation方法进行实例化:

Initialize

然后我在ViewModel的RegisterAppStart(new MyCustomAppStart()); 中获得了所需的网址:

Init

答案 1 :(得分:0)

另一种方法是定义自定义UriMapper以捕获并验证外部启动URI,然后返回要启动的实际页面的URI。这样就可以使外部启动逻辑远离页面导航逻辑。

请参阅UriMapperBase文档了解基础知识。您需要在正确的位置将UriMapper添加到PhoneApplicationFrame

在App.xaml.cs中:

// Do not add any additional code to this method
// ;)
private void InitializePhoneApplication()
{
    if (phoneApplicationInitialized)
        return;

    // Create the frame but don't set it as RootVisual yet; this allows the splash
    // screen to remain active until the application is ready to render.
    RootFrame = new PhoneApplicationFrame();

    // TODO: Add custom UriMapper here
    RootFrame.UriMapper = new MyCustomUriMapper();

    RootFrame.Navigated += CompleteInitializePhoneApplication;

    // ...
}