棒棒牛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14071|回复: 135

[交流] Silverlight应用基础: Navigation(多页面导航、传值) 三   [复制链接]

版主

天道酬勤

Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

游币
181
金币
2460
经验
2631
积分
3688
帖子
536

2011 年度优秀版主 2010 年度优秀版主

发表于 2009-11-29 22:45:39 |显示全部楼层
本帖最后由 Nereus 于 2011-6-23 17:16 编辑

此次主要是接着Frame来说的,主要是说一下Page控件以及使用模版.
   在之前的例子中使用的是UserControl来做为页面,但通常的话我们是使用Page控件的,或者自己继承Page类来代替UserControl。因为Page提供了更方便的导航功能以及状态管理。其实,Page类是继承自UserControl的,然后添加了一些成员,一些可重写的方法和四个属性:Title、NavigationService、NavigationContext、NavigationCacheMode。其中Titel属性比较简单,不做多说,其他属性在后面都会有说到。
   使用Page控件很简单,和向项目中添加UserControl一样。
1.Page控件属性介绍
   每一个Page控件内都会有一个NavigationService属性,这个属性就相当于访问Silverlight导航系统的入口,因为它提供了与Frame对象一样的方法和属性(Navigate()、GoBack()、GoForward(),属性有CanGoBack、CanGoForward、CurrentSource等)。意思就是说在Page里面就可以进行导航了..   
  • this.NavigationService.Navigate(new Uri("/Page2.xaml", UriKind.Relative));

    Page类还含有一个NavigationContext属性用来访问NavigationContext对象。使用这个属性可以获取当前的URL,使用QueryString可以获取URL中的参数。也就是说你可以在跳转页面的时候使用地址栏参数传值。如下:
  • string uriText = String.Format("/Product.xaml?id={0}&type={1}",productID, productType);
  • mainFrame.Navigate(new Uri(uriText), UriKind.Relative);

    这样你就可以传两个值到目标页面了 ..
    然后在Priduct.xaml页面你就可以获取到值了:
  • int productID, type;
  •             if (this.NavigationContext.QueryString.ContainsKey("id"))
  •                 productID = Int32.Parse(this.NavigationContext.QueryString["id"]);
  •             if (this.NavigationContext.QueryString.ContainsKey("type"))
  •                 type = Int32.Parse(this.NavigationContext.QueryString["type"]);

     当让你还可以使用其他方式传值,比如在存储在Appliaction对象中,或者是使用独立存储都可以实现,因为使用URL参数很容易就会被篡改..

保存页面状态
    通常,用户第一次进入页面或者是使用前进后退按钮切换页面,都会重新创建一个对象,当用户离开,对象就会被释放。这种情况下,如果用户输入的有信息,再回到页面就会编程默认值,页面的其他成员也会初始化成默认值。而如果可以存储页面状态的话就不会出现这种情况了。
   Silverlight允许使用Page.NavigationCacheMode属性来设置存储策略,这个属性的默认值是Disabled所以不会默认不会存储页面。把属性设置为Required那么页面就会保存到内存中。当用户离开页面再返回的时候就可以看到自己修改的内容依然存在,不过再次回到页面不会触发页面的构造方法,所以如果你在构造函数里写的有逻辑就需要注意了。不过会触发页面的Loaded事件。
    NavigationCacheMode的另外一个值是Enabled,如果设置成这个值,那么页面就好与Frame.CacheSize(保存页面的数量)属性关联,加入CacheSize属性设置为10,当第11个页面存储进来的话第一个页面就会被释放。而NavigationCacheMode属性设置为Required属性页面就不会被计算在CacheSize中。这个可以根据自己的需要进行选择。
Page控件的方法
     Page类包含了几个方法使你能更加灵活的管理导航。
  • OnNavigatedTo():当页面不再是框架中的活动页面时调用。
  • OnNavigatingFrom():当页面成为框架中的活动页面时调用。
  • OnNavigatedFrom():在页面即将不再是框架中的活动页面时调用。


