我正在尝试在使用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
吗?
答案 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;
// ...
}