Silverlight开发全解析:从基础到ASP.NET集成
立即解锁
发布时间: 2025-08-26 01:42:03 阅读量: 13 订阅数: 47 AIGC 

# Silverlight开发全解析:从基础到ASP.NET集成
## 1. 事件处理与Silverlight类库
### 1.1 分离事件处理程序
若要分离事件处理程序,只能通过代码实现。可以使用`-=`运算符,示例如下:
```csharp
cmdClickMe.Click -= cmdClickMe_Click;
```
虽然技术上可以将同一个事件处理程序多次连接到同一个事件,但这通常是编码错误。在此情况下,事件处理程序会被多次触发。若尝试移除已连接两次的事件处理程序,事件仍会触发该处理程序,但仅触发一次。
### 1.2 Silverlight类库
编写实用代码需深入了解要使用的类,这意味着要全面掌握Silverlight附带的核心类库。Silverlight版本的.NET Framework在两方面进行了简化:
- 类型数量不如完整的.NET Framework多。
- 包含的类通常不具备完整的构造函数、方法、属性和事件。Silverlight仅保留最重要类中最实用的成员,却仍具备创建出色代码的功能。
许多Silverlight类的公共接口与.NET Framework中的同类接口相似,但实际实现有很大差异。所有Silverlight类都经过重新编写,以实现尽可能的精简和高效。
## 2. 测试Silverlight应用程序
### 2.1 测试流程
现在可以对Silverlight项目进行测试。运行Silverlight应用程序时,Visual Studio会启动默认的Web浏览器,并导航到隐藏的浏览器测试页面`ProjectNameTestPage.html`。该测试页面会创建一个新的Silverlight控件,并使用`MainPage.xaml`中的标记进行初始化。
Visual Studio将测试页面设置为项目的起始页面,因此启动项目时,该页面会在浏览器中加载。若要选择其他起始页面,可在“解决方案资源管理器”中右键单击另一个HTML文件,然后选择“设为起始页”。
当点击按钮时,事件处理代码会运行,文本会发生变化。此过程完全在客户端进行,无需像ASP.NET等服务器端编程框架那样联系服务器或回发页面。所有Silverlight代码都由嵌入在Silverlight插件中的精简版.NET在客户端执行。
### 2.2 测试环境差异
若将Silverlight内容托管在普通网站(无服务器端ASP.NET)中,Visual Studio在测试过程中不会使用其集成的Web服务器,而是直接从文件系统打开HTML测试页面。这种行为可能导致测试环境与部署环境存在差异,部署环境会使用通过HTTP提供页面的完整Web服务器。最明显的差异是安全上下文,即可以配置Web浏览器允许本地网页执行远程Web内容无法执行的操作。但实际上,这通常不是问题,因为Silverlight始终在精简的安全上下文中执行,且不包含受信任位置的额外功能。不过,在对Silverlight应用程序进行生产测试时,建议创建一个ASP.NET测试网站,或更好的做法是将Silverlight应用程序部署到测试Web服务器。
## 3. 创建ASP.NET托管的Silverlight项目
### 3.1 创建步骤
可将Silverlight应用程序作为ASP.NET网站的一部分进行开发、测试和部署。若希望Silverlight应用程序与基于服务器的功能(如Web服务、文件上传、TCP通信等)交互,或测试某些功能(如自定义启动页面和脱机应用程序的设置过程),则需采用此方法。以下是在同一解决方案中创建Silverlight项目和使用该项目的ASP.NET网站的步骤:
1. 在Visual Studio中选择“文件”>“新建”>“项目”,选择“Visual C# • Silverlight”项目类型组,然后选择“Silverlight应用程序”模板。建议使用“为解决方案创建目录”选项,以便将Visual Studio创建的两个项目(一个用于Silverlight程序集,一个用于ASP.NET网站)组合在一起。
2. 通常,Visual Studio会假设你希望在创建的任何Web应用程序的服务器端部分使用最新版本的.NET。若不希望如此,可在“新建项目”窗口顶部的下拉列表中选择不同版本的.NET。例如,选择.NET Framework 3.5,ASP.NET网站将配置为使用这个稍旧版本的.NET。
3. 选择解决方案名称和项目名称后,点击“确定”创建项目。
4. 确保选中“在新网站中托管Silverlight应用程序”选项。
5. 为ASP.NET网站提供一个项目名称,默认情况下,它是项目名称加上`.Web`后缀。
6. 在下方的下拉列表中,选择Visual Studio管理项目的方式:ASP.NET Web应用程序项目、ASP.NET网站或ASP.NET MVC项目。此选择不影响Silverlight的工作方式,但示例通常使用ASP.NET网站。
7. 在“Silverlight版本”列表中选择要创建的Silverlight应用程序版本(Silverlight 5或Silverlight 4)。
8. 也可以选择启用WCF RIA服务,这是一组有助于弥合Silverlight客户端世界和ASP.NET服务器端世界之间差距的Web服务。对于基本的Silverlight网站,建议不选中此选项。
9. 最后,点击“确定”创建解决方案。
### 3.2 ASP.NET项目选项差异
创建带有ASP.NET应用程序的Silverlight项目时,Visual Studio提供三种不同的项目选项,选择不同选项不会影响Silverlight编码,但会改变与ASP.NET部分网站的交互方式:
| 项目选项 | 特点 |
| ---- | ---- |
| ASP.NET Web应用程序项目 | Visual Studio使用项目文件跟踪Web应用程序的内容,并在运行网站之前将所有ASP.NET代码编译成单个程序集。 |
| ASP.NET网站 | Visual Studio假设应用程序文件夹中的所有内容都是Web应用程序的一部分。用户首次请求页面时(或使用预编译工具`aspnet_compiler.exe`时),网页代码将被编译。 |
| ASP.NET MVC Web项目 | 与ASP.NET Web应用程序项目具有相同的编译模型,但网站将配置为使用精简的ASP.NET MVC开发模式,而非经典的Web表单模式。 |
## 4. 集成Silverlight内容到ASP.NET应用程序
### 4.1 集成方式
有两种方法可将Silverlight内容集成到ASP.NET应用程序中:
- 创建包含Silverlight内容的HTML文件:将这些文件放在ASP.NET网站文件夹中,就像普通HTML文件一样。此方法的唯一限制是HTML文件不能包含ASP.NET控件,因为它不会在服务器上处理。
- 将Silverlight内容放置在ASP.NET网页中:在这种情况下,加载Silverlight插件的`<object>`元素会插入到动态的`.aspx`页面中。可以在页面的不同区域添加其他ASP.NET控件。此方法的唯一缺点是页面始终在服务器上处理。若实际上未使用任何服务器端ASP.NET内容,首次请求页面时会产生不必要的额外开销。
当然,也可以混合使用这两种方法,在同一网站的专用HTML页面和ASP.NET网页中使用Silverlight内容。在Visual Studio中创建带有ASP.NET网站的Silverlight项目时,会同时拥有这两种方式。例如,若Silverlight项目名为`SilverlightApplication1`,可以使用`SilverlightApplication1TestPage.html`或`SilverlightApplication1TestPage.aspx`。
### 4.2 调试体验
Silverlight和ASP.NET选项提供的调试体验与仅使用Silverlight的解决方案基本相同。运行解决方案时,Visual Studio会编译两个项目,并将Silverlight程序集复制到ASP.NET网站的`ClientBin`文件夹中。编译完成后,Visual Studio会查找启动项目(即ASP.NET网站)和当前选择的页面,然后启动默认浏览器并导航到该页面。不同之处在于,它不会直接从文件系统请求起始页面,而是与内置的测试Web服务器进行通信。该Web服务器会自动加载到随机选择的端口上,类似于精简版的IIS,但仅接受本地计算机的请求,这样无需配置IIS虚拟目录即可轻松进行调试。
## 5. ASP.NET控件渲染Silverlight内容
### 5.1 Silverlight控件概述
过去,希望集成Silverlight内容的ASP.NET开发人员常依赖名为`Silverlight`的专门设计的ASP.NET Web控件。与所有ASP.NET控件一样,`Silverlight`控件在服务器上处理。当ASP.NET引擎将页面渲染为HTML时,`Silverlight`控件会发出定义Silverlight内容区域的`<object>`元素。最终,客户端获得的内容与普通非ASP.NET托管的Silverlight应用程序相同,但服务器端编程模型略有不同。
### 5.2 优缺点
使用Web控件生成Silverlight内容区域的优点是为服务器端交互提供了可能性,例如服务器端代码可以动态设置`Silverlight`控件的`Source`属性,指向不同的应用程序。然而,ASP.NET Silverlight控件与服务器代码的实际交互机会有限,最终它不过是`<object>`元素的美化包装。若要在新项目中使用`Silverlight`和`MediaPlayer`控件,可以从`http://code.msdn.microsoft.com/aspnetprojects`下载它们的源代码。
## 6. 混合ASP.NET控件和Silverlight内容
### 6.1 问题与解决方案
大多数示例使用HTML测试页面,但更有野心的ASP.NET开发人员可能会使用Silverlight为现有ASP.NET页面添加新功能或进行美化。例如,使用Silverlight驱动的广告内容、菜单系统和嵌入式小程序(如计算器或游戏)。但创建此类页面时,需要考虑一些问题。
所有ASP.NET代码都在Web服务器上运行,为了使服务器端代码运行,ASP.NET控件使用回发机制将当前页面发送回服务器。例如,点击ASP.NET按钮时会发生这种情况。问题是,当页面回发时,当前的Silverlight应用程序会结束。Web服务器代码运行,新的页面版本会发送到浏览器,浏览器加载新页面,此时Silverlight应用程序会重新启动。这不仅会使用户回到起点,还会因为需要重新初始化Silverlight环境而花费额外的时间。
若要避免这种干扰,可以使用ASP.NET AJAX技术,其中`UpdatePanel`是一个特别有用的工具。基本技术是将通常会触发回发的控件以及它们修改的任何其他控件包装在一个或多个`UpdatePanel`控件中。这样,当用户点击按钮时,会向Web服务器发送异步请求,而不是完整的回发。当浏览器收到回复时,会更新页面的相应部分,而不会中断Silverlight内容。
## 7. Silverlight编译和部署
### 7.1 编译过程
编译Silverlight项目时,Visual Studio使用与完整.NET应用程序相同的`csc.exe`编译器,但引用不同的程序集,并传递命令行参数`nostdlib`,以防止C#编译器使用标准库(定义在`mscorlib.dll`中的.NET Framework核心部分)。也就是说,Silverlight应用程序可以像用标准C#编写的普通.NET应用程序一样编译,只是可使用的类库更有限。Silverlight编译模型具有许多优点,包括易于部署和与普通JavaScript相比性能有显著提升。
编译后的Silverlight程序集包含编译后的代码和应用程序中每个页面的XAML文档,这些文档作为资源嵌入到程序集中,确保事件处理代码不会与所需的用户界面标记分离。需要注意的是,XAML不会以任何方式编译(与WPF将其转换为更优化的BAML格式不同)。
### 7.2 编译产物
Silverlight项目会编译成一个以项目命名的DLL文件。例如,若项目名为`SilverlightApplication1`,`csc.exe`编译器会创建`SilverlightApplication1.dll`文件。项目程序集会被放置在项目目录的`Bin\Debug`文件夹中,同时还会包含一些其他重要文件:
- PDB文件:包含Visual Studio调试所需的信息,以项目程序集命名(如`SilverlightApplication1.pdb`)。
- `AppManifest.xaml`:列出程序集依赖项。
- 依赖程序集:`Bin\Debug`文件夹包含Silverlight项目使用的程序集,前提是这些程序集的“复制本地”属性设置为`True`。Silverlight核心部分的程序集“复制本地”属性设置为`False`,因为它们无需与应用程序一起部署。可以通过展开“解决方案资源管理器”中的“引用”节点,选择程序集,然后使用“属性”窗口更改“复制本地”设置。
- 测试页面:用户请求此页面以启动Silverlight应用程序。
- XAP文件:这是一个Silverlight包,包含部署Silverlight应用程序所需的一切,包括应用程序清单、项目程序集以及应用程序使用的任何其他程序集。若正在开发ASP.NET托管的Silverlight应用程序,Visual Studio还会将XAP文件复制到测试网站的`ClientBin`文件夹中。
可以使用Visual Studio项目属性更改程序集名称、默认命名空间(添加新代码文件时使用)和XAP文件名称,只需在“解决方案资源管理器”中双击“属性”节点即可。
## 8. 总结与最佳实践
### 8.1 关键要点回顾
为了更好地理解和掌握Silverlight开发,下面对前面的关键内容进行总结:
- **事件处理**:使用`-=`运算符分离事件处理程序,避免重复连接同一事件处理程序到同一事件,防止多次触发。示例代码如下:
```csharp
cmdClickMe.Click -= cmdClickMe_Click;
```
- **类库特点**:Silverlight版本的.NET Framework经过简化,类型数量减少,类的成员也更精简,但仍能实现强大功能。
- **测试与部署**:测试时要注意本地文件系统和真实服务器环境的差异,生产测试建议使用ASP.NET测试网站或部署到测试服务器;编译后生成DLL、PDB、XAP等文件,部署需要包含必要的依赖项。
- **与ASP.NET集成**:有创建HTML文件和放置在ASP.NET网页两种集成方式,可混合使用;使用`UpdatePanel`避免ASP.NET回发对Silverlight应用的影响。
### 8.2 最佳实践建议
在进行Silverlight开发时,遵循以下最佳实践可以提高开发效率和应用质量:
- **合理使用类库**:了解Silverlight类库的局限性,选择最实用的成员进行开发,避免不必要的功能引入。
- **测试环境模拟**:在生产测试前,尽量模拟真实的部署环境,减少因环境差异导致的问题。
- **集成方式选择**:根据项目需求选择合适的集成方式,如不需要服务器端处理,优先使用HTML文件;需要服务器交互,可将Silverlight内容放置在ASP.NET网页中。
- **性能优化**:利用Silverlight编译模型的优势,提高应用的部署和运行性能。
### 8.3 开发流程梳理
以下是一个典型的Silverlight开发流程,帮助你更清晰地规划项目:
```mermaid
graph LR
A[需求分析] --> B[创建项目]
B --> C[设计界面与逻辑]
C --> D[编写代码]
D --> E[测试调试]
E --> F{是否通过测试}
F -- 否 --> D
F -- 是 --> G[部署上线]
```
## 9. 未来发展趋势与展望
### 9.1 技术发展趋势
随着Web技术的不断发展,Silverlight也在不断适应新的需求和挑战。未来,Silverlight可能会在以下方面有所发展:
- **与新兴技术融合**:如与人工智能、大数据等技术结合,为用户提供更智能、个性化的体验。
- **跨平台支持增强**:进一步优化在不同操作系统和设备上的性能和兼容性。
- **安全性提升**:随着网络安全问题日益突出,Silverlight将不断加强安全机制,保护用户数据和隐私。
### 9.2 应用场景拓展
除了现有的应用场景,Silverlight在未来可能会拓展到更多领域:
- **虚拟现实与增强现实**:为虚拟现实和增强现实应用提供更强大的交互和渲染能力。
- **物联网应用**:在物联网设备的监控和控制方面发挥更大作用。
- **教育与培训**:开发更生动、互动性强的教育和培训应用。
### 9.3 持续学习与创新
作为开发者,需要不断学习和关注Silverlight的最新发展动态,积极探索新的应用场景和技术解决方案。通过参与开源项目、参加技术交流活动等方式,与其他开发者分享经验和见解,共同推动Silverlight技术的发展。
总之,Silverlight开发具有丰富的功能和广阔的应用前景。通过深入学习和实践,掌握其核心技术和开发技巧,结合合理的项目规划和最佳实践,开发者可以创建出高质量、高性能的Silverlight应用程序。希望本文能为你在Silverlight开发的道路上提供有价值的参考和指导。
0
0
复制全文
相关推荐










