[Silverlight]通过SilverlightLoader使用托管代码创建自定义载入界面(Splash Screen) (上)

Silverlight中的Splash Screen,也就是我们常说的载入页面/界面。

对Silverlight有过一些接触的朋友们一定都清楚:要创建Silverlight的自定义载入页面,我们需要创建一个非托管的XAML,并且通过js来做出进度可控制等操作。

使用非托管XAML+js的解决方案详见MSDN:http://msdn.microsoft.com/zh-cn/library/cc903962(VS.95).aspx

这样做的缺点是显而易见的

  • 没有代码感知
  • 没有错误检查
  • 一直延续着sl1的做法,使用js操作XAML,着实麻烦。而且js也继承了上面两条缺点。

 

鉴于以上所述的缺点,我在项目中已经放弃了这种做法转而使用SilverlightLoader,今天的这篇文章就是要对SilverlightLoader做一个简单的说明,下一篇文章会提供一个应用实例。

什么是Silverlight Loader?

Silverlight Loader 是一个用于使用托管代码创建Silverlight Splash Screen或(预)载入页面功能的简单的轻量级框架。并且它是开源的。

它在CodePlex的地址如下:http://www.codeplex.com/SilverlightLoader,我们需要先下载它的最新Release。

如何使用Silverlight创建Splash Screen?

第一步:创建一个Silverlight Loader项目或在现有的Silverlight项目中使用它

 

  • 在现有项目中使用SilverlightLoader:从我们下载的Release中找到SilverlightLoader.cs将其添加到项目的任意目录中。打开我们的项目,将SilverlightLoader.cs作为已存在的文件添加到当前项目中。
  • 通过项目模板创建一个Silverlight Loader项目:将SilverlightLoader模板文件拷贝到VS的模板文件夹下,如My Documents\Visual Studio 2008\ProjectTemplates\Visual C#。而后就可以在新建项目时看到Silverlight Loader项目了。

 

第二步:实现ISliverlightLoader接口并设置Source
  • 实现ISliverlightLoader接口

ISilverlightLoader接口的定义如下

    public interface ISilverlightLoader
    {
        // 初始化加载须加载的数据包列表
        void initCallback(List<Uri> packageSourceList);
        
        // 回调函数,用于标识开始加载数据包
        void downloadStartCallback(Uri packageSource);

        // 回调函数,用于标识加载进度发生变化
        void downloadProgressCallback(Uri packageSource, DownloadProgressEventArgs eventArgs);

        // 回调函数,用于标识加载数据包结束
        void downloadCompleteCallback(Uri packageSource, DownloadCompleteEventArgs eventArgs);
    }

注释是我加的,应该比较清晰了,这里不多做解释

  • 创建动态加载外部数据的开始点

一般我们会在App.xaml.cs中的Application_Startup事件中开始载入数据包

private void Application_Startup(object sender, StartupEventArgs e) { // 实例化一个载入页面 ProgressBaby loader = new ProgressBaby(); // 将载入界面设置为默认页面 this.RootVisual = loader;

 

 

// 载入外部数据包(XAP) PackageDownloadManager pdm = new PackageDownloadManager(loader, e.InitParams, 1000); }

第三步:在HTML或asp:Silverlight控件设置初始载入界面与载入目标
  • HTML中的设置方法
<object data="data:application/x-silverlight-2," type="application/x-silverlight-2"
    width="550" height="400">
    <param name="source" value="ClientBin/Loader.xap" />
    <param name="onerror" value="onSilverlightError" />
    <param name="background" value="white" />
    <param name="minRuntimeVersion" value="2.0.31005.0" />
    <param name="autoUpgrade" value="true" />
    <param name="initParams" value="LoaderSourceList=ClientBin/Forever.xap" />
    <a href="http://go.microsoft.com/fwlink/?LinkID=124807" style="text-decoration: none;">
        <img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight"
            style="border-style: none" />
    </a>
</object>

注意加下划线的两行,Source为载入页面的XAP数据包。initParams中LoaderSourceList的值为载入目标的XAP数据包地址。上例中,我们使用Loader.xap载入Forever.xap。

  • 在asp:Silverlight控件中设置的方法
<asp:Silverlight ID="Xaml1" runat="server" Source="~/ClientBin/Loader.xap" MinimumVersion="2.0.31005.0"
    Width="550" Height="400" InitParameters="LoaderSourceList=ClientBin/Forever.xap" />

与在HTML中通过Object对象设置的原理相同,也不多说了。

接下来要做的事

以上设置完毕后我们的SilverlightLoader还没有大功告成。在数据包载入之后不要忘记手动将加载完成的数据包设置成当前数据包。

我们需要通过XapUtil.setCurrentXapFile(source)设置当前数据包。

void ISilverlightLoader.downloadCompleteCallback(Uri packageSource, DownloadCompleteEventArgs eventArgs) {

    XapUtil.setCurrentXapFile(packageSource);
}

至此,一个完整的SilverlightLoad托管Splash Screen就完成了。怎么样,心动了吗?快自己动手做做,做好的载入效果不放共享出来。

下一篇将已一个简单的在线实例向大家演示具体效果。

OK,have fun~

posted @ 2009-12-28 18:37  紫色永恒  阅读(3641)  评论(14编辑  收藏  举报