使用createObject(createObjectEx)创建silverlight对象

使用createObject(createObjectEx)创建silverlight对象,第1张

概述    在我们正常创建的silverlight Application项目之后,会在相应的web文件夹中生成两个名称相同但扩展名分别为aspx和html和页面。      其中的aspx页面是我们所熟悉的控件声明方式的布局页,形如:     < asp:ScriptManager  ID ="ScriptManager1"  runat ="server" ></ asp:ScriptManage     在我们正常创建的silverlight Application项目之后,会在相应的web文件夹中生成两个名称相同但扩展名分别为aspx和HTML和页面。      其中的aspx页面是我们所熟悉的控件声明方式的布局页,形如:     < asp:ScriptManager  ID ="ScriptManager1"  runat ="server" ></ asp:ScriptManager >
div   style ="height:100%;"
            
asp:Silverlight  ="Xaml1" ="server"  Source ="~/ClIEntBin/**.xap"  
                 MinimumVersion
="2.0.30523"  WIDth ="100%"  Height   /> </ div
     在我之前所写的大部分silverlight文章中都是以这样的方面来声明并调用XAP文件的。但这种是采用控件声明方式来实现,而silverlight本身是可以在多种语言(包括动态语言)平台上开发,并跨浏览器运行的。比如我们就可以在HTML 中使用Js来创建和 *** 作silverlight对象(通过Silverlight.Js提供),而相应的方法包括:
Silverlight.createObject  = function (source, parentElement, ID, propertIEs, 
                                    events, initParams, userContext)

Silverlight.createObjectEx  (params)      而在介绍这两个方法之前,有必要先看一下这张图:


    
    
     上图中的 顺时针箭头方向表示当我们在htm页面中采用Js方式创建SILVERliGHT对象时,文件之间的相应调用关系。     当然本文为了简化这张图所调用的环节,直接将 CreateSilverlight.Js 中的调用写在了htm中,将这不会影响我们对上图的理解。     好了,接下来先介绍上面提到的两个方法,先说一下createObject,其函数声明如下(Silverlight.Js文件中):
    
    Silverlight.createObject  source :对 XAML 内容的文件的引用,对应 Silverlight 插件的 Source 属性 
    
    parentElement: 对包含 createSilverlight 方法调用的 HTML 文件中块级元素的引用,在实例化后成为Silverlight 插件的宿主元素(也就是想在哪个元素中声明silverlight object) 
                   
    ID : HTML DOM 中对 实例化的 Silverlight 插件的唯一标识 
    
    propertIEs :Silverlight 插件实例化属性的集合( wIDth,height,background,iswindowless,frameRate,
                 inplaceInstallPrompt,version,ignorebrowserVer,enableHTMLAccess)

    events :能够在初始化时设置的 Silverlight 插件的事件集合
            包括onError:当生成silverlight运行时组件报错信息的处理;
                 onLoad:当组件的onLoad事件触发时绑定的Js方法;    
     
    initParams : 初始化参数允许你指定用户定义的参数值。这些参数值可以在运行时通过访问插件的InitParams           属性得到。     userContext: 作为参数传给 OnLoad 事件处理器的唯一标识,可以被同一页面中的多个 Silverlight 插件共享。这个值唯一标识了哪个插件被加载,而无需检查 HTML DOM。更多信息请参见 使用 OnLoad 事件。
          
     看着挺麻烦,但实际使用起来很简单,请看一下如下示例代码(对照上面的函数声明):   
//  创建当前插件宿主元素(HTML)的引用. var  parentElement   document.getElementByID( " silverlightControlHost );
    
 对当前实例定义唯一标识变量.  conText  context_2 ;
    
 createSilverlightByPluginID(pluginID)
{  
    Silverlight.createObject(
        
ClIEntBin/Silverlight_Js.xap ,                    源属性值.         parentElement,0);"> div标签宿主引用.         pluginID,                             唯一插件ID值, 当页面调用被设置.         {                                 插件属性,此处属性设置优先于xaml中的设置             wIDth: ' 400 200 2.0 true aliceblue 24                    
        },
        {
            onError:onSilverlightError, 
 错误处理事件绑定.             onLoad:onLoad                 加载事件绑定,可用于多个实例.         },
        
pluginID= +  pluginID,          初始化参数,可设置为 null 或 {}           conText);                     
}
    这样我们就在" silverlightControlHost"元素中定义了一个silverlight object对象。
  
    当然上面Js代码中的onSilverlightError是在创建silverlight项目中就已声明好的,这里就不多做介绍了。需要说明的是onLoad的事件绑定,因为在这里我们可以对silverlight object做进行一步的 *** 作如下: /* 参数说明
plugin  Object : 标识的 Silverlight plug-in 插件.
userContext  String :  对象上面所说的userContext.
sender  Object : 当前插件的根元素引用,如Canvas等 
*/  onLoad(plugin, userContext, sender)
{
    $get(
message ).INNERHTML   plugin.ID   :   userContext   sender.toString();
    
    
 getHost()返回plug-in的引用       任何UIElement派生对象将可使用GetHost方法来返回Silverlight插件的实例.   plugin   sender.getHost();

    
 获取初始化参数 InitParams 值,并使用逗号分割符分割该字符串.  params   plugin.initParams.split( );

    
 显示参数  msg  Params:  ;
    
for  (  i  0 ; i  <  params.length; i ++ )
    {
        msg 
+=  params[i]  ;
    }

    alert(msg);
    
    
只读属性 IsLoaded 是在 Onload 事件之前设置的,标识 Silverlight 插件是否已经加载。     alert(plugin.IsLoaded);
    
    
    
if  (plugin.IsversionSupported( ))
    {
        alert(
当前版本支持 2.0 );
    }
    
else
    {
        alert(
当前版本不支持 2.0 );
    }
}

    正如大家所看到了,我们可以通过getHost得到silverlight object属性中的一些重要信息,当然还可以进行版本检测,插件对象加载是否完成等功能的开发。不如要说明的是silverlight 版本号是按下面格式的字符串表示:      versionMajor.versionMinor.buildNumber.revisionNumber 
        
    看到这里,我们还需要再深入一步,看一下createObject方法体到底是执行了什么 *** 作来进行对象声明的。     请看如下代码段(摘自silverlight.Js):
   
 slPluginHelper  new  Object();
    
 slPropertIEs   propertIEs;
    
 slEvents   events;
    
    slPluginHelper.version 
 slPropertIEs.version;
    slPropertIEs.source 
 source;    
    slPluginHelper.alt 
 slPropertIEs.alt;
    
    
rename propertIEs to their tag property names  ( initParams )
        slPropertIEs.initParams 
 initParams;
    
 ( slPropertIEs.iswindowless  && ! slPropertIEs.windowless)
        slPropertIEs.windowless 
 slPropertIEs.iswindowless;
    
 ( slPropertIEs.framerate  slPropertIEs.maxFramerate)
        slPropertIEs.maxFramerate 
 slPropertIEs.framerate;
    
 ( ID  slPropertIEs.ID)
        slPropertIEs.ID 
 ID;
    
    
 remove elements which are not to be added to the instantiation tag delete  slPropertIEs.ignorebrowserVer;
    
 slPropertIEs.inplaceInstallPrompt;
    
 slPropertIEs.version;
    
 slPropertIEs.data;
    
 slPropertIEs.src;
    
 slPropertIEs.alt;


    
 detect that the correct version of Silverlight is installed, else display install
    
 (Silverlight.isInstalled(slPluginHelper.version))
    {
        
move unkNown events to the slPropertIEs array           name  in  slEvents)
        {
            
 ( slEvents[name])
            {
                
 ( name  == onLoad typeof  slEvents[name]  function  slEvents[name].length  != 1  )
                {
                    
 onLoadHandler   slEvents[name];
                    slEvents[name]
 (sender)
                    { 
                        
return  onLoadHandler(document.getElementByID(ID), sender)
                    };
                }
                
绑定事件处理方法(有点C#事件绑定味道,呵呵)                   handlername   Silverlight.__getHandlername(slEvents[name]);
                
 ( handlername  null  )
                {
                    slPropertIEs[name] 
 handlername;
                    slEvents[name] 
;
                }
                

                {
                    
throw typeof events. name  must be 'function' or 'string' ;
                }
            }
        }
        slPluginHTML 
 Silverlight.buildHTML(slPropertIEs);
    }
    
The control Could not be instantiated. Show the installation prompt  
    {
        slPluginHTML 
 Silverlight.buildPromptHTML(slPluginHelper);
    }

    
 insert or return the HTML (parentElement)
    {
        parentElement.INNERHTML 
 slPluginHTML;
    }
    

    {
        
 slPluginHTML;
    }

}

/////////////////////////////////////////////////////////////////////////////
//
//
  create HTML that instantiates the control Silverlight.buildHTML  ( slPropertIEs)
{
    
 HTMLBuilder   [];

    HTMLBuilder.push(
<object type=\"application/x-silverlight\" data="data:application/x-silverlight," );
    
 ( slPropertIEs.ID   )
    {
        HTMLBuilder.push(
 ID="  slPropertIEs.ID   ( slPropertIEs.wIDth   wIDth="  slPropertIEs.wIDth  ( slPropertIEs.height   height="  slPropertIEs.height  );
    }
    HTMLBuilder.push(
 > );
    
    
 slPropertIEs.ID;
    
 slPropertIEs.wIDth;
    
 slPropertIEs.height;
    
    
 slPropertIEs)
    {
        
 (slPropertIEs[name])
        {
            HTMLBuilder.push(
<param name=" Silverlight.HTMLAttributeEncode(name) " value=" Silverlight.HTMLAttributeEncode(slPropertIEs[name]) " /> );
        }
    }
    HTMLBuilder.push(
<\/object>  HTMLBuilder.join( '' );
}

     原来是用buildHTML方法将传入的属性按声明顺序组合成字符串并最终绑定到指定的 parentElement.INNERHTML属性上,的确很简单,实在没什么可多说的了(当然里面的方法绑定略有不同,但与我们进行事件声明绑定有类似的语法味道)。
    看到这里,还需要介绍一下另外一个创建对象的方法createObjectEx,其函数声明如下(silverlight.Js中):
(params)
{
    
 parameters   params;
    
 HTML   Silverlight.createObject(parameters.source, parameters.parentElement, parameters.ID, parameters.propertIEs, parameters.events, parameters.initParams, parameters.context);
    
 (parameters.parentElement  )
    {
        
 HTML;
    }
}
     说白了它就是对createObject方法的一次封装(encapsulation),而这样做的目的就是为了让那些习惯使用JsON格式的程序员有一个感觉很舒服的参数声明方法,其最终的使用格式如下:  createSilverlightExByPluginID(pluginID)
{  
    Silverlight.createObjectEx({
        source: 
 Source property value.         parentElement:parentElement2,      对包含 createSilverlight 方法调用的 HTML 文件中块级元素的引用,                                            在实例化后成为 Silverlight 插件的宿主元素         ID:pluginID,0);"> 唯一的插件ID值         propertIEs:{                      插件属性. false  如果指定版本的 Silverlight 插件没有安装,inplaceInstallPrompt                                          初始化参数决定是否出现安装对话框。它的默认值是 false,也就是说,   如果 Silverlight.Js 文件中版本检查返回 false,下面的 Silverlight    标准安装对话框将会出现。             background: red  插件背景色             iswindowless:  是否在windowless 模式下显示插件.             framerate:  MaxFrameRate property value.             version: },0);"> Silverlight 版本.         events:{
            onError:onSilverlightError,  
            onLoad:onLoad
            },              
        initParams:
 初始化参数         context:conText});                 
}

     总体感觉与上面的createObject方法差别不是太大,但参数的可读性和层次性更清晰了。
  
     到这里这两个重要的方法介绍的差不多了,下面的这个DEMO分别演示了这两种方法的使用方法。并通过指定不同的初始化 initParams方法来实现调用不同的XAML的功能(里面的CS代码很简单,大家下载之后一看便知)。

      

 
     好的,今天的内容就先到这里了。
   
     源码下载,请点击这里:)
    Tag标签: silverlight,createObject,daizhj,代震军 总结

以上是内存溢出为你收集整理的使用createObject(createObjectEx)创建silverlight对象全部内容,希望文章能够帮你解决使用createObject(createObjectEx)创建silverlight对象所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1055122.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)