Silverlight
@H_403_12@本主题描述了常见导航方案,并提供了有关如何将导航功能添加到应用程序的指导。
本主题包含以下各节:
应用程序导航
Web 浏览器集成导航
外部导航
扩展导航系统
应用程序导航在 Silverlight 应用程序中使用 Frame 和 Page 控件可以实现应用程序导航。页面控件表示内容的分立部分。框架用作页面控件的容器,并使页导航非常简便。在任一时刻,框架只显示一个页面的内容。以编程方式或通过用户 *** 作导航到新页时,框架中显示的页将会更改。
可以将 Silverlight 应用程序的根视觉效果设计为包含可导航内容和永久用户界面 (UI) 组件(例如页眉、页脚和导航边栏)的组合。使用"Silverlight 导航应用程序"模板创建新项目时,该模板会生成一个包含永久 UI 组件的 XAML 文件并为可导航内容生成一个框架。
下面的示例演示一个简单框架,它存在于名为 MainPage 的 UserControl 控件内。您可以在 ContentFrame 之前或之后向 LayoutRoot 添加其他 UI 组件。Source 设置为 /VIEws/Home.xaml 表示默认情况下,框架中显示的页是位于 /VIEws/Home.xaml 的页。
XAML 复制<!-- NOTE: By convention,the sdk prefix indicates a URI-based XAML namespace declaration for Silverlight SDK clIEnt librarIEs. This namespace declaration is valID for Silverlight 4 only. In Silverlight 3,you must use indivIDual XAML namespace declarations for each CLR assembly and namespace combination outsIDe the scope of the default Silverlight XAML namespace. For more information,see the help topic "Prefixes and MapPings for Silverlight librarIEs". --><UserControl x:Class="SilverlightApplication.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/Expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignWIDth="640" d:DesignHeight="480"> <GrID x:name="LayoutRoot"> <sdk:Frame x:name="ContentFrame" Source="/VIEws/Home.xaml"> </Frame> </GrID></UserControl>
通过使用"添加新项"对话框,然后选择"Silverlight 页",可以将新页添加到应用程序中。Visual Studio 中的"Silverlight 导航应用程序"模板会创建一个名为 VIEws 的文件夹,其中包含这些页。您可以向此文件夹添加页,也可以在应用程序中最适当的任何位置添加页。
创建用户友好的 URI在框架中,可以为特定页面指定某种 URI 模式映射。使用 URI 映射可以创建说明用户 *** 作的 URI,而不是文件的路径。例如,可以指定对 /Home 的任何请求实际上是对位于 /VIEws/Home.xaml 的文件的请求。不与任何已定义模式匹配的所有请求都作为常规 URI 请求来处理,不会映射到其他页。下表演示 URI 映射定义的示例以及如何解析这些示例请求。
Uri = "/Home" MappedUri = "/VIEws/Home.xaml" | /Home | /VIEws/Home.xaml |
Uri = "/{page}" MappedUri = "/VIEws/{page}Page.xaml" | /About | /VIEws/AboutPage.xaml |
Uri = "/Product/{category}" MappedUri = "/ContosoShop/Product.xaml?category={category}" | /Product/bikes | /ContosoShop/Product.xaml?category=bikes |
Uri = "/{reporttype}/{month}/{format}" (在 XAML 中)MappedUri = "/VIEws/Reports/{reporttype}.xaml?time={month}&show={format}" (在 Visual Basic 或 C# 中)MappedUri = "/VIEws/Reports/{reporttype}.xaml?time={month}&show={format}" | /Sales/June/Short | /VIEws/Reports/Sales.xaml?time=June&show=Short |
向框架添加 URI 映射的方法是定义 UriMapper 类(或派生自 UriMapperBase 类的自定义类)的一个实例以及任意数量的 UriMapping 实例。您指定的模式不必是与所请求 URI 完全匹配的 URI。该模式可以在 URI 中包含占位符段,URI 将匹配该段中的任何值。将占位符段的名称括在大括号({ 和 })中可以指定占位符段。在映射 URI 时,占位符段充当变量。任何没有括在大括号中的值表示文本值,要与模式匹配的 URI 必须存在该值。下面的示例演示包含占位符值的 URI 模式。
XAML 复制<Frame x:name="ContentFrame" Style="{StaticResource ContentFrameStyle}" Source="/Home" Navigated="ContentFrame_Navigated" NavigationFailed="ContentFrame_NavigationFailed"> <Frame.UriMapper> <UriMapper> <UriMapPing Uri="/ProductDetail/{productID}" MappedUri="/VIEws/ProductDetail.xaml?ProductID={productID}"/> <UriMapPing Uri="/Reports/{type}/{selection}" MappedUri="/VIEws/ReportsPage.xaml?type={type}&selection={selection}"/> <UriMapPing Uri="/{pagename}" MappedUri="/VIEws/{pagename}.xaml"/> </UriMapper> </Frame.UriMapper></Frame>
URI 请求将映射为与该请求匹配的第一个模式。因此,应按照从最具体到最一般的顺序添加 URI 映射实例。例如,下面的定义是按照从具体文本值到一般占位符值正确排序的。对 /SalesReport 的请求将映射为 /VIEws/Reports/Sales.xaml。
XAML 复制<Frame x:name="ContentFrame" Source="/Home"> <Frame.UriMapper> <UriMapper> <UriMapPing Uri="/SalesReport" MappedUri="/VIEws/Reports/Sales.xaml"/> <UriMapPing Uri="/{page}" MappedUri="/VIEws/{page}Page.xaml"/> </UriMapper> </Frame>
但是,如果颠倒 URI 映射定义的顺序,对 /SalesReport 的请求将不会映射为 /VIEws/Reports/Sales.xaml。相反,第一个定义 /{page} 将匹配每一个段请求,包括 /SalesReport。该请求将映射为 /VIEws/SalesReportPage.xaml。
方便页导航Frame 类提供用于页导航的方法和属性。将 Source 属性设置为要显示的页的 URI,或调用 Navigate 方法并将该页的 URI 作为参数来传递。也可以使用 GoBack 和 GoForward 方法在导航历史记录中向前或向后导航。
可以使用 HyperlinkButton 控件使用户能够在应用程序的各页中导航。HyperlinkButton 控件位于框架承载的 Silverlight 页内时,应将 NavigateUri 属性设置为映射到某一页的 URI,而不要设置 TargetName 属性。宿主框架将导航到请求的页。下面的示例演示一个包含了导航到应用程序中另一页的 HyperlinkButton 的页。
XAML 复制<!-- NOTE: By convention,21)">Page x:Class="SilverlightApplication.Home" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/Expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" mc:Ignorable="d" d:DesignWIDth="640" d:DesignHeight="480" Title="Home"> <GrID x:name="LayoutRoot"> <Hyperlinkbutton NavigateUri="/About" Content="About"></Hyperlinkbutton> </Page>
HyperlinkButton 控件位于框架外时,可以通过将 NavigateUri 属性设置为映射到某一页的 URI 并将 TargetName 属性设置为该框架的名称来启用对该框架内资源的导航。下面的示例演示一个框架和两个位于该框架外的 HyperlinkButton 控件。HyperlinkButton 控件使导航到框架内所显示的页面非常简便。这两个 HyperlinkButton 控件上的 TargetName 属性均设置为 ContentFrame,它是指派给框架的名称。
XAML 复制<GrID x:name="LayoutRoot"> <border> <Frame x:name="ContentFrame" Source="/Home"> <Frame.UriMapper> <UriMapPing Uri="/{pagename}" MappedUri="/VIEws/{pagename}.xaml"/> </UriMapper> </Frame.UriMapper> </border> <GrID> <border> <StackPanel> <Hyperlinkbutton NavigateUri="/Home" Targetname="ContentFrame" Content="home"/> <Hyperlinkbutton NavigateUri="/About" Targetname="ContentFrame" Content="about"/> </StackPanel> </border> </GrID>
需要以编程方式从某一页启动导航请求时,必须首先获取宿主框架使用的 NavigationService 对象。NavigationService 类提供用于页导航的成员,如 GoBack、GoForward 和 Source。有关演示使用 NavigationService 对象的 Silverlight 页的示例,请参见本主题后面的"应用程序导航示例"。
Web 浏览器集成导航对于未嵌套在另一个框架内的框架,可以集成框架导航与 Web 浏览器导航。浏览器集成导航无法用于脱离浏览器的应用程序。与浏览器集成时,使用 Web 浏览器的前进和后退按钮可导航到顶级框架的导航历史记录中的请求。用户通过 Web 浏览器的前进或后退按钮,可导航到其他 Silverlight 页。使用浏览器集成导航,用户可直接在浏览器窗口中键入一个 URI,表示该 URI 的页将显示在 Silverlight 应用程序中。因此,用户可以将一个 URI 设为书签或共享不仅与 Silverlight 应用程序对应,还与处于特定状态的应用程序对应的超链接。
设置 JournalOwnership 属性可指定是否将一个框架与 Web 浏览器导航相集成。默认情况下,该属性设置为 automatic,这表示当该框架为顶级框架时,它将与浏览器日记集成在一起。将 JournalOwnership 属性设置为 OwnsJournal 可以禁止浏览器集成导航,也就是该框架保留自己的导航日志。
为了支持导航历史记录,包含 Silverlight 对象的网页必须包括名为 _sl_historyFrame 的 iframe。默认情况下,在您创建新的 Silverlight 应用程序时,此 iframe 包含在网页中。若要向现有应用程序添加导航历史记录,您必须将以下代码添加到承载 Silverlight 对象的网页中:
other 复制<iframe ID="_sl_historyFrame" style='visibility:hIDden;height:0;wIDth:0;border:0px'></iframe>应用程序导航示例
在之前的示例中,定义了以下模式的一个 URI 映射:
other 复制<uriMapper:UriMapPing Uri="/ProductDetail/{productID}" MappedUri="/VIEws/ProductDetail.xaml?ProductID={productID}"/>
下面的示例使用该 URI 映射使用户能够直接导航到显示有关用户所请求产品的数据的页。本示例演示显示产品相关数据的 XAML 页。该页还包含将可从该页启动向前和向后导航的按钮。
XAML 复制<!-- NOTE: By convention,21)">Page x:Class="NavExample.VIEws.ProductDetail" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/Expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" d:DesignWIDth="640" d:DesignHeight="480" Title="Product information"> <StackPanel x:name="LayoutRoot"> <ListBox x:name="ListBox1" ItemsSource="{Binding}"> <ListBox.ItemTemplate> <DataTemplate> <StackPanel> <TextBlock Text="{Binding name}"/> <TextBlock Text="{Binding ProductNumber}"/> <TextBlock Text="{Binding color}"/> <TextBlock Text="{Binding Size}"/> <TextBlock Text="{Binding ListPrice}"/> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox> <StackPanel HorizontalAlignment="Center" OrIEntation="Horizontal"> <button WIDth="100" x:name="BackNavbutton" Click="BackNavbutton_Click" Content="<< back" Visibility="Collapsed" /> <button WIDth="100" x:name="ForwardNavbutton" Click="ForwardNavbutton_Click" Content="forward >>" Visibility="Collapsed" /> </StackPanel></Page>
以下示例演示代码隐藏页。该页访问 WCF Data Services — WCF 数据服务以检索数据,但实现该数据服务的步骤不在此演示。有关数据服务的更多信息,请参见 WCF 数据服务 (Silverlight)。请求的产品 ID 从查询字符串检索,并在数据服务查询中传递。该页的导航服务用于确定向前和向后导航是否可用。
C# VB 复制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<Product>(new Uri("Product(" + productID + ")",UriKind.relative),loadProductCallback,svcContext); } private voID loadProductCallback(IAsyncResult asyncResult) { DataServiceContext context = asyncResult.AsyncState as DataServiceContext; ListBox1.DataContext = context.EndExecute<Product>(asyncResult); }}外部导航
应用程序可以提供指向其他网页的直接链接。外部导航可用于提供对应用程序外部资源的访问。还可以将外部导航用于 Silverlight 来实现控件(如用于普通网页的边栏菜单)。
在某些情况下,可能需要对应用程序禁止任何外部导航。若要禁用所有外部导航,在初始化 Silverlight 插件时,应将 enableNavigation 属性设置为 none。有关更多信息,请参见 EnableNavigation(Silverlight 插件对象)。
若要启用对其他网页的用户导航,可以使用 HyperlinkButton 控件并将 NavigateUri 属性设置为外部资源,将 TargetName 属性设置为打开新的浏览器窗口。
下面的代码示例演示如何使用 HyperlinkButton 导航到应用程序外的某个位置。
XAML 复制<Hyperlinkbutton NavigateUri="http://www.microsoft.com" Content="Go to Microsoft" Targetname="_new" />扩展导航系统
在 Silverlight 4 中,您可以通过将 ContentLoader 属性设置为自定义 INavigationContentLoader 实现,扩展导航系统。INavigationContentLoader 接口为支持异步内容加载定义四个方法。
默认的 ContentLoader 属性值是 PageResourceContentLoader 类的一个实例,该类从应用程序包 (.xap file) 加载页。您可以替换此功能以便执行任意 URI 解析。例如,您可以仅当需要时从服务器下载页,或者将某些 URI 重定向到其他 URI。
Frame 和 NavigationService 类还在 Silverlight 4 中提供 Refresh 方法。这在您使用可根据特定页中的用户交互为同一 URI 提供不同内容的导航扩展时特别有用。例如,这可以实现具有要求用户身份验证的页的某些导航方案。有关实现 INavigationContentLoader 的信息,请参见 Additional Navigation Resources(附加导航资源)。
http://msdn.microsoft.com/zh-cn/library/cc838245%28VS.95%29.aspx
总结以上是内存溢出为你收集整理的silverlight导航概述全部内容,希望文章能够帮你解决silverlight导航概述所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)