摘要:
在上文[Silverlight探秘]利用Javascript调用silverlight的方法中,我们探讨了,如何利用javascript来调用silverlight的托管方法。这个相对来说比较好办些,因为Silverlight毕竟兼容DOM的object方式调用,但是反过来就比较麻烦了,因为javascript设计者不可能那么早就想到为silverlight开个接口。
本文环境:
Codename Orcas Beta1
Silverlight 1.1 Alpha
IE 6.0
思路:
即然没办法从Silverlight直接调用javascript对象,那我们只能从和它们都有关系的DOM的object调用上下手了。要实现互操作,首先Silverlight必须提供一个可供javascript操作的对象,也就是[Silverlight探秘]利用Javascript调用silverlight的方法中我们所提到[Scriptable]标签,但是单单这样子还是不够的。我们这里的场景是Silverlight只提供的函数定义,而javascript实例函数实现,然后在Silverlight里面调用。想想这个场景,跟我们以前的什么应用有点类似哦,没错就是委托(或者使用事件Event)。即然场景类似,我们就动手测试下,看是否行得通。
编写Silverlight的托管方法:
[Scriptable]
public partial class Page : Canvas
...{
public Page()
...{
//注册客户端实例
WebApplication.Current.RegisterScriptableObject("LangZi", this);
}
public void Page_Loaded(object o, EventArgs e)
...{
// Required to initialize variables
InitializeComponent();
//注册按钮事件 btnCallScript.MouseLeftButtonUp += new MouseEventHandler(btnCallScript_MouseLeftButtonUp);
}
void btnCallScript_MouseLeftButtonUp(object sender, MouseEventArgs e)
...{
if (CallScript != null)
...{
//CallScript(this, new MyEventArgs("called by server!"));
CallScript(this, EventArgs.Empty);
}
}
//注册客户端可访问的事件定义
[Scriptable]
public event EventHandler CallScript;
}
跟上文相比,这里只是把SayHello换成了Event而已,其他没有太大的变化
客户端注入方法到事件上:
function createSilverlight()
...{
Sys.Silverlight.createObjectEx(...{
source: "Page.xaml",
parentElement: document.getElementById("SilverlightControlHost"),
id: "SilverlightControl",
properties: ...{
width: "100%",
height: "100%",
version: "0.95",
enableHtmlAccess: true
},
events: ...{
onLoad: OnLoaded
}
});
}
function OnLoaded(sender,args)...{
//debugger;
sender.Content.LangZi.CallScript = OnCallScript;
}
function OnCallScript(sender, args)...{
//debugger;
alert("Running!");
}
扩展思路:
这里用的是最普通的EventHandler,是否支持自定义的EventHandler,支持到什么程度,有待进一步研究。
本文测试代码:SilverlightCallJavascript.rar