版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。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/85341

本文出自 51CTO.COM技术博客

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

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

  1. 使用观察者模式在 Silverlight 中切换用户控件

    有一篇技巧,见 http://tech.sina.com.cn/s/2008-07-03/1528718607.shtml 或 http://kb.cnblogs.com/page/42897/?pa ...

  2. vs2010 学习Silverlight学习笔记(8):使用用户控件

    概要: 这个类似于封装控件样式.不过封装的是整个或是多个控件罢了,然后用的时候就可以直接引用过来了. 创建用户控: 这个也很简单,不过有几个地方需要注意下.这个就不照抄了,咱们也自己写一个. 步骤: ...

  3. 关于从页面中获取用户控件中的其它控件(如DropDownList)事件的方法

    在项目中经常把一些经常使用的代码做成用户控件以提高代码的可重用性, 一个经常遇到的就是在页面中调用用户控件中的服务器控件的事件,下面给出简单的代码示列. 我们在一个用户控件(MaterialRepor ...

  4. 在WinForm应用程序中嵌入WPF控件(转)

      我们知道,在WPF界面上添加WinForm的控件需要使用WindowsFormHost类.而在WinForm界面上添加WPF控件该如何做呢?有没有类似的类呢?明显是有的,ElementHost就是 ...

  5. VS2010下ocx开发:(2)在C#程序中调用ocx控件

    在本文中,给出一个C#示例程序,调用上一篇博文中创建的MultiplyDemo.ocx控件.注意需要保证该控件已经注册过. 启动Visual Studio 2010,使用C#创建一个Windows窗体 ...

  6. Winform中使用用户控件实现带行数和标尺的RichTextBox(附代码下载)

    场景 RichTextBox控件允许用户输入和编辑文本的同时提供了比普通的TextBox控件更高级的格式特征. 效果 注: 博客主页: https://blog.csdn.net/badao_lium ...

  7. Web.config中注册用户控件和自定义控件

    在ASP.NET 的早先版本里,我们通过在页面的顶部添加 <%@ Register %> 指令来引入和使用自定义服务器控件和用户控件时,象这样: <%@ Register TagPr ...

  8. C#中,用户控件UserControl里面用Panl加载UserControl,并实现利用委托互相传值

    用户控件主窗体结构:左侧树形菜单,右侧Panl: 根据点击的菜单节点,panl里面选择性加载某一个子窗体用户控件,并传值给子窗体: 反之,在子窗体进行相应的操作之后,传值给主窗体,触发主窗体的刷新. ...

  9. 一步一步学Silverlight 2系列(10):使用用户控件

    概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...

最新文章

  1. Matlab200以内所有质数,Matlab 中求质数表
  2. 最简单的彩灯管理系统
  3. java list 拆分_Java面试题怎么确保一个集合不能被修改?
  4. Kong Api 初体验、Kong安装教程
  5. linux驱动简单介绍
  6. gff3转mysql_科学网-把GFF3文件导入MySQL数据库-闫双勇的博文
  7. AJAX提交表单数据
  8. python爬虫Day1(requests基本使用)
  9. Linux内创建新用户,linux下手工创建新用户
  10. Nmap扫描常用命令:
  11. scikit-learn的高级介绍
  12. 7个实用有效的shopify运营策略,跨境电商卖家必知
  13. 三国时代微博(佩服博主琢磨先生太有才了!)
  14. 读于博士SI设计手记有感
  15. 《CAT NAUGHTY CARP》App Store 隱私政策網址(URL)
  16. matlab实训助教总结,助教自我评价简历范文
  17. python基础--截图提取图中文字存入Excel表
  18. w10计算机运行特别卡,win10很卡?教你4大技巧,降低CPU占用,旧电脑运行如飞
  19. 彻底理解——指针常量和常量指针、指向常量的常指针
  20. 手把手教你用ESP32 制作一个游戏机,小白可上手

热门文章

  1. Shell命令-系统信息及显示之uname、hostname
  2. python几乎无所不能 只有你不知道的,如何通过Python玩转小视频
  3. 为什么大部分程序员看不起PHP这门语言?
  4. PAT (Advanced Level) 1002. A+B for Polynomials (25)
  5. (转)Apache Ant 环境开发Android应用 二
  6. 人生只有七次机会,你抓住了几次?
  7. word中格式化姓名的输出
  8. cvs svnmanager
  9. java 实现网络通信_利用Java怎么样实现网络通信功能
  10. eclipse不支持泛型_C++ 泛型编程(一)