最近在尝试一种有意思的桌面应用的写法使用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方法了
这样我们就完成了整个回调的实现非常的爽