使用SilverLight构建应用程序(一)

SilverLightMS推出的构建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.WebWeb项目,使用.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

精彩内容:稍后继续