本文共 5190 字,大约阅读时间需要 17 分钟。
在开发 Silverlight 应用程序时,导航是确保用户能够在不同页面之间顺利切换的关键功能。本文将详细介绍常见的导航方案,并提供如何将导航功能添加到应用程序的指导。
在 Silverlight 应用程序中,使用 Frame
和 Page
控件可以实现应用程序导航。Page
控件表示内容的分立部分,而 Frame
控件则作为 Page
控件的容器,用于管理页面的切换。Frame
控件的特点是仅显示当前加载的页面内容,当需要切换页面时,可以通过编程方式或用户操作来更新显示的页面。
对于 Silverlight 应用程序,建议将根视觉效果设计为包含可导航内容和固定 UI 组件(如页眉、页脚和导航边栏)的组合。Visual Studio 提供的 "Silverlight 导航应用程序" 模板可以生成包含固定 UI 组件的 XAML 文件,并为可导航内容提供框架支持。
为了实现用户友好的 URI 映射,可以将特定页面的 URI 映射设置为文件路径或占位符段。以下是 URI 映射的示例:
URI 模式 | URI 请求示例 | 解析后的 URI |
---|---|---|
"/Home" | "/Home" | "/Views/Home.xaml" |
"/{page}" | "/About" | "/Views/AboutPage.xaml" |
"/Product/{category}" | "/Product/bikes" | "/ContosoShop/Product.xaml?category=bikes" |
"/{reporttype}/{month}/{format}" | "/Sales/June/Short" | "/Views/Reports/Sales.xaml?time=June&show=Short" |
URI 映射可以灵活配置,通过定义占位符段和文本值来实现灵活的 URI 映射。请确保 URI 模式按照从具体到一般的顺序添加,以避免冲突。
为了实现页导航,Silverlight 提供了 NavigationService
类,提供了多种导航方式。开发者可以通过设置 Uri
属性或调用 Navigate
方法来实现导航功能。此外,Hyperlink
控件可以用于在应用程序的不同页面之间导航。
对于不嵌套在其他框架中的 Frame
控件,可以选择集成浏览器导航。这种方式允许用户通过浏览器的前进和后退按钮导航到应用程序的不同页面。同时,用户也可以通过直接输入 URI 来访问特定页面,这种方式非常适合需要在浏览器窗口中显示 Silverlight 应用程序的场景。
在某些情况下,应用程序需要提供指向外部资源的链接。外部导航可以通过 Hyperlink
控件实现,并且可以根据需要禁用或启用导航功能。为了确保应用程序安全,建议在初始化 Silverlight 插件时设置 enableNavigation
属性为 None
,以禁用所有外部导航。
以下是一个使用 URI 映射实现产品详细页面导航的示例代码:
Partial Public Class ProductDetail Inherits Page Public Sub New() InitializeComponent() End Sub Protected Overrides Sub OnNavigatedTo(ByVal e As NavigationEventArgs) GetProductDetail() SetButtonVisibility() End Sub Private Sub SetButtonVisibility() If (NavigationService.CanGoBack) Then BackNavButton.Visibility = Visibility.Visible Else BackNavButton.Visibility = Visibility.Collapsed End If If (NavigationService.CanGoForward) Then ForwardNavButton.Visibility = Visibility.Visible Else ForwardNavButton.Visibility = Visibility.Collapsed End If End Sub Private Sub BackNavButton_Click(ByVal sender As Object, ByVal e As RoutedEventArgs) If (NavigationService.CanGoBack) Then NavigationService.GoBack() End If End Sub Private Sub ForwardNavButton_Click(ByVal sender As Object, ByVal e As RoutedEventArgs) If (NavigationService.CanGoForward) Then NavigationService.GoForward() End If End Sub Private Sub GetProductDetail() Dim productID As String Dim svcContext As DataServiceContext svcContext = New DataServiceContext(new Uri("AdventureWorks.svc", UriKind.Relative)) If (Me.NavigationContext.QueryString.ContainsKey("ProductId")) Then productID = Me.NavigationContext.QueryString("ProductId") Else productID = App.Current.Resources("FeaturedProductID").ToString() End If svcContext.BeginExecute(new Uri("Product(" + productID + ")", UriKind.Relative), AddressOf loadProductCallback, svcContext) End Sub Private Sub loadProductCallback(ByVal asyncResult As IAsyncResult) Dim context As DataServiceContext context = asyncResult.AsyncState as DataServiceContext ListBox1.DataContext = context.EndExecute(asyncResult) End SubEnd Class
public partial class ProductDetail : Page{ public ProductDetail() { InitializeComponent(); } protected override void OnNavigatedTo(NavigationEventArgs e) { GetProductDetail(); SetButtonVisibility(); } private void SetButtonVisibility() { if (NavigationService.CanGoBack) { BackNavButton.Visibility = Visibility.Visible; } else { BackNavButton.Visibility = Visibility.Collapsed; } if (NavigationService.CanGoForward) { ForwardNavButton.Visibility = Visibility.Visible; } else { ForwardNavButton.Visibility = Visibility.Collapsed; } } private void BackNavButton_Click(object sender, RoutedEventArgs e) { if (NavigationService.CanGoBack) { NavigationService.GoBack(); } } private void ForwardNavButton_Click(object sender, RoutedEventArgs e) { if (NavigationService.CanGoForward) { NavigationService.GoForward(); } } private void GetProductDetail() { string productID; DataServiceContext svcContext = new DataServiceContext(new Uri("AdventureWorks.svc", UriKind.Relative)); if (this.NavigationContext.QueryString.ContainsKey("ProductId")) { productID = this.NavigationContext.QueryString["ProductId"]; } else { productID = App.Current.Resources["FeaturedProductID"].ToString(); } svcContext.BeginExecute(new Uri("Product(" + productID + ")", UriKind.Relative), loadProductCallback, svcContext); } private void loadProductCallback(IAsyncResult asyncResult) { DataServiceContext context = asyncResult.AsyncState as DataServiceContext; ListBox1.DataContext = context.EndExecute(asyncResult); }}
本文详细介绍了 Silverlight 应用程序导航的实现方法,包括 URI 映射、页面导航和外部导航等内容。更多技术细节和示例,请参考 官方文档。
转载地址:http://eztiz.baihongyu.com/