星辰.Net技术社区论坛

首页 » .NET » Silverlight » 使用createObject(createObjectEx)创建Silverlight对象
admin - 2008-7-7 11:31:00
在我们正常创建的silverlight Application项目之后,会在相应的web文件夹中生成两个名称相同但扩展名:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
分别为aspx和html和页面。
    其中的aspx页面是我们所熟悉的控件声明方式的布局页,形如:    :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
<div  style="height:100%;">:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
           
<asp:Silverlight ID="Xaml1" runat="server" Source="~/ClientBin/**.xap" :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                MinimumVersion
="2.0.30523" Width="100%" Height="100%"/>:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
</div>:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    在我之前所写的大部分silverlight文章中都是以这样的方面来声明并调用XAP文件的。但这种是采用控件声:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
明方式来实现,而silverlight本身是可以在多种语言(包括动态语言)平台上开发,并跨浏览器运行的。比如我们:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
就可以在html 中使用js来创建和操作silverlight对象(通过Silverlight.js提供),而相应的方法包括::“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
Silverlight.createObject = function(source, parentElement, id, properties, :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                                    events, initParams, userContext)
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
Silverlight.createObjectEx = function(params):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    而在介绍这两个方法之前,有必要先看一下这张图::“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    上图中的顺时针箭头方向表示当我们在HTM页面中采用JS方式创建SILVERLIGHT对象时,文件之间的相应:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
调用关系。
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    当然本文为了简化这张图所调用的环节,直接将 CreateSilverlight.js 中的调用写在了htm中,将这不会影:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
响我们对上图的理解。
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    好了,接下来先介绍上面提到的两个方法, 先说一下createObject,其函数声明如下(Silverlight.js文件中)::“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    Silverlight.createObject = function(source, :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                                        parentElement, :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                                        id, :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                                        properties, :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                                        events, :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                                        initParams, :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                                        userContext)
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                                        :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    该方面中的参数说明摘自silverlight sdk::“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    source :对 XAML 内容的文件的引用,对应 Silverlight 插件的 Source 属性 :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    parentElement: 对包含 createSilverlight 方法调用的 HTML 文件中块级元素的引用,在实例化后成为 :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                  Silverlight 插件的宿主元素(也就是想在哪个元素中声明silverlight object) :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                  :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    id : HTML DOM 中对 实例化的 Silverlight 插件的唯一标识 :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    properties :Silverlight 插件实例化属性的集合(width,height,background,isWindowless,frameRate,:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                inplaceInstallPrompt,version,ignoreBrowserVer,enableHtmlAccess):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    events :能够在初始化时设置的 Silverlight 插件的事件集合:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            包括onError:当生成silverlight运行时组件报错信息的处理;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                onLoad:当组件的onLoad事件触发时绑定的JS方法;    :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    initParams : 初始化参数允许你指定用户定义的参数值。这些参数值可以在运行时通过访问插件的InitParams:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
          属性得到。
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    userContext: 作为参数传给 OnLoad 事件处理器的唯一标识,可以被同一页面中的多个 Silverlight 插件共享。:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
          这个值唯一标识了哪个插件被加载,而无需检查 HTML DOM。更多信息请参见 使用 OnLoad 事件。 :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
          :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    看着挺麻烦,但实际使用起来很简单,请看一下如下示例代码(对照上面的函数声明):    :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
// 创建当前插件宿主元素(html)的引用.:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
var parentElement = document.getElementById("silverlightControlHost");:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
// 对当前实例定义唯一标识变量.:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
var conText = "context_2";:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
function createSilverlightByPluginID(pluginID):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    Silverlight.createObject(:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
       
"ClientBin/Silverlight_Js.xap",                  // 源属性值.:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        parentElement,                  // Div标签宿主引用.:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        pluginID,                          // 唯一插件ID值, 当页面调用被设置.:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        {                              // 插件属性,此处属性设置优先于xaml中的设置:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            width:'400',              :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            height:
'200',              :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            version:
'2.0',            :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            isWindowless:
'true',:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            background:
'aliceblue',:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            framerate:
'24', :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            version:
'2.0'                  :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        },:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            onError:onSilverlightError,
// 错误处理事件绑定.:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            onLoad:onLoad              // 加载事件绑定,可用于多个实例.:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        },:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
       
