开发者社区> 技术小甜> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

技巧:在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属性并结合反射来实现用户控件的切换。希望对大家有所帮助。
示例代码下载:











本文转自lihuijun51CTO博客,原文链接:http://blog.51cto.com/terrylee/85341 ,如需转载请自行联系原作者


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
WPF获取外部EXE图标最简单的方法
原文:WPF获取外部EXE图标最简单的方法 首先在工程添加对System.Drawing的引用 创建以下方法: public static ImageSource GetIcon(string fileName) {     System.
502 0
WPF应用程序内嵌网页
原文:WPF应用程序内嵌网页 版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/shaynerain/article/details/78160984 ...
889 0
WPF 设置类库项目为启动项,设置窗体跟随。
原文:WPF 设置类库项目为启动项,设置窗体跟随。 1、添加用于启动的类Program.cs,需要一个静态的Main函数入口。
612 0
WPF关闭应用程序方法
原文:WPF关闭应用程序方法  很多人认为关闭应用程序应该很简单,例如WindowsForm里一个Application.Exit();方法就可以解决问题,但在WPF里面可别滥用,因为WPF里Application类没有该方法,倒是有一个Exit的事件驱动,在WPF应用程序里面关闭程序讲究很多: ...
640 0
WPF 动态更改启动窗体startupUri
原文: WPF 动态更改启动窗体startupUri 第一步: 在 App.xaml 里,把 StartupUri=""去掉,改成  Startup="Application_Startup" 第二步: 在 App.
565 0
一起谈.NET技术,将WPF UI单元复制到剪贴板
  大家在日常工作中应该遇到过这样的问题:需要对应用程序界面进行截屏操作,然后将截屏内容拷贝到其他文档中使用。通常情况下我们会使用一些截屏软件或者“Ctrl+PrtSc ”,本篇将介绍如何在WPF 程序中将UI 单元直接以图片形式复制到剪贴板,以达到为应用程序界面制作快照(Snapshot)的功能。
542 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
WEB浏览器中即将发生的安全变化
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载