1

我正在尝试在使用 MvvmCross 框架的 Windows Phone 8 应用程序中使用 NFC。现在通常您通过添加类似这样的Extension方式来订阅接收 WP8 上的 NFC 事件:WMAppManifest.xml

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

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

然后要获取_default任务中的数据,您将覆盖OnNavigatedTo并获取e.UriNFC 标签中的数据。即:/Protocol?encodedLaunchUri=my-resource://ni?EkkeEkkeEkkeEkkePtangyaZiiinngggggggNi

现在看来,MvxPhonePage覆盖OnNavigatedTo本身并用于某些保存状态。所以我的问题是。如何获取原始 Uri 而不是保存状态?

我可以通过使用解决它,MainPage.axml然后当我完成加载 NFC 的东西时导航到Views\ScanView.axml

4

2 回答 2

2

我通过创建一个自定义解决了这个问题,该自定义AppStart在这个幻灯片中进行了简要描述,斯图尔特洛奇告诉我看。

所以在我ScanViewModel添加了一个Init(string url)方法,它处理带有额外参数的导航,在这种情况下是我想要的 Url,然后我可以在那里处理它。

App.xaml.cs你通常调用我的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方法中实例化:

RegisterAppStart(new MyCustomAppStart());

Init然后我在 ViewModel中获得所需的 Url :

public void Init(string url)
{
    //Whatever I want, whatever I need
}
于 2013-07-04T14:08:29.170 回答
0

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

有关基础知识,请参阅UriMapperBase文档。您需要UriMapperPhoneApplicationFrame正确的位置添加 。

在 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;

    // ...
}
于 2013-07-04T13:46:37.163 回答