"pluginID=" + pluginID,        // 初始化参数,可设置为 null 或 {}  :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        conText);                    :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
}:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    这样我们就在"silverlightControlHost"元素中定义了一个silverlight object对象。:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
  :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    当然上面JS代码中的onSilverlightError是在创建silverlight项目中就已声明好的,这里就不多做介绍了。需要:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
说明的是onLoad的事件绑定,因为在这里我们可以对silverlight object做进行一步的操作如下:
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
/*参数说明:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
plugin  Object : 标识的 Silverlight plug-in 插件.:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
userContext  String :  对象上面所说的userContext.:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
sender  Object : 当前插件的根元素引用,如Canvas等 :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
*/:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
function onLoad(plugin, userContext, sender):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
{:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    $get(
'message').innerHTML = plugin.id + " : " + userContext + " : " + sender.toString();:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
// getHost()返回plug-in的引用:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
// 任何UIElement派生对象将可使用GetHost方法来返回Silverlight插件的实例. :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
var plugin = sender.getHost();:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
// 获取初始化参数 InitParams 值,并使用逗号分割符分割该字符串.:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
var params = plugin.initParams.split(",");:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
// 显示参数:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
var msg = "Params: ";:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
for (var i = 0; i < params.length; i++):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        msg
+= params+ " ";:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    alert(msg);:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
//只读属性 IsLoaded 是在 Onload 事件之前设置的,标识 Silverlight 插件是否已经加载。:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    alert(plugin.IsLoaded);:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
if (plugin.IsVersionSupported("2.0")):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        alert(
"当前版本支持 2.0");:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
else:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        alert(
"当前版本不支持 2.0");:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
}:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    正如大家所看到了,我们可以通过getHost得到silverlight object属性中的一些重要信息,当然:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
还可以进行版本检测,插件对象加载是否完成等功能的开发。不如要说明的是silverlight 版本号是按:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
下面格式的字符串表示:
    :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
versionMajor.versionMinor.buildNumber.revisionNumber :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    看到这里,我们还需要再深入一步,看一下createObject方法体到底是执行了什么操作来进行对象:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
声明的。
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    请看如下代码段(摘自silverlight.js)::“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
Silverlight.createObject = function(source, :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                                    parentElement, :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                                    id, :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                                    properties, :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                                    events, :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                                    initParams, :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                                    userContext):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
{:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
var slPluginHelper = new Object();:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
var slProperties = properties;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
var slEvents = events;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    slPluginHelper.version
= slProperties.version;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    slProperties.source
= source;    :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    slPluginHelper.alt
= slProperties.alt;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
//rename properties to their tag property names:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
if ( initParams ):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        slProperties.initParams
= initParams;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
if ( slProperties.isWindowless && !slProperties.windowless):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        slProperties.windowless
= slProperties.isWindowless;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
if ( slProperties.framerate && !slProperties.maxFramerate):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        slProperties.maxFramerate
= slProperties.framerate;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
if ( id && !slProperties.id):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        slProperties.id
= id;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
// remove elements which are not to be added to the instantiation tag:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
delete slProperties.ignoreBrowserVer;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
delete slProperties.inplaceInstallPrompt;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
delete slProperties.version;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
delete slProperties.isWindowless;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
delete slProperties.framerate;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
delete slProperties.data;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
delete slProperties.src;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
delete slProperties.alt;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
// detect that the correct version of Silverlight is installed, else display install:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
if (Silverlight.isInstalled(slPluginHelper.version)):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
       
//move unknown events to the slProperties array:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        for (var name in slEvents):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
           
if ( slEvents[name]):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
               
if ( name == "onLoad" && typeof slEvents[name] == "function" && slEvents[name].length != 1 ):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                   
var onLoadHandler = slEvents[name];:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                    slEvents[name]
=function (sender):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                    { :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                       
return onLoadHandler(document.getElementById(id), userContext, sender):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                    };:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
               
//绑定事件处理方法(有点C#事件绑定味道,呵呵):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                var handlerName = Silverlight.__getHandlerName(slEvents[name]);:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
               
if ( handlerName != null ):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                    slProperties[name]
= handlerName;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                    slEvents[name]
= null;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
               
else:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                   
throw "typeof events."+name+" must be 'function' or 'string'";:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
                }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        slPluginHTML
= Silverlight.buildHTML(slProperties);:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
//The control could not be instantiated. Show the installation prompt:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    else :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        slPluginHTML
= Silverlight.buildPromptHTML(slPluginHelper);:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
// insert or return the HTML:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    if(parentElement):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        parentElement.innerHTML
= slPluginHTML;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
else:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
       
return slPluginHTML;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
}:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
///////////////////////////////////////////////////////////////////////////////:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
//:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
//
  create HTML that instantiates the control:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
//:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
//
/////////////////////////////////////////////////////////////////////////////:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
Silverlight.buildHTML = function( slProperties):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
{:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
var htmlBuilder = [];:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    htmlBuilder.push(
'<object type=\"application/x-silverlight\" data="data:application/x-silverlight,"');:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
if ( slProperties.id != null ):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        htmlBuilder.push(
' id="' + slProperties.id + '"');:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
if ( slProperties.width != null ):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        htmlBuilder.push(
' width="' + slProperties.width+ '"');:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
if ( slProperties.height != null ):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        htmlBuilder.push(
' height="' + slProperties.height + '"');:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    htmlBuilder.push(
' >');:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
delete slProperties.id;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
delete slProperties.width;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
delete slProperties.height;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
for (var name in slProperties):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
       
if (slProperties[name]):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            htmlBuilder.push(
'<param name="'+Silverlight.HtmlAttributeEncode(name)+'" value="'+Silverlight.HtmlAttributeEncode(slProperties[name])+'" />');:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    htmlBuilder.push(
'<\/object>');:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
return htmlBuilder.join('');:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
}:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    原来是用buildHTML方法将传入的属性按声明顺序组合成字符串并最终绑定到指定的parentElement.innerHTML:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
属性上,的确很简单,实在没什么可多说的了(当然里面的方法绑定略有不同,但与我们进行事件声明绑定有类似的语法:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
味道)。
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    看到这里,还需要介绍一下另外一个创建对象的方法createObjectEx,其函数声明如下(silverlight.js中)::“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
Silverlight.createObjectEx = function(params):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
{:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
var parameters = params;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
var html = Silverlight.createObject(parameters.source, parameters.parentElement, parameters.id, parameters.properties, parameters.events, parameters.initParams, parameters.context);:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
   
if (parameters.parentElement == null):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    {:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
       
return html;:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    }:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
}
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    说白了它就是对createObject方法的一次封装([size=-1]encapsulation),而这样做的目的就是为了让那些习惯使用JSON:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
格式的程序员有一个感觉很舒服的参数声明方法,其最终的使用格式如下::“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
function createSilverlightExByPluginID(pluginID):“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    Silverlight.createObjectEx({:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        source:
'ClientBin/Silverlight_Js.xap',          // Source property value.:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        parentElement:parentElement2,    // 对包含 createSilverlight 方法调用的 HTML 文件中块级元素的引用,:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
//  在实例化后成为 Silverlight 插件的宿主元素:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        id:pluginID,                  // 唯一的插件ID值:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        properties:{                    // 插件属性.:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            width:'400',              :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            height:
'200',              :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            inplaceInstallPrompt:
false, // 如果指定版本的 Silverlight 插件没有安装,inplaceInstallPrompt :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
//  初始化参数决定是否出现安装对话框。它的默认值是 false,也就是说,:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
//  如果 Silverlight.js 文件中版本检查返回 false,下面的 Silverlight :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
//  标准安装对话框将会出现。:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            background:'red',        // 插件背景色:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            isWindowless:'true',    // 是否在windowless 模式下显示插件.:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            framerate:'24',          // MaxFrameRate property value.:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            version:'2.0'},          // Silverlight 版本.:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        events:{:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            onError:onSilverlightError,  :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            onLoad:onLoad:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
            },              :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        initParams:
"pluginID=":“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
+ pluginID, // 初始化参数:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
        context:conText});                :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
}:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    总体感觉与上面的createObject方法差别不是太大,但参数的可读性和层次性更清晰了。:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
  :“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
    到这里这两个重要的方法介绍的差不多了,下面的这个DEMO分别演示了这两种方法的使用方法。并通过指定不同的初:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
始化initParams方法来实现调用不同的XAML的功能(里面的CS代码很简单,大家下载之后一看便知)。:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹
     
:“ÁAî%÷î̊www.netcsharp.cn­«”1IècQ¹

附件: silverlight_js.rar
1
查看完整版本: 使用createObject(createObjectEx)创建Silverlight对象