你可以使用这些方法在离开页面或是访问页面时添加一些自己的逻辑,比如初始化一些参数或是管理其他状态。
  关于Page类就说到这里,详细的用法与说明可以查看MSDN..

Navigation Templates
   现在已经学会如何使用Frome/Page控件来创建具有导航功能的应用程序,然后美中不足的是视觉效果还具有很多差距。不过你可以模拟别人的实例来不到完善,从而达到自己的效果。另外一个办法是使用现有的模版。
    如果你使用vs自带的Silverlight Navigation Appliaction模版创建一个程序的话,会自动给你创建一套默认样式。运行的效果如下图:
15.png


     这个模版已经可以满足一些基本的需求:页面的上方为导航按钮,下方为内容面板。这个是默认模版,而Silverlight团队还提供了其他的几个模版,在上一篇文章中已经展示了效果图,你可以在本文附件中下载。具体用法是替换Style.xaml文件就OK了..更多的效果图:
4.png
5.png
6.png
7.png
8.png
9.png
10.png
11.jpg
12.png


附件:
游客,如果您要查看本帖隐藏内容请回复
1

查看全部评分

V1

Rank: 1

游币
100
金币
68
经验
14
积分
19
帖子
7
发表于 2009-11-29 22:52:14 |显示全部楼层
效果太炫了

看着好激动吖...
God forces me to be stronger...

Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

游币
263
金币
540
经验
1785
积分
2564
帖子
696
发表于 2009-11-29 23:41:26 |显示全部楼层
很棒!
与您一起成长

V2

Rank: 2Rank: 2

游币
108
金币
51
经验
52
积分
67
帖子
22
发表于 2009-12-2 15:31:35 |显示全部楼层
學習了...
if(思戀*時間==永遠)
{Console.Write("^_^")}

V2

Rank: 2Rank: 2

游币
108
金币
51
经验
52
积分
67
帖子
22
发表于 2009-12-4 10:45:00 |显示全部楼层
那個Styles.xaml要添加在那裡啊
if(思戀*時間==永遠)
{Console.Write("^_^")}

版主

天道酬勤

Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

游币
181
金币
2460
经验
2631
积分
3688
帖子
536

2011 年度优秀版主 2010 年度优秀版主

发表于 2009-12-4 13:56:25 |显示全部楼层
那個Styles.xaml要添加在那裡啊
yellowshorts 发表于 2009-12-4 10:45



    你用VS创建一个Navigation Appliaction 里面有一个包含Style.xaml的文件夹,你直接把Style.xaml覆盖掉就OK了

V1

家人称呼

Rank: 1

游币
100
金币
66
经验
4
积分
6
帖子
2
发表于 2009-12-9 11:15:43 |显示全部楼层
问题:
A页面有不同的按钮,B页面有个frame框架,框架地址的选择,是根据A页面传来的参数。怎么实现?
相信自己!

V1

Rank: 1

游币
100
金币
0
经验
10
积分
13
帖子
5
发表于 2009-12-9 15:09:29 |显示全部楼层
谢谢分享。学习

版主

天道酬勤

Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

游币
181
金币
2460
经验
2631
积分
3688
帖子
536

2011 年度优秀版主 2010 年度优秀版主

发表于 2009-12-9 15:28:42 |显示全部楼层
问题:
A页面有不同的按钮,B页面有个frame框架,框架地址的选择,是根据A页面传来的参数。怎么实现? ...
wujie513658996 发表于 2009-12-9 11:15



    Sorry  刚看到问题, 我等会闲了,再仔细看一下..

V1

家人称呼

Rank: 1

游币
100
金币
66
经验
4
积分
6
帖子
2
发表于 2009-12-10 10:05:01 |显示全部楼层
回复 9# Nereus


    呵呵!问题我已经解决了!你写的东西很好。给了我很大的参考。谢谢哈
您需要登录后才可以回帖 登录 | 注册

bbniu.com (湘ICP备06008909号)  

GMT+8, 2012-5-22 20:55

Copyright © 2009-2011 bbniu.com. All Rights Reserved.

回顶部