2013-07-04 2 views
1

Я пытаюсь использовать NFC в приложении Windows Phone 8, которое использует структуру MvvmCross. Теперь обычно вы подписаться на получение события NFC на WP8 путем добавления Extension к WMAppManifest.xml так:Использование NFC с приложением Mvx WP8

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

Это запустит _default задачу, если она находит URI, начиная с my-resource://, который на свежий проект является MainPage.xaml. В этом случае я установил его в Views\ScanView.axml, который является MvxPhonePage.

Затем, чтобы получить данные в задаче _default, вы должны переопределить OnNavigatedTo и захватить e.Uri, который является данными из тега NFC. I.e .: /Protocol?encodedLaunchUri=my-resource://ni?EkkeEkkeEkkeEkkePtangyaZiiinngggggggNi.

Теперь кажется, что MvxPhonePage переопределяет OnNavigatedTo самостоятельно и использует его для некоторых состояний сохранения. Так что мой вопрос. Как получить исходный Uri вместо сохраненного состояния?

Могу ли я просто обойти его, используя MainPage.axml, а затем, когда я закончил загрузку материалов NFC, перейдите к Views\ScanView.axml?

ответ

2

Я решил эту проблему путем создания пользовательского AppStart, который кратко описанный в этом Slide Deck, что Стюарт Lodge сказал мне, чтобы посмотреть на.

В моем 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>(); 
    } 
} 

Что я создаю экземпляр в MvxApplcationInitialize метод:

RegisterAppStart(new MyCustomAppStart()); 

Тогда я получаю нужный адрес в Init в ViewModel:

public void Init(string url) 
{ 
    //Whatever I want, whatever I need 
} 
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; 

    // ... 
} 
Смежные вопросы