轉帖|其它|編輯:郝浩|2010-12-20 14:24:22.000|閱讀 753 次
概述:Silverlight本身的通信全是異步的,但是實際的開發中我們經常需要使用同步通信來請求資源。最常見的情況是在應用加載的第一個頁面的生成需要讀取配置文件,而且,控件的屬性還沒有辦法綁定。這時候很是無奈,要么在App中加載完了實例化MainPage要么在加載頁面中利用后臺代碼進行控制。本文主要介紹如何利用JavaScript在Silverlight中實現同步,希望對大家有幫助。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
Silverlight本身的通信全是異步的,但是實際的開發中我們經常需要使用同步通信來請求資源。最常見的情況是在應用加載的第一個頁面的生成需要讀取配置文件,而且,控件的屬性還沒有辦法綁定。這時候很是無奈,要么在App中加載完了實例化MainPage要么在加載頁面中利用后臺代碼進行控制。
實現同步的思路歸根結底就是阻塞當前的線程,用另一個線程完成任務,并在完成之后通知原線程。照著這個思路,利用Silverlight的System.Threading.Thread開辟了新的線程,在新的線程中下載資源(XML)的操作,發現只要在主線程中System.Threading.Thread.sleep()或System.Threading.Thread.AutoResetEvent(System.Threading.Thread.ManualResetEvent).WaitOne()后開辟的新線程也Over了,百思不得其解。
無奈又回歸原始,用起JavaScript(讓我想起了用ExtJs的那段時間),原想瀏覽器開辟的線程不會有那種怪癖了吧。試一試,OK了。不多說下面是代碼:
//供JavaScript調用 必須是public(這點不喜歡)
public class ConfigData
{
/******************以下是InitParams**********************/
//Sliverlight所在object的ID
public string HtmlObjectId { set; get; }
//定義的配置文件地址
public string ConfigUrl { set; get; }
/****************** InitParams End**********************/
//XML字符串
private string XmlData;
//用于阻塞進程
private ManualResetEvent resetEvent = new ManualResetEvent(false);
public ConfigData() { }
public void LoadConfig()
{
//注冊類給js腳本調用
HtmlPage.RegisterScriptableObject("silver_ConfigData", this);
//利用JavaScript請求配置文件
System.Windows.Browser.HtmlPage.Window.Eval(javascritp());
//阻塞線程,等待完成請求
resetEvent.WaitOne();
/ /繼續操作,分析XML
analysisXML(XmlData);
}
//js調用該方法,取消線程阻塞,并賦值
[ScriptableMember]
public void configLoadEnd(string xmlstring)
{
XmlData = xmlstring;
resetEvent.Set();
}
//組織配置信息
private void analysisXML(string configString)
{
//DO YOUR NEED
}
//這段是拼JavaScript
private string javascritp()
{
StringBuilder javascript = new StringBuilder();
javascript.Append("var objXmlHttp=null;");
javascript.Append("try");
javascript.Append("{");
javascript.Append("objXmlHttp = new XMLHttpRequest();");
javascript.Append("}");
javascript.Append("catch(e)");
javascript.Append("{");
javascript.Append("try");
javascript.Append("{");
javascript.Append("objXmlHttp =
new ActiveXObject('Microsoft.XMLHTTP');");
javascript.Append("}");
javascript.Append("catch(e)");
javascript.Append("{");
javascript.Append("try");
javascript.Append("{");
javascript.Append("objXmlHttp =
new ActiveXObject('Msxml2.XMLHTTP');");
javascript.Append("}");
javascript.Append("catch(e)");
javascript.Append("{");
javascript.Append("alert('error opening XMLHTTP');");
javascript.Append("}");
javascript.Append("}");
javascript.Append("}");
javascript.AppendFormat("objXmlHttp.open('GET','{0}',false);",ConfigUrl);
javascript.Append("objXmlHttp.send();");
javascript.AppendFormat("document.getElementById('{0}').
content.silver_ConfigData.configLoadEnd
(objXmlHttp.responseText);", HtmlObjectId);
return javascript.ToString();
}
}
好像就這些吧,記得在引用該Silverlight App的頁面的object加上InitParams,如下:
<object data="data:application/x-silverlight-2," id=
"GISThematicMap" type="application/x-silverlight-2" width=
"100%" height="100%">
<param name="source" value="ClientBin/GISThematicMap.xap"/>
<param name="InitParams" value="Id=GISThematicMap,ConfigUrl=
//localhost:2217/Config/CreateConfig.ashx" />
<param name="onError" value="onSilverlightError" />
<param name="background" value="white" />
<param name="minRuntimeVersion" value="4.0.50401.0" />
<param name="autoUpgrade" value="true" />
<a href="//go.microsoft.com/fwlink/?LinkID=149156&v=
4.0.50401.0" style="text-decoration:none">
<img src="//go.microsoft.com/fwlink/?LinkId=161376" alt=
"獲取Microsoft Silverlight" style="border-style:none"/>
</a>
</object>
InitParams的獲得是在Appliction的Startup事件中,如下:
private static ConfigData configData = new ConfigData();
public App()
{
this.Startup += this.Application_Startup;
}
private void Application_Startup(object sender, StartupEventArgs e)
{
configData.HtmlObjectId = e.InitParams["Id"].Trim();
configData.ConfigUrl = e.InitParams["ConfigUrl"].Trim();
configData.LoadConfig();
}
好了,差不多結束了!不知道,大家有沒有注意到,其實動態網頁中可以把配置文件可以后臺生成直接放到InitParams中,不過那樣就暴露的太明顯了。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:網絡轉載