繁体   English   中英

为什么Silverlight / WP7上的NavigationService在类上使用字符串?

[英]Why does NavigationService on Silverlight/WP7 uses Strings over Classes?

鉴于C#更倾向于强类型语言,设计人员为什么选择基于URI而不是类的导航?

NavigationService.Navigate(new Uri("/MyPage.xaml", UriKind.Relative)) 

如果缺少MyPage,则在运行时失败。

如果有一种方法支持将PhoneApplicationPage作为参数传递,例如

NavigationService.Navigate(new MyPage()); 

导航相关的错误可以在编译时捕获。

为什么这不是Silverlight / WP7中的固有设计?

只有WP7开发工具团队可以肯定地说,但如果没有他们的投入,我会尽力而为。 我的猜测是,它是由于使用插件框架进行客户端应用程序开发而产生的。 Web Silverlight甚至根本没有导航的概念。 您可以在应用程序主框架之间切换框架,但这并不是导航。 因此,当要求他们使用Silverlight作为WP7的客户端应用程序工具时,他们必须决定如何导航。

如果您是一个一直在构建Internet应用程序的团队,那么解决导航问题的最明显方法就是使某些内容尽可能接近Internet模型。 这使开发人员可以将Internet应用程序带到浏览器,并进行最少的代码重写。 想想看,如果您有一个使用相对URL在应用程序页面之间移动的Web应用程序,则WP7可以重用大多数导航逻辑,而只需稍作修改即可使用新的NavigationService。 这也最小化了WP7版本必须对核心Silverlight进行的更改,从而使所有内容更易于在平台之间保持同步。

显然,这不是最佳的处理方式,它使页面之间的状态维护成为最麻烦的事情,但是我至少可以理解为什么他们决定这样做。 以我的经验,主要缺陷是对导航目标进行运行时检查(而不是使用类进行编译时),传递参数(每个页面都需要一个OnNavigatedTo来解析变量)以及维护页面之间的非平凡对象(我已经仅用于使用Singletons来保存相关对象,以作为穷人的缓存。 我希望至少对7.5或8中的导航范例进行一些修改,但我没有屏息。

Silverlight / WP7导航服务在很多方面都相当缺乏,但是周围有很多框架可以让您导航到ViewModel / View。 一些例子:

Caliburn Micro (MVVM框架)中,您有一种仅使用ViewModels处理导航的好方法-“ 屏幕,导体和合成物

此导航模型是从桌面上的Silverlight(及其之前的WPF)继承的。 a String-based model, but rather a URI-based model. 重要的是要注意:这基于字符串的模型,而是基于URI的模型。 这里的区别是关键:我们不是在谈论指向某个XAML的任意字符串,而是在为应用程序中页面的资源提供通用定位符。 通过以这种方式解决导航问题,您的应用程序实际上具有多个入口点-应用程序中的任何URI都可以是有效的入口点。 通过使导航基于URI,您可以确保与您正在查看的内容相关的应用程序“状态”可以序列化,可以随时从任何方向进行访问,等等。

例如,假设您有一个要在应用程序中打开的网页(或电子邮件或其他任何地方)上的链接。 单击该链接,由于URI完全描述了应用程序应显示的资源(例如,目录中的项目,搜索中的过滤器等),因此您可以直接跳至该链接(也称为深层链接)。 这不是在Windows Phone 7上实现的(至少不是从其他应用程序实现的,但实际上是后退按钮等的工作方式),但是该模型直接来自桌面上的Silverlight(导航框架位于Silverlight SDK中) ,您可以看到他们将来在Windows Phone上使用它的可能性。

同样,URI的强大之处在于它的通用性-这是一种识别资源的常用方法。 没有它,您就无法与想要导航到应用程序和应用程序本身的任何事物紧密结合。

还请记住,使用框架时,可以在Silverlight中使用路由将一个或多个用户友好的URL映射到同一.xaml文件。 如果仅指定视图类,则Silverlight将不知道要映射到哪个URL。

传递用于状态管理的查询参数可能很丑陋,但是它允许您的应用程序为无状态的,这具有一些优点(例如,深层链接),并且适合于HTTP Web应用程序的无状态性质。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM