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

Mug*_*nth 5 silverlight wpf strong-typing silverlight-4.0 windows-phone-7

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

NavigationService.Navigate(new Uri("/MyPage.xaml", UriKind.Relative)) 
Run Code Online (Sandbox Code Playgroud)

如果MyPage丢失,则在运行时失败.

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

NavigationService.Navigate(new MyPage()); 
Run Code Online (Sandbox Code Playgroud)

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

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

小智 1

此导航模型继承自桌面上的 Silverlight(以及之前的 WPF)。需要注意的是:这不是基于字符串的模型,而是基于 URI 的模型。这里的区别很关键:我们不是在谈论指向某个 XAML 的任意字符串,而是在谈论应用程序中的页面资源的通用定位器。通过以这种方式处理导航,您的应用程序实际上拥有多个入口点——应用程序中的任何 URI 都可以是有效的入口点。通过使导航基于 URI,您可以确保与您正在查看的内容相关的应用程序的“状态”可以被序列化、可以随时从任何方向访问等。

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

同样,URI 的强大之处在于它的通用性——它是识别资源的常用方法。如果没有它,您将陷入任何想要导航到您的应用程序和应用程序本身的紧密耦合。