WPF的Frame导航有一个FragmentNavigation事件。发生在当导航地址中有”#”字样,”#”后面代表着对应元素的名称。导航后目标元素会被带入到视图中,当然Page中需要手动加ScrollViewer。这个和HTML中超链接在页面中的跳转原理是一样的。
比如我们在Frame中导航至Page1.xaml中的名叫“textBlock”的元素中,代码:
frame.Navigate(new Uri("/page1.xaml#textBlock", UriKind.Relative));
程序运行后,对应元素会被切换到视图最底端:
在FragmentNavigation事件中,通过FragmentNavigationEventArgs的Fragment属性(字符串类型)可以获取对应名称。
在Silverlight中,不仅支持WPF有的FragmentNavigation事件。同时还支持类似HTML URL中的Query string方式。当为导航至Page的地址加入了Query string后,可以通过Page的NavigationContext类型(System.Windows.Navigation命名空间内)查询具体的数据。NavigationContext只包含一个属性:QueryString(IDictionary<string, string>类型),通过它可以按照名称查询相应的值。
比如首先我们在Page对象的Loaded事件中枚举QueryString:
//lbx是界面上的一个ListBox,我们把QueryString显示在ListBox上。
lbx.ItemsSource = this.NavigationContext.QueryString.Select(i => i.Key + ":" + i.Value);
然后通过Frame的Navigate方法导航至Page,并且加入Query String:
//frame是界面上的Frame对象
//page1.xaml是上面代码中的Page
frame.Navigate(new Uri("/page1.xaml?name=Mgen&gender=male&id=177", UriKind.Relative));
结果:
当然上面的都是Silverlight内Frame控件切换Page的QueryString,和浏览器中地址栏的QueryString是没有关系的,如果需要获取浏览器的QueryString,则需要使用System.Windows.Browser命名空间内的HtmlPage.Document.QueryString属性,同样返回一个IDictionary<string, string>对象供查询或者枚举。
我们用同样的方法把他显示到界面上,然后这次在浏览器地址栏中属性程序路径加上QueryString,然后执行: