在我们正常创建的silverlight Application项目之后,会在相应的web文件夹中生成两个名称相同但扩展名分别为aspx和html和页面。
该方面中的参数说明摘自silverlight sdk:
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 属性得到。
其中的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
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)
events, initParams, userContext)
Silverlight.createObjectEx
(params)
Silverlight.createObject
arams,
userContext)
userContext)
该方面中的参数说明摘自silverlight sdk:
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 windowless: true aliceblue 24
},
{
onError:onSilverlightError, 错误处理事件绑定. onLoad:onLoad 加载事件绑定,可用于多个实例. },
pluginID= + pluginID, 初始化参数,可设置为 null 或 {} conText);
}
对当前实例定义唯一标识变量. conText context_2 ;
createSilverlightByPluginID(pluginID)
{
Silverlight.createObject(
ClientBin/Silverlight_Js.xap , 源属性值. parentElement,0);"> Div标签宿主引用. pluginID, 唯一插件ID值, 当页面调用被设置. { 插件属性,此处属性设置优先于xaml中的设置 width: ' 400 200 2.0 windowless: true aliceblue 24
},
{
onError:onSilverlightError, 错误处理事件绑定. onLoad:onLoad 加载事件绑定,可用于多个实例. },
pluginID= + pluginID, 初始化参数,可设置为 null 或 {} conText);
}
这样我们就在"
silverlightControlHost"元素中定义了一个silverlight object对象。
当然上面JS代码中的onSilverlightError是在创建silverlight项目中就已声明好的,这里就不多做介绍了。需要说明的是onLoad的事件绑定,因为在这里我们可以对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 );
}
}
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
请看如下代码段(摘自silverlight.js):
arams,
userContext)
{
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( '' );
}
userContext)
{
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属性上,的确很简单,实在没什么可多说的了(当然里面的方法绑定略有不同,但与我们进行事件声明绑定有类似的语法味道)。
(params)
{
parameters params;
html Silverlight.createObject(parameters.source, parameters.parentElement, parameters.id, parameters.properties, parameters.events, parameters.initParams, parameters.context);
(parameters.parentElement )
{
html;
}
}
{
parameters params;
html Silverlight.createObject(parameters.source, parameters.parentElement, parameters.id, parameters.properties, parameters.events, parameters.initParams, parameters.context);
(parameters.parentElement )
{
html;
}
}
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});
}
{
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代码很简单,大家下载之后一看便知)。
到这里这两个重要的方法介绍的差不多了,下面的这个DEMO分别演示了这两种方法的使用方法。并通过指定不同的初始化 initParams方法来实现调用不同的XAML的功能(里面的CS代码很简单,大家下载之后一看便知)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。