我们自己的产品是ActiveX控件的方式,最近需要用到silverlight开发嵌入activeX,查了资料估计也就只有两个办法了:
办法一: Silverlight中调用页面,页面中放置activeX控件.
下载第三方控件的dll,这里提供一个下载地址:
http://download.csdn.net/source/3231944
下面是这个工具的的介绍:Silverlight
下面是配置步骤:
1):将下载资源中的dll(Divelements.SilverlightTools.dll ),添加到Silverlight项目的引用中去。
2):在工具箱上右键 ,选择“选择项”,然后浏览到上面那个dll文件所在的位置,点击添加即可。
3):将刚才新添加的组件拖到silverlight编辑页面中,这时自动添加了对命名空间的引用
xmlns:divtools="clr-namespace:Divelements.SilverlightTools;assembly=Divelements.SilverlightTools"
4):在要嵌入的位置加入HtmlHost组件,例如:
<Grid>
<divtools:HtmlHost x:Name="htmlPlaceholderHost1" SourceUri="http://www.baidu.com" Margin="-4,21,-1,0"/>
</Grid>
这个控件的SourceUri属性即是指向你的其他页面信息,只要给一个Uri地址即可。
5):最后不要忘了在silverlight 的宿主页,加上 <param name="Windowless" value ="true" />,否则会弹出窗口报错“You must be using the Silverlight plugin in windowless mode to use this control.”,示例如下:
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml" >
- <head>
- <title>TileViewAnimation</title>
- <style type="text/css">
- html, body {
- height: 100%;
- overflow: auto;
- }
- body {
- padding: 0;
- margin: 0;
- }
- #silverlightControlHost {
- height: 100%;
- text-align:center;
- }
- </style>
- <script type="text/javascript" src="Silverlight.js"></script>
- <script type="text/javascript">
- function onSilverlightError(sender, args) {
- var appSource = "";
- if (sender != null && sender != 0) {
- appSource = sender.getHost().Source;
- }
- var errorType = args.ErrorType;
- var iErrorCode = args.ErrorCode;
- if (errorType == "ImageError" || errorType == "MediaError") {
- return;
- }
- var errMsg = "Silverlight 应用程序中未处理的错误 " + appSource + "\n" ;
- errMsg += "代码: "+ iErrorCode + " \n";
- errMsg += "类别: " + errorType + " \n";
- errMsg += "消息: " + args.ErrorMessage + " \n";
- if (errorType == "ParserError") {
- errMsg += "文件: " + args.xamlFile + " \n";
- errMsg += "行: " + args.lineNumber + " \n";
- errMsg += "位置: " + args.charPosition + " \n";
- }
- else if (errorType == "RuntimeError") {
- if (args.lineNumber != 0) {
- errMsg += "行: " + args.lineNumber + " \n";
- errMsg += "位置: " + args.charPosition + " \n";
- }
- errMsg += "方法名称: " + args.methodName + " \n";
- }
- 引发新错误(errMsg);
- }
- </script>
- </head>
- <body>
- <form id="form1" runat="server" style="height:100%">
- <div id="silverlightControlHost">
- <object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%">
- <param name="source" value="ClientBin/TileViewAnimation.xap"/>
- <param name="onError" value="onSilverlightError" />
- <param name="background" value="white" />
- <param name="minRuntimeVersion" value="4.0.50401.0" />
- <param name="autoUpgrade" value="true" />
- <param name="windowless" value="true"/> <!--这句话很重要必须得加-->
- <a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=4.0.50401.0" style="text-decoration:none">
- <img src="http://go.microsoft.com/fwlink/?LinkId=161376" alt="获取 Microsoft Silverlight" style="border-style:none"/>
- </a>
- </object><iframe id="_sl_historyFrame" style="visibility:hidden;height:0px;width:0px;border:0px"></iframe></div>
- </form>
- </body>
- </html>
JS调用SilverLight中函数:
首先在SilverLight的cs,页面初始化时注册一个JS脚本对像,使JS能够找到它。
//注册JS脚本对象
HtmlPage.RegisterScriptableObject("脚本对象名称", this);
然后在SilverLight的cs中写一个供JS调用的函数如下:
[ScriptableMember] //注意这一句必须加,否则JS会找不到此函数
//函数在定义时用关键字Public
public void func_Test(string aValue)
{
ShowMessage(aValue);
}
最后一步在JS中调用Silverlight中的函数,如下:
//注意SL是SilverLight在html页面中ID名称。
//引处先找到SilverLight对象,然后在获取我们刚才注册的【脚本对象名称】。
var obj = document.getElementById("SL").content.脚本对象名称; //获取登录脚本对象
if (obj != null)
{
obj.Func_Tets("成功了"); //调用SilverLight中函数。
}
在SilverLight中调用JS中的函数:这个就比较简单了
HtmlPage.Window.Invoke("函数名",参数1,参数2,...);