最近在嘗試一種有意思的桌面應用的寫法使用HTML+JS+CSS來做視圖的展示而不用winform的控件效果還不錯
新建一個窗體Form
在Form裡添加一個WebBrowser控件
public static WebBrowser CreateWebBrower(Object objectForScripting)
{ WebBrowser webBrowser = new WebBrowser()
webBrowserScrollBarsEnabled = false;
webBrowserAllowWebBrowserDrop = false;//將 WebBrowser 控件的
AllowWebBrowserDrop 屬性設置為 false以防止 WebBrowser 控件打開拖放到其上的文件
webBrowserIsWebBrowserContextMenuEnabled = false;//將該控件的
IsWebBrowserContextMenuEnabled 屬性設置為 false以防止 WebBrowser 控件在用戶右擊它時顯示其快捷菜單
webBrowserWebBrowserShortcutsEnabled = false;//將該控件的 WebBrowserShortcutsEnabled 屬性設置為 false以防止 WebBrowser 控件響應快捷鍵
webBrowserScriptErrorsSuppressed = true;//將該控件的
ScriptErrorsSuppressed 屬性設置為 true以防止 WebBrowser 控件顯示腳本代碼問題的錯誤信息
if (objectForScripting != null)
{ webBrowserObjectForScripting = objectForScripting;
}
return webBrowser;
}
使用html編寫頁面的視圖展示比用winform control靈活多了
指定WebBrowserurl 為剛剛第步做的頁面
WebBrowserUrl = new Uri(file:// + PathCombine(ApplicationStartupPath web/))
指定WebBrowserObjectForScripting為剛剛新建立的窗體對象並且在窗體類上聲明com可見性這麼做
[SystemSecurityPermissionsPermissionSet(SystemSecurityPermissionsSecurityActionDemand Name = FullTrust)]
[SystemRuntimeInteropServicesComVisibleAttribute(true)]
public partial class Form : Form
{ public Form()
{
InitializeComponent()
}}
在窗體裡寫個方法必須是public的這種方法我們先叫後台方法
public void Run()
{
}
這樣我們就可用在html裡調用這個run方法了
windowexternalRun()
上面我們就完成了一個基本結構在這個結構裡我們可以使用html編寫頁面並在winform窗體裡展示並且可以在html頁面裡用js調用c#編寫的方法當然方法裡是可以傳參數的可以傳基本數據的參數比如stringintfloat 等
不過我們要指定js是事件驅動的我們調用一個方法後如果方法執行事件過長阻塞在那裡可不好於是我們就要考慮回調的方法實現
如下
在html頁裡我需要調用一個後台方法(假設為method這裡指按照上面的步驟用c#寫的方法)當方法method完成後調用回調方法以使得在html裡能收到回調的數據
我們分步驟看看如何實現它
我們在js裡這麼調用我們的後台方法仔細看下面的方法fn在這個方法裡調用了後台方法Run並傳入了一個參數fn_callback這個參數其實是個方法(function)我們想執行一個長時間的後台方法(run)當run方法執行完畢後回調執行我們的fn_callback方法
function fn()
{
windowexternalRun(fn_callback)
}
function fn_callback(nostr)
{
alert(no)
alert(str)
}
我們看看後台方法裡如何寫run
public void Run(object str)
{
//dosomethind 長時間的
Type t = strGetType()
tInvokeMember( SystemReflectionBindingFlagsInvokeMethod null str new object[]{xx})
}
注意這裡的參數是object類型使用getType()方法查看的話是個System__ComObject類型我們使用的反射的方式來調用它比較給力的就是
tInvokdeMember方法了
這樣我們就完成了整個回調的實現非常的爽
From:http://tw.wingwit.com/Article/program/ASP/201311/21836.html