使用SilverLight构建应用程序(一)
SilverLight是MS推出的构建RIA应用程序的利器,由于我对Web图形方面比较感兴趣,对SVG也了解一些,所以从SilverLight1.0推出的是有我就一直看着方面的东西,到Beta2的时候我想要的很多东西基本都有了,就萌生一个想法,用这个来做点东西,那就是构建一个插件模式的RIA应用程序。
看了这么久,先说说我对SilverLight最不满意的几个地方:
1. SilverLight还没有实现对摄像头和语音的支持,以及没有3D方面的支持,真是让我非常不爽,这个是对比Flash来说的;
2. SilverLight控件的样式,说真的,默认的怎么会这么难看.Orz;
3. SilverLight的全屏抗锯齿问题,不知道MS的人怎么想的,文字大的时候还不错,可是文字一小,什么都看不清。顺便问一句,能够显示文字的时候把这个功能关掉吗?
我写这个程序的所有经验都来自网络,也引用了一些网络资源,在此我很感激。
1. 程序是以插件框架构建,每个功能都使用插件的模式处理;
2. 程序目前实现了在3D地球上显示城市坐标,并可以显示天气;
3. 程序使用Liver Search引擎搜索结果;
4. 程序发布本地的软件;
5. 我想实现的还很多,正好看看有没有人对这个感兴趣,可以一起做。
整个解决方案有9个项目构成,
其中WindCloud.Web是Web项目,使用.net2.0的(没办法,我的空间只支持2.0); WindCloud.Main是整个项目的主程序也是插件的宿主程序,是一个SilverLight的应用程序;WindCloud.PubUnit是公共的程序集,比如窗口啊,翻页啊,或者媒体播放等等大家都会用到的就放这个里边了。WindCloud.Weather是天气的插件,WindCloud.Search是搜索的插件,WindCloud.Soft是我本来网站介绍我自己的软件的一个插件。其他几个都是插件,只是还没有实现,看名字都知道了。这些所有的插件的项目类型都是SilverLight的类库。
最终效果如下:
重点:
Q:如何构建宿主程序?
A:任意建立的一个SilverLight的应用程序都可以当成宿主程序;
Q:如果构建插件?
A:任意构建的一个SilverLight的类库都是一个插件,只不过为了显示在界面上,我们会在每个插件里面UserControl来做界面。
使用WebClient下载插件之后,使用反射加载插件,具体的看代码和说明注释:
首先,我们创建一个XML配置文件来保存插件信息,如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<assembly xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<filename>WindCloud.Weather.dll</filename>
<version>0.0.2</version>
<layout>grid:1,1,1,1</layout>
<titlename>Globe Weather</titlename>
<imagename>Weather.png</imagename>
<typename>WindCloud.Weather.PageGlobe</typename>
<description></description>
</assembly>
</configuration>
Filename:插件的文件名称;
Version:插件的版本,这个很重要,每次系统启动之后都会读取服务的配置文件,根据版本是否相同来判断插件是否需要更新,如果需要更新,就下载到客户端;
Layout:布局方式;
Typename:很重要,类型名称,用来反射的时候使用。
在主项目建立一个实体对象描述插件信息:
public class PluginConf
{
public string filename { get; set; }
public string version { get; set; }
public string layout { get; set; }
public string titlename { get; set; }
public string imagename { get; set; }
public string typename { get; set; }
public string description { get; set; }
}
至此,准备工作完成,下边开始进入流程:
项目启动的时候,下载配置文件信息:
//获取升级配置文件,检测是否需要下载新的插件文件
WebClient wcPlugin = new WebClient();
if (wcPlugin.IsBusy)
{
wcPlugin.CancelAsync();
}
wcPlugin.OpenReadCompleted += new OpenReadCompletedEventHandler(wcPlugin_OpenReadCompleted);
wcPlugin.OpenReadAsync(new Uri(PublicUnit.PluginConfigFile, UriKind.Relative));
void wcPlugin_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
//获取服务器的升级文件
Stream d = e.Result as Stream;
XElement xmlServer = XElement.Load(System.Xml.XmlReader.Create(e.Result));
//定义查询方法
IEnumerable<PluginConf> pluginConfsServer = from c in xmlServer.DescendantsAndSelf("assembly")
select new PluginConf
{
description = c.Elements("description").SingleOrDefault().Value,
filename = c.Elements("filename").SingleOrDefault().Value,
layout = c.Elements("layout").SingleOrDefault().Value,
imagename = c.Elements("imagename").SingleOrDefault().Value,
titlename = c.Elements("titlename").SingleOrDefault().Value,
typename = c.Elements("typename").SingleOrDefault().Value,
version = c.Elements("version").SingleOrDefault().Value
};
}
至此,把服务器端的配置文件加载到了本地
源代码下载 http://www.prolightsoft.com/windcloud.rar
精彩内容:稍后继续…