星辰.Net技术社区论坛

首页 » .NET » Silverlight » 在Silverlight 2应用程序中切换用户控件
admin - 2008-7-3 21:49:00
准备:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
现在建立一个项目结构如下图所示,在Silverlight项目中我们有个三个用户控件:ContentPage、DefaultPage、MasterPage,需要在不同的ASP.NET页面加载时显示不同的用户控件。:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
思路:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
要实现这个功能并不是什么难事,我们完全可以使用InitParams这个属性,如下图所示::“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
或者在HTML中通过param指定InitParameters::“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
该属性是一个Dictionary<string,string>类型的,我们可以在其中设置一系列的键-值对初始化参数,用逗号“,”分割开。所以我们的思路非常简单,就是在ASP.NET页面或者HTML中通过InitParameters指定起始用户控件,然后在Application_Startup事件中获取参数,并设置RootVisual。:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
实现如下面这段代码,我们设置一个初始化参数InitPage为ContentPage::“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
<asp:Silverlight ID="Xaml1" runat="server":“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    Source="~/ClientBin/SwitchUserControl.xap":“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    MinimumVersion="2.0.30523":“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    Width="100%" Height="100%":“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    InitParameters="InitPage=ContentPage"/>:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
然后在Application_Startup根据参数不同设置不同的RootVisual::“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
private void Application_Startup(object sender, StartupEventArgs e){:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    if (!e.InitParams.ContainsKey("InitPage")):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        this.RootVisual = new DefaultPage();:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        return;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    switch (e.InitParams["InitPage"]):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        case "MasterPage"::“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            this.RootVisual = new MasterPage();:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            break;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        case "ContentPage"::“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            this.RootVisual = new ContentPage();:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            break;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        default::“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            this.RootVisual = new DefaultPage();:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            break;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
}:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
现在运行程序后,可以看到起始用户控件为ContentPage,如下图所示::“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
改进:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
上面这种方式虽然达到了我们的目的,但是switch语句代码实在不怎么优雅,如果有几十个用户控件,那就得有几十个分支。既然我们在初始话参数中设置了起始用户控件名,为什么不直接使用反射呢?在Silverlight 2中,对于反射提供了很好的支持,所以我们的代码可以修改如下::“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
private void Application_Startup(object sender, StartupEventArgs e){:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    if (!e.InitParams.ContainsKey("InitPage")):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        this.RootVisual = new DefaultPage();:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        return;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    Assembly assembly = Assembly.GetExecutingAssembly();:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    String rootName = String.Format("SwitchUserControl.{0}", e.InitParams["InitPage"]);:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    UIElement rootVisual = assembly.CreateInstance(rootName) as UIElement;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    this.RootVisual = rootVisual;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
}:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
现在代码看起来好多了,即便有再多的用户控件也不用再修改此处的代码。但是大家一定要注意一个问题,就是要合理的划分Silverlight项目,不要把所有的用户控件都放在一个项目里面,避免xap文件过大。在后面我还会写一篇文章来谈谈如何合理的划分Silverlight项目结构,以及如何调用其它xap文件中的用户控件:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹

附件: SwitchUserControl.zip
1
查看完整版本: 在Silverlight 2应用程序中切换用户控件