在WindowsPhone的屏幕之间导航是否有类型安全的方式?我正在寻找一种在我的应用程序中的屏幕之间导航的方法。基本上我到目前为止看到的是将字符串URI传递给NavigationService,并使用查询字符串参数NavigationService.Navigate(newUri("/MainPage.xaml?selectedItem="+bookName.Id,UriKind.Relative));我不是很喜欢这个,但归根结底是因为它需要神奇的字符串,而且它们会引起问题。理想情况下,我只创建一个我想导航到的类的实例,将参数作为参数传递给构造函数。是否可以?如果是这样,如何?尽管实际导航最终必须使用字符串,但您可以创建或使用类型安全的包装器。我建议看一下CaliburnMicro,即使您只是将它用于类型安全的导航。以下是有关在WP8中使用它的教程的片段:工具包附带的NavigationService以第一种方式支持ViewModel:我们声明我们想要显示的ViewModel,而不是声明我们希望用户访问的页面的URL看看(这是标准方法)。该服务将负责创建正确的URL并显示与视图模型关联的视图。或者您可以查看WindowsPhoneMVC,它也有一些类型安全的导航。您甚至可以提取导航代码并自己使用它,因为它已获得MS-PL许可。基本上,不,不是内置的。遗憾的是,像IRepository实例这样的复杂参数超出了Silverlight中的导航功能。我通常为此使用某种形式的IoC容器。更简单的POCO参数很容易序列化为字符串,但仍然需要魔术字符串和手动查询字符串解析。但是,您可以轻松地自己构建一些类型安全的东西。例如,这是我的方法。对于参数数据,我有一个名为“Extras”的类,它使用GetBool(string)、GetInt32(string)等方法包装字典,并具有静态工厂方法CreateFromUri(Uri);这对我的目的来说已经足够好了。我将其与类型安全导航结合使用。我是MVVM模式的忠实粉丝,我的每个页面都有一个几乎封装了所有逻辑的ViewModel。Pages与ViewModels的一对一关系使后者成为导航键的理想选择。结合属性和反射,我们给出一个简单的解决方案:publicclassNavigationTargetAttribute:Attribute{publicViewModelBaseTarget{get{返回目标;}}publicNavigationTargetAttribute(Typetarget){this.target=target;}}将其中一个放在具有正确ViewModel类型的每个页面上。[NavigationTarget(typeof(LoginViewModel))]publicclassLoginPage:PhoneApplicationPage{...}然后,在单独的NavigationManager类中,您可以执行以下操作:GetType().Assembly.GetTypes().Select(t=>new{Type=t,Attr=t.GetCustomAttributes(false).FirstOrDefault(attr=>attrisNavigationTargetAttribute)}).Where(t=>t.Attr!=null);就像那样,在您的应用程序中包含每个可导航类型的集合。从那里开始,将它们放入字典并不需要太多工作。如果您遵循放置页面的约定,您可以(例如)轻松地在类型和Uri之间转换......例如新Uri("/Pages/"+myPageType.Name+".xaml",UriKind.Relative)。添加对查询参数的支持并不多。最后,您会得到一个如下所示的方法:publicvoidNavigate(Typetarget,Extrasextras){TypepageType;if(navigationTargets.TryGetValue(target,outpageType)){varuri=CreateUri(pageType,extras);navigationService.NavigateTo(uri);}//这里的错误处理}最后,在页面的OnNavigatedTo方法中,我做了类似的事情:varextras=Extras.CreateFromUri(e.Uri);((ViewModelBase)DataContext).OnNavigatedTo(额外);最后,这给出了强类型导航的外观。这是一个简单的方法;这可以通过在导航属性中添加所需参数并在导航时验证它们来改进。它也不支持更复杂的导航类型,其中nav参数的值将决定最终目的地。尽管如此,这仍然适用于我90%的用例——也许它也适用于你。这里肯定省略了一些细节,例如如何获取NavigationService的实例-我今晚晚些时候可以处理更完整的示例,但这应该足以开始了。您可以使用PhoneApplicationService.State,它是字典PhoneApplicationService.State通常用于逻辑删除来存储应用程序的当前状态。但是,它可用于轻松地在页面之间传递数据。MSDN文档WindowsPhone应用程序在用户导航到另一个应用程序时停用。当用户返回到应用程序时,通过使用返回按钮或完成启动器或选择器任务,应用程序将重新激活。应用程序可以将临时应用程序状态存储在Deactivated事件的处理程序中的状态字典中。在Activated事件处理程序中,应用程序可以临时使用State字典中存储的值来临时应用状态。基本上你所做的是PhoneApplicationService.State.add(selectedName,yourobjectInstance);NavigationService.Navigate((newUri("/MainPage.xaml?selectedItem="+selectedName,UriKind.Relative)));然后在你的导航方法中你可以检索它YourObjectyourObjectInstance;varyourObj=PhoneApplicationService.State["yourObjectName"];yourObjectInstance=yourObjisYourObject?(yourObjasYourObject):null;这里更深入地了解如何使用这个WPF支持导航到创建的对象,但是WP8缺少Navigate重载。如果你不想硬编码XAML页面URI,您可以使用以下(有点脏)辅助函数来获取某些类的.xaml资源URI。staticUriGetComponentUri()whereT:DependencyObject,new(){returnBaseUriHelper.GetBaseUri(newT());}你然后可以修改该URL并导航到它:varbaseUri=GetComponentUri();//Uri="pack://application:,,,/MyProject;component/MainWindow.xaml"varpageUri=newUriBuilder(baseUri){Query="selectedItem="+bookName.Id};NavigationService.Navigate(pageUri);我们的解决方案效果很好:1。不要在页面Uris中使用查询字符串,这是所有MVVM,视图应该只显示内容,但加载和选择项目的实际逻辑在ViewModel中。2.创建带有const页面名称的类,每当你想导航时,只需使用:以上是C#学习教程:在WindowsPhone中的屏幕之间导航是否有类型安全的方式?如果分享的内容对你有用,需要了解更多C#学习教程,希望你多多关注——publicstaticclassP{publicconststringArticlePage="/Pages/ArticlePage.xaml";publicconststringOnlineSectionPage="/Pages/OnlineSectionPage.xaml";publicconststringGalleryPage="/Pages/GalleryPage.xaml";...}//在我们的视图模型中NavigationService.Navigate(P.ArticlePage);//在导航服务中publicvoidNavigate(stringpagePath){if(EnsureMainFrame()){mainFrame.Navigate(newUri(pagePath,UriKind.RelativeOrAbsolute));}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
