【发布时间】:2014-02-20 07:34:15
【问题描述】:
我最近添加了一个自定义 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();
当然,我已经将 Extensions 标签添加到 WMAppManifest.xml
这一切都很好......但我注意到一个奇怪的行为。每次从 IE 打开文件时,我都会得到两份文件。当我在覆盖的 MapUri 中放置一个断点时,每次应用程序从 IE 自动启动时它都会被命中两次。
当我开始对此进行进一步调查时,我注意到每当我打电话时都会发生这种情况 NavigateService.Navigate()。但当我调用 NavigateService.GoBack 时不会。
有人知道为什么会这样吗?为什么在调用 Navigate() 时会调用两次 MapUri()?创建页面的新实例时会发生这种情况吗? (我注意到,当我们调用 Navigate() 时,会创建一个被调用页面的新实例,但是当我们调用 GoBack() 时,我们会检索已创建的我们从中导航的页面)。
编辑:
我现在从头开始做了一个小测试应用程序。结果是一样的。如果我有一个继承自 UriMapperBase 并重写 MapUri 方法的类,则每当我导航到应用程序或调用 MapUri 时都会调用两次>NavigateService.Navigate() 在应用程序中。
对于我的问题,显而易见的解决方法当然是有一个单独的页面供应用程序导航到该页面并调用 SaveFileToIsolatedStorage()。但这仍然不能回答为什么行为是这样的问题。
【问题讨论】:
-
我也有同样的问题,我的应用程序的行为真的很烦人
-
是的。这很奇怪。它肯定与创建页面的新对象时如何调用事物有关。某种调用 MapUri() 两次的往返。无论如何,您可以将您的逻辑从 MapUri() 方法中移开吗?如果您在单独的视图中在 OnNavigatedTo() 中执行逻辑而不在构造函数中调用 Initialize(),然后导航回您要显示的页面,则逻辑将只运行一次,用户将看不到您的页面导航到,因为您没有初始化它。这就是我解决问题的方法。
-
感谢您的提示,它可能很有用
标签: c# map windows-phone uri navigateuri