技巧:在Silverlight 2应用程序中切换用户控件_weixin_30955341的博客-程序员秘密

摘要

大家都知道,在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属性并结合反射来实现用户控件的切换。希望对大家有所帮助。

示例代码下载:

转载于:https://www.cnblogs.com/Areas/archive/2011/08/25/2153393.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30955341/article/details/97244546

智能推荐

linux 编写shell脚本_linux写shell脚本_狼的诱惑_LE的博客-程序员秘密

简单shell 示例Shell脚本命令的工作方式有两种:交互式和批处理。交互式( Interactive):用户每输入一条命令就立即执行。批处理( Batch):由用户事先编写好一个完整的 Shell脚本, Shell会一次性执行脚本中诸多的命令。在Shell脚本中不仅会用到前面学习过的很多 Linux命令以及正则表达式、管道符、数据流重定向等语法规则,还需要把内部功能模块化后通过逻辑语...

GTK入门学习:布局容器之固定布局_gtkfixed_Mike江的博客-程序员秘密

前面我们学习的水平、垂直和表格布局容器,控件会跟着容器大小的变化进行自动适应,而固定布局容器里的控件则不会跟着变化( 则固定不变 )。固定布局的创建:GtkWidget *gtk_fixed_new(void);返回值:固定布局容器指针固定布局容器添加控件:void gtk_fixed_put( GtkFixed *fixed,

opencv2.4.13基于双目视觉的测距_Logan_Lin的博客-程序员秘密

最近对双目视觉的应用挺感兴趣的,之前又完成了双目的标定,刚好可以把数据拿过来使用,继续做相关实验,实验里的代码很多都是参考大神的,这里也分享下这些链接:https://blog.csdn.net/weixin_39449570/article/details/79033314https://blog.csdn.net/Loser__Wang/article/details/52836042由于op...

Could not download kotlin-reflect.jar_failed to transform kotlin-reflect-1.4.31.jar_Arman_的博客-程序员秘密

问题记录:该问题出在我安装Android studio 3.1.2之后,新建项目(不说kotlin项目 但是之前我下载过ko t lin插件等等),所导致的:解决方案:Tools---&amp;gt;Kotlin---&amp;gt;Configure Kotlin Plugin Updates ...

php静态页面源码,php生成静态[html]页面代码_岳意贺的博客-程序员秘密

class makeHtml{var $fileName; //文件名var $dirRoot; //目录地址function getFile ($name,$root){$this-&gt;fileName = $name;$this-&gt;dirRoot = $root;if(file_exists($root)) {$this-&gt;makeRoot($root);}}function...

SQL SERVER中的游标的使用_极客研究者的博客-程序员秘密

游标:实质是一种能从包括多条数据记录的结果集中每次提取一条记录的机制游标主要是由结果集和游标位置组成的,结果集是SELECT语句执行后返回的,而游标指向返回的结果集的指针。使用DECLARE cursor_name[LOCAL|GLOBAL][FORWARD_ONLY|SCROLL] [STATIC|KEYSET|DYNAMIC|FAST_FORWARD][READ_ONLY|SCROLL...

随便推点

Windows10下bazel编译tensorflow的graph_transforms源码用于.pb模型压缩,过程之艰辛让你不敢置信_windows bazel tf runtime_Tommy3266的博客-程序员秘密

1、安装bazel 3.7.2版本2、安装MSYS22、查看自己电脑的硬件cuda版本,从官网下载安装CUDA 11.1和cuDNN8.2

Linux后台开发工具箱-葵花宝典_linux工具箱_一见的博客-程序员秘密

目录目录 11. 前言 42. 脚本类工具 52.1. 双引号和单引号 52.2. 取脚本完整文件路径 52.3. 环境变量和变量 52.4. sed命令-字符串文本操作 52.5. sed和awk使用外部变量 62.6. awk给外部变量赋值 62.7. 设置shell模式 72.8. 设置shell提示 72.9. 浮点计算 72.10. 字符串操作 82.10.1. 删除前尾空格 82.10.2. 大小写转换 82.10.3. 不区分大小

默认路由及静态路由配置_默认路由配置命令_study_linux_go的博客-程序员秘密

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档静态路由和默认路由的基础配置前言一、什么是路由、路由器、静态路由?二、基本配置这样就可以通过配置默认路由和静态路由实现互通啦![在这里插入图片描述](https://img-blog.csdnimg.cn/37a571981fa2499abdcb9c486d96a585.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAc3R1ZHlf.

Python153(分隔线演练04—[扩展]pycharm给函数增加文档注释)_weixin_42681308的博客-程序员秘密

Ctrl+Q 查看注释 点击小灯泡,对函数及其参数增加注释Ctrl+Q 查看注释 

架构师_yuanshuai1136的博客-程序员秘密

工作了挺久,发现有个挺有意思的现象,从程序员、高级程序员,到现在挂着架构师、专家之类的头衔,伴随着技术和能力的提高,想不明白的事情反而越来越多了。这些疑问有些来自于跟小伙伴交流,有些是我的自问自答,有些到现在也想不清楚,这篇文章就来写一写这些问题。如何更高效的学习? 很多新人程序员一开始在学习上找不到方向,但我想在渡过了一段时间的新手期之后这类问题大多都会变得不再那么明显,工作的方向也会逐

【推荐】合适新手学习的一个基于TP5开发的一个开源的B2C商城框架,二次开发简单_既生向阳的博客-程序员秘密

很好用的一个企业级B2C商城网站,功能完善,免费开源,二开简单! 下面的文字都是转自码云的,觉得描述的已经很详细了,我也没必要点缀什么。下面介绍的shopxo商城最新版本,也是近期发布的!也感谢shopxo团队的奉献!### 扩展性* 独立模块式开发,完善的注释,易扩展,应用管理。### 安全性* 防止sql注入,代码高安全性。### 轻量级,高性能* 支持多数据库,读写分离,高...

推荐文章

热门文章

相关标签