在使用Silverlight 的时候,也许你要使用本地资源,然而Silverlight 可能不能做到,但是如果我们透过js+activex 或者js +externl标签,可以做很多事情。
那么如何完成两者的交互呢:
1. silverlight 中使用javascript
(1) 引用名字空间: using System.Windows.Browser;
(2) 方法1:HtmlPage.Window.Eval() 这个方法直接执行字符串的javascript;
<textarea cols="50" rows="15" name="code" class="c-sharp">string prompt = "alert(/""; prompt += ex.Message; prompt += " /");"; HtmlPage.Window.Eval(prompt); // 其中的ex为异常对象,我经常用来打印异常信息。</textarea>
方法2:HtmlPage.Window.Invoke("InitializeFso", new object[] { });
其中第一个参数是你的javascript 的函数名称,第二参数是调用这个函数的参数数组。
<textarea cols="50" rows="15" name="code" class="c-sharp">SearchPath.Text = strNode; string strPath = ""; try { strPath = HtmlPage.Window.Invoke("GetAllDirectory", new string[] { strNode }) as string; } catch (System.Exception ex) { HtmlPage.Window.Eval("alert(/"Get directory error!/")"); string prompt = "alert(/""; prompt += ex.Message; prompt += " /");"; HtmlPage.Window.Eval(prompt); }</textarea>
方法3:htmlpage.window.createInstance();
2. JS 调用Silverlight
1. 在Silverlight的UserControl的派生类的构造函数中进行注册Silverlight给js 的运行期。
<textarea cols="50" rows="15" name="code" class="c-sharp">try { HtmlPage.RegisterScriptableObject("Test", this); } catch (System.Exception ex) { HtmlPage.Window.Eval("alert(/"register Silverlight error!/")"); string prompt = "alert(/""; prompt += ex.Message; prompt += " /");"; HtmlPage.Window.Eval(prompt); }</textarea>
2. 在Silverlight中建立可以让js 调用的方法:使用关键字[ScriptableMember], 还有[ScriptableType] 例如:
<textarea cols="50" rows="15" name="code" class="c-sharp">[ScriptableMember] public void QueryResultstring(string strmessage) { QueryScanResult Result = new QueryScanResult(); Result.ParserFromString(strmessage); if (Result.ErrorCode != "0") { return; } string strShow = "scaning: "; if (Result.Section == "2") { ScanPathShower.Text = strShow + Result.TargetFile; } if (Result.Section == "4") { ScanPathShower.Text = strShow + "Finished!"; m_bScanButton = false; } // Section 0 undefine // section 1 ready // section 2 scaning // section 3 pause // section 4 completed // Query again }</textarea>
3. 在测试silverlight 的页面增加 silverlight obj 的ID<textarea cols="50" rows="15" name="code" class="xhtml"><object id ="SilverlightControlXXX" data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%"> <param name="source" value="DubaSilverlightDemo.xap"/> <param name="onerror" value="onSilverlightError" /> <param name="background" value="white" /> <param name="minRuntimeVersion" value="3.0.40307.0" /> <param name="autoUpgrade" value="true" /> <a href="http://go.microsoft.com/fwlink/?LinkID=141205" mce_href="http://go.microsoft.com/fwlink/?LinkID=141205" style="text-decoration: none;" mce_style="text-decoration: none;"> <img src="http://go.microsoft.com/fwlink/?LinkId=108181" mce_src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style: none" mce_style="border-style: none"/> </a> </object></textarea>
4. 在Js 中调用
<textarea cols="50" rows="15" name="code" class="c-sharp">var control = document.getElementById("SilverlightControlxxx"); //alert("OK"); try { alert("Call silverlight"); control.Content.Test.QueryVirusstring(KxRes); } catch(e) { alert("Exception"); } </textarea>