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

版权声明:原创做品,容许转载,转载时请务必以超连接形式标明文章 原始出处 、做者信息和本声明。不然将追究法律责任。 http://terrylee.blog.51cto.com/342737/85341

摘要

你们都知道,在Silverlight 2应用程序中,每一个应用程序将生成一个xap文件,每个xap文件中只能设置一个起始的用户控件。若是咱们有多个用户控件,须要在不一样的ASP.NET页面中加载,最简单的方法莫过于针对多个用户控件分别创建对应的Silverlight项目,但这种方式有不少的缺点,如咱们的样式文件须要在多个项目中进行拷贝。
本文将介绍利用初始化参数进行用户控件的切换这一技巧。

准备

如今创建一个项目结构以下图所示,在Silverlight项目中咱们有个三个用户控件:ContentPage、DefaultPage、MasterPage,须要在不一样的ASP.NET页面加载时显示不一样的用户控件。

思路

要实现这个功能并非什么难事,咱们彻底可使用InitParams这个属性,以下图所示:
或者在HTML中经过param指定InitParameters:
该属性是一个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,以下图所示:
 

改进

上面这种方式虽然达到了咱们的目的,可是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.blog.51cto.com/342737/85341html

转载于:https://www.cnblogs.com/hdjjun/archive/2008/12/24/1361581.htmlpost