我用WinForm開發也有一段時間了。我覺得目前的WinForm開發速度是夠的,但是一些原本在HTML就很容易做到的事情,在WinForm中就很難實現了。 這個主要的原因可能是WinForm複用控件的能力非常強,但是可用的控件卻非常少。一般買回來的控件不但貴,而且也不是太好擴展。
作爲一個學了多年HTML的人,我當然希望在WinForm中依然能使用HTML的特徵,例如強大的CSS!,自動排版伸縮的特徵,(CSS與排版可以更方便打印!),以及腳本的編寫。(有時候寫腳本比寫WinForm的程序更爽。具體情況具體做)。
要做這個其實不難。但是要靈活運用則不容易了。
通常,使用WebBrowser控件的人,只是簡單地使用MSHTML調用WebBrowser裏的東西。也就是說,這個調用是單項的,只考慮到修改HTML來顯示某種東西。
今天我寫這個隨筆的意圖是告訴大家怎樣把用戶在WebBrowser裏的操作反饋給WinForm 。
做這個反饋的基石是 DotNet 的 InteropServices 。通過把DotNet的某個對象,傳到HTML DOM裏去,然後用腳本來操作該DotNet對象。
要做到這個,核心是:
- 獲取 WebBrowser.Document ,它實現了mshtml.IHtmlDocument /2/3/4/5 (其中IHtmlDocument2最有用)
- 這個Document是 System.Runtime.InteropServices.Expando.IExpando,通過它來設置和獲取Document的一些動態命名的成員。
例子中的代碼是:
mshtml.IHTMLDocument2 doc2=(mshtml.IHTMLDocument2)browser.Document;
System.Runtime.InteropServices.Expando.IExpando ex=(System.Runtime.InteropServices.Expando.IExpando)doc2;
System.Reflection.PropertyInfo piform1=ex.AddProperty("Form1");
piform1.SetValue(doc2,this,null);//從此,在HTML的document.Form1就是這個WinForm的Control了。你可以用腳本來調用Form1 !
有了這些交互,我們可以實現的東西實在太多太多了。
我下一步應該是研究一下,怎樣直接把WinForm的Control動態地嵌進這個HTML裏。(不是用 《 OBJECT 》來部署的形式)