技巧:在Silverlight 2应用程序中切换用户控件

摘要

大家都知道,在Silverlight 2应用程序中,每个应用程序将生成一个xap文件,每一个xap文件中只能设置一个起始的用户控件。如果我们有多个用户控件,需要在不同的ASP.NET页面中加载,最简单的方法莫过于针对多个用户控件分别建立对应的Silverlight项目,但这种方式有很多的缺点,如我们的样式文件需要在多个项目中进行拷贝。

本文将介绍利用初始化参数进行用户控件的切换这一技巧。

准备

现在建立一个项目结构如下图所示,在Silverlight项目中我们有个三个用户控件:ContentPage、DefaultPage、MasterPage,需要在不同的ASP.NET页面加载时显示不同的用户控件。

TerryLee_0099

思路

要实现这个功能并不是什么难事,我们完全可以使用InitParams这个属性,如下图所示:

TerryLee_0100

或者在HTML中通过param指定InitParameters:

TerryLee_0101

该属性是一个Dictionary<string,string>类型的,我们可以在其中设置一系列的键-值对初始化参数,用逗号“,”分割开。所以我们的思路非常简单,就是在ASP.NET页面或者HTML中通过InitParameters指定起始用户控件,然后在Application_Startup事件中获取参数,并设置RootVisual。

实现

如下面这段代码,我们设置一个初始化参数InitPage为ContentPage:

<asp:Silverlight ID="Xaml1" runat="server"
     Source="~/ClientBin/SwitchUserControl.xap"
     MinimumVersion="2.0.30523"
     Width="100%" Height="100%"
     InitParameters="InitPage=ContentPage"/>

然后在Application_Startup根据参数不同设置不同的RootVisual:

private void Application_Startup(object sender, StartupEventArgs e)
{
    if (!e.InitParams.ContainsKey("InitPage"))
    {
        this.RootVisual = new DefaultPage();
        return;
    }
    switch (e.InitParams["InitPage"])
    {
        case "MasterPage":
            this.RootVisual = new MasterPage();
            break;
        case "ContentPage":
            this.RootVisual = new ContentPage();
            break;
        default:
            this.RootVisual = new DefaultPage();
            break;
    }
}

现在运行程序后,可以看到起始用户控件为ContentPage,如下图所示:

TerryLee_0102 

改进

上面这种方式虽然达到了我们的目的,但是switch语句代码实在不怎么优雅,如果有几十个用户控件,那就得有几十个分支。既然我们在初始话参数中设置了起始用户控件名,为什么不直接使用反射呢?在Silverlight 2中,对于反射提供了很好的支持,所以我们的代码可以修改如下:

private void Application_Startup(object sender, StartupEventArgs e)
{
    if (!e.InitParams.ContainsKey("InitPage"))
    {
        this.RootVisual = new DefaultPage();
        return;
    }

    Assembly assembly = Assembly.GetExecutingAssembly();
    String rootName = String.Format("SwitchUserControl.{0}", e.InitParams["InitPage"]);
    UIElement rootVisual = assembly.CreateInstance(rootName) as UIElement;
    this.RootVisual = rootVisual;
}
现在代码看起来好多了,即便有再多的用户控件也不用再修改此处的代码。但是大家一定要注意一个问题,就是要合理的划分Silverlight项目,不要把所有的用户控件都放在一个项目里面,避免xap文件过大。在后面我还会写一篇文章来谈谈如何合理的划分Silverlight项目结构,以及如何调用其它xap文件中的用户控件。

总结

本文其实非常的简单,写这篇文章缘于最近很多朋友都问到这一问题,所以在这里做一下说明,主要是利用了InitParameters属性并结合反射来实现用户控件的切换。希望对大家有所帮助。

示例代码下载:

作者:TerryLee
出处:http://terrylee.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
posted @ 2008-07-02 21:28 TerryLee 阅读(4408) 评论(24)  编辑 收藏 所属分类: Silverlight

  回复  引用    
#1楼 2008-07-02 22:01 | 三丰卡尺 [未注册用户]
怎样卸载silverlight。*
  回复  引用    
#2楼 2008-07-02 22:04 | Jeffrey Chen [未注册用户]
学习了
  回复  引用    
#3楼 2008-07-02 22:37 | KenQiu [未注册用户]
你的文章都很好,花时间好好的都学习一下
  回复  引用  查看    
#4楼 [楼主]2008-07-02 23:04 | TerryLee      
@三丰卡尺
在控制面板-添加删除程序里面卸载
  回复  引用  查看    
#5楼 [楼主]2008-07-02 23:04 | TerryLee      
@Jeffrey Chen
:)
  回复  引用  查看    
#6楼 [楼主]2008-07-02 23:04 | TerryLee      
@KenQiu
呵呵,谢谢支持:)
  回复  引用  查看    
#7楼 2008-07-03 08:33 | Goumh      
好,终于解开燃眉之计,最近正为这个犯愁呢,!
谢谢LZ
  回复  引用  查看    
#8楼 2008-07-03 09:21 | Windie Chai(笑煞天)      
好文!支持。
  回复  引用  查看    
#9楼 [楼主]2008-07-03 09:33 | TerryLee      
@Goumh
呵呵,最近也是很多朋友问这个问题,所以干脆写篇文章说明一下
  回复  引用  查看    
#10楼 [楼主]2008-07-03 09:33 | TerryLee      
@Windie Chai(笑煞天)
谢谢:)
  回复  引用  查看    
#11楼 2008-07-03 09:46 | 徐明明      
很好的文章当然支持一下 !!!
  回复  引用  查看    
#12楼 [楼主]2008-07-03 10:08 | TerryLee      
@徐明明
:)
  回复  引用  查看    
#13楼 2008-07-03 15:46 | Mahon      
每篇文章都要支持一下,这样才不能落后,正在加油中,我电脑配置差点,VS2008太大了,8G多,不敢装,先跟LEE学CODESIMITH,最近在看小菜编程的那个设计模式,买的书,呵呵,写的很好,差不多了在跟进老大的设计模式和其它文章
  回复  引用  查看    
#14楼 [楼主]2008-07-03 21:58 | TerryLee      
@Mahon
:)
  回复  引用  查看    
#15楼 2008-07-04 23:25 | 懒惰的车轮      
由于sliverlight 2 beta 2与sliverlight 2 beta 1之间造成的更新,所有如果从sliverlight 2 beta 2开始学习sliverlight,那请问TerryLee,以前你的基于sliverlight 2 beta 1的内容是否会做更新,或者是更新相关的代码(如果更新,请问是什么时候会更新,或者给出一个好的学习建议),目的是学习sliverlight 2 beta 2的时候好看到前面内容中说明的实际运行效果,谢谢您的共享和奉献!
  回复  引用  查看    
#16楼 [楼主]2008-07-06 22:17 | TerryLee      
@懒惰的车轮
这么多文章不可能去更新,有空我倒是可以给出一些学习Silverlight 2的相关资源:)
  回复  引用  查看    
#17楼 2008-07-07 13:52 | DaveLin      
受教了,我每周都会来这里看看,支持博主
  回复  引用  查看    
#18楼 2008-07-08 15:55 | AlexLiu      
大哥,我也注册新ID了,还没开始写,因为还没有学好呢。以后多多指点小弟才是。。。。
  回复  引用  查看    
#19楼 [楼主]2008-07-08 16:12 | TerryLee      
@DaveLin
谢谢:)
  回复  引用  查看    
#20楼 [楼主]2008-07-08 16:12 | TerryLee      
@AlexLiu
加油。。。
  回复  引用  查看    
#21楼 2008-07-15 11:31 | 笨笨丁      
我想我们也可以创建多个测试页,在每个不同的测试页指定InitParameters,然后在web程序的另外一个页面,根据业务逻辑定向不同的测试页!
  回复  引用  查看    
#22楼 [楼主]2008-07-21 10:16 | TerryLee      
@笨笨丁
何苦要创建那么多测试页面呢??
  回复  引用    
#23楼 2008-08-22 00:12 | Silverlight学习中 [未注册用户]
在html页面中,是不是应该写成
<param name="InitParams" value=""/>
呢?如果写成<param name="InitParameters" value=""/>好像实现不了
  回复  引用  查看    
#24楼 [楼主]2008-08-25 11:33 | TerryLee      
@Silverlight学习中
可能是,我查一下参数名,有点忘记了。

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-07-03 09:33 编辑过
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接: