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