当我调用NavigateService.Navigate()时,Windows Phone应用程序调用MapUri()两次

我最近添加了一个自定义UriMapper,用于在从IE打开文件时将文件保存到我的应用程序隔离存储中。 这个代码看起来像这样:

class AssociationUriMapper : UriMapperBase { public override Uri MapUri(Uri uri) { var tempUri = uri.ToString(); if (tempUri.Contains("/FileTypeAssociation")) { int fileIdIndex = tempUri.IndexOf("fileToken=") + 10; string fileId = tempUri.Substring(fileIdIndex); SaveFileToIsolatedStorage(fileId); return new Uri("/MainPage.xaml", UriKind.Relative); } return uri; } } 

InitializePhoneApplication()中我做了一个

 RootFrame.UriMapper = new AssociationUriMapper(); 

当然,我已经将扩展标记添加到WMAppManifest.xml

这一切都很好……但我发现了一个奇怪的行为。 每次从IE打开文件时,我都会得到两份文件。 当我在被覆盖的MapUri中放置一个断点时,每次应用程序从IE自动启动时它会被击中两次。

当我开始进一步调查时,我注意到只要我调用NavigateService.Navigate()就会发生这种情况。 但是当我调用NavigateService.GoBack时

有谁知道为什么会这样? 为什么在调用Navigate()MapUri()调用了两次? 是否在创建页面的新实例时发生了什么? (我注意到当我们调用Navigate()时会创建一个新的被调用页面实例,但是当我们调用GoBack()时,我们会检索已经创建的页面实例(我们导航过)。

编辑:
我现在从头开始做了一个小测试应用程序。 结果是一样的。 如果我有一个inheritance自UriMapperBase的类并重写MapUri方法, 那么只要我导航到应用程序或在应用程序中调用NavigateService.Navigate() ,就会调用两次MapUri

我的问题的明显解决方法当然是有一个单独的页面,应用程序导航到该页面调用SaveFileToIsolatedStorage() 。 但是,这仍然没有回答为什么行为是这样的问题。

尝试使用ViewModel而不是代码通过MainPage的XAML连接UriMapper。

我的代码中有些作弊只保留一个事件。

  private static string lockUri = ""; public override Uri MapUri(Uri uri) { lock (lockUri) { if (lockUri != uri.ToString()) { lockUri = uri.ToString(); return null; } } // Your code to route here } 

这就是我做的:

 public class AppUriMapper : UriMapperBase { public static bool IsNavigating = false; public override Uri MapUri(Uri uri) { var endUri = uri; if (IsNavigating) { IsNavigating = false; //blabla...... } System.Diagnostics.Debug.WriteLine("goto: [origin] {0} [dest] {1}", uri, endUri); return endUri; } } 

在App.cs中:

 RootFrame.Navigating += (s, e) => { AppUriMapper.IsNavigating = true; System.Diagnostics.Debug.WriteLine("goto: [mode] {0}, [uri] {1}", e.NavigationMode, e.Uri); }; 

看起来不错