********************************************************************
* 著作權聲明
*
* 本文以Creative Commons的發布,請嚴格遵循該授權協議。
* 本文首發於部落格園, 此聲明為本文章中不可或缺的一部分。
* 作者網名: 浪子
* 作者EMAIL:dayichen (at)163.com
* 作者BLOG: Http://Www.Cnblogs.Com/Walkingboy
*
********************************************************************
[Silverlight探秘]利用Javascript調用silverlight的方法
-Written by 浪子@cnblogs.com (07-06-20)
摘要:
在上文[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 variablesInitializeComponent();//註冊按鈕事件
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