2010年1月14日星期四

Silverlight 导航概述 2

外部导航

应用程序可以提供指向其他网页的直接链接。外部导航可用于提供对应用程序外部资源的访问。还可以将外部导航用于 Silverlight 来实现控件(如用于普通网页的边栏菜单)。
在某些情况下,可能需要对应用程序禁止任何外部导航。若要禁用所有外部导航,在初始化 Silverlight 插件时,应将 enableNavigation 属性设置为 none。
若要启用对其他网页的用户导航,可以使用 HyperlinkButton 控件并将 NavigateUri 属性设置为外部资源,将 TargetName 属性设置为打开新的浏览器窗口。
下面的代码示例演示如何使用 HyperlinkButton 导航到应用程序外的某个位置。





需要以编程方式从某一页启动导航请求时,必须首先获取宿主框架使用的 NavigationService 对象。NavigationService 类提供用于页导航的成员,如 GoBack、GoForward 和 Source。
下面是我自己做的一个小例子,没用SDK带的那个。那个例子对如何调用页面没有介绍。


我在这个例子中没有用到数据库,只是用了一个XML文件作为数据源。为了更方便的传递所有信息,我建了一个Product类,其中包含名称、数量、价钱、图片地址这些公共属性。在读取完XML数据后,生成List<product>,然后再把它赋值给ListBox控件的ItemsSource属性。
在ListBox控件中,我使用DisplayMemberPath="Name"来只显示Product Name。
然后在MainPage.xaml文件中,添加地址映射如下,注意用"& amp;"(中间无空格)来取代&




此时,我们就可以通过编程方式来导航了。在ListBox控件的SelectionChanged事件中,我们通过NavigationService来实现页面导航,代码如下

private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ListBox listbox = sender as ListBox;
Product product = (Product)listbox.SelectedItem;
NavigationService.Navigate(new Uri("/ProductDetail/" + product.Name+"/"+product.Price+"/"+product.Quantity+"/"+product.ImageUri, UriKind.RelativeOrAbsolute));
}

由于我们是把Product赋值给ListBox,所以通过Product product = (Product)listbox.SelectedItem,现在我们很容易就获得了所选产品的所有信息,而不仅仅是名字。然后把这些信息放到所想访问的地址中去,再通过NavigationService.Navigate来实现页面调用。
在ProductDetail页中,我们通过NavigationContext来获得传递的参数,代码如下

protected override void OnNavigatedTo(NavigationEventArgs e)
{
if (this.NavigationContext.QueryString.ContainsKey("ProductName"))
{
productName.Text = NavigationContext.QueryString["ProductName"];
productQuantity.Text = "Quantity : "+ NavigationContext.QueryString["ProductQuantity"];
... ...
}
}

至此,我们就可以像在ASP.NET中那样,在任意页面中导航了。

没有评论:

发表评论