最近因为项目的需要,需要研究在C#winform窗体中加载网页,和弹出提醒,但我们的网站是HTML5的,ie浏览器内核不支持,而且因为根据客户机系统的不一致,加载的ie内核可能是不同,显示的效果也会不一致,在网上查询了大量的资料,途中遇到了很多的问题。

因为ie内核不支持html5,所以说得出的结论是webbrowser不能支持html5,但是我们可以用其他的内核。比如火狐的内核Gecko,或webkit内核,我从csdn上下载了版本为22的geckofx:地址:http://download.csdn.net/detail/w297088867/6361867

里面有demo,经过测试,可以运行html5页面,显示的效果与目前最新版的360差不多。这样就可以支持为网页包一层外衣了,可是在后来的发现,当网页中的附件链接,点击无效,无法弹出下载保存对话框,对于这个问题,网上似乎没有给出答案,再加上没有js和C#通信的方法,火狐的内核就被搁置了。

在这之后,我开始寻找关于webkit内核的相关资料,这时候我发现了一个叫open-webkit-sharp的东东,他对webkit进行了再次封装,功能强大,而且博文中说了js和C#互调的办法,虽然也存在无法下载附件的问题,但我想如果js可以调用C#,那么就简单了,我可以自己写个下载链接的方法来弹保存对话框。在绵阳网站建设在进过了很多尝试,也无法让源码在我的机器上跑起来,万般无奈下放弃。

如果是webbrowser的js和C#互调,很简单,可以看看这篇文章:http://www.myk3.com/arc-170.html

后来在博客园看到了一个叫CefGlue的东东,也是对webkit的封装,但是这里博主对于整个浏览器的开发做了比较深刻的描述,并且解决了下载附件弹出保存的问题,于是我采用了这个内核,看了这几篇文章就能满足C#winform对html5的支持了,需要的朋友可以搜索 ‘ 基于.net开发chrome核心浏览器’,目前有7篇文章,其中第四篇有源码下载,比较完善了,解决了附件下载的问题和右键菜单和C#调用js的方法都有。

到这里应该就完了,不过,我们还忽略了一个问题,是js调用C#的方法,这个方法在博文中没有解决,不过小安查过资料,需要看这几篇文章,这几篇文章中的作者通过注册js和C#的反射实现了js调用C#,需要了解的请搜索标题:‘Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告’.

如果你看了是否无法看懂,是有点难以理解,但是没关系,他们提供了一个群号,我当时加入了进去,在群共享有个deme,演示js和C#互调的方法。不过他们这个demo直言是了js和C#的互调,对于文件下载的链接依然无效,需要修改一下文件,点击打开demo工程文件,我们只用到了CefGlue和CefGlue.WindowsForms。打开CefGlue.WindowsForms,新建一个类,取名:BsLifeSpanHandler.cs

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xilium.CefGlue;
 
 
namespace Xilium.CefGlue.WindowsForms
{
    public class BsLifeSpanHandler : CefLifeSpanHandler
    {
        private CefWebClient bClient;
        public BsLifeSpanHandler(CefWebClient bc)
        {
            bClient = bc;
        }
        protected override void OnAfterCreated(Xilium.CefGlue.CefBrowser browser)
        {
            base.OnAfterCreated(browser);
            bClient.Created(browser);
        }
    }
}

然后打开CefWebClient.cs文件,添加声明

1
private readonly CefDownloadHandler downloadHandler;

在构造函数中加入

1
downloadHandler = new BsDownloadHandler();

然后添加一个方法名在文档末尾

1
2
3
4
 protected override CefDownloadHandler GetDownloadHandler()
        {
            return downloadHandler;
        }

这样就可以实现点击文档或附件自动弹出下载对话框了,同时又支持javascript和C#的调用。也就能支持绝大多数的客户端开发了。

效果图来一发如下:

对了,窗体做了自绘处理,这样风格就差不多了。

总结,支持Html5与WinForm客户端结合开发,这样大大的提升了效率,不用去使用winAPI自绘按钮什么的,用网页前段技术就可以做软件了。

源码包有些大,这里就不上传了,在博客园中的第四篇文章中有比较完整的源码下载,二jsC#互调的demo在群里能下载,这里绵阳网站建设就不在累述。好了,文章写到这里就基本上结束了,谢谢你的阅读。

[C#]如何让webbrowser控件支持Html5的更多相关文章

  1. WebBrowser控件支持WebSocket

    修改html页面,在Header标签中添加如下标签: <meta http-equiv="X-UA-Compatible"content="IE=edge" ...

  2. C# 指定Webbrowser控件所用IE内核版本

    如果电脑上安装了IE8或者之后版本的IE浏览器,Webbrowser控件会使用IE7兼容模式来显示网页内容.解决方法是在注册表中为你的进程指定引用IE的版本号. 比如我的程序叫做a.exe,以64位机 ...

  3. WebBrowser控件打开https站点

    背景: 与上一篇博文一样,此文亦是由于开发DropboxAPI中遇到问题衍生出来的.由于需要重定向https类型网站,但自己的https证书是自签名的,总是提示'网站的安全证书存在问题'. 鉴此,查了 ...

  4. C++(MFC)中WebBrowser去除3D边框的方法(实现IDocHostUIHandler接口)控制 WebBrowser 控件的外观和行为

    在 CSDN 上经常看到以下两个问题:1.在 MFC 应用程序中,如果创建了一个 WebBrowser 控件(包括 CHtmlView 在内),如何可以把该控件的三维边框禁止掉?2.在 MFC 应用程 ...

  5. VC++使用WebBrowser控件,强制给控件指定版本显示网页

    转载:http://www.cnblogs.com/1175429393wljblog/p/5398928.html 最近为了抓取淘宝的成交数据,用C#的WebBrowser控件开发了一个简单的程序. ...

  6. PB打开ole控件IE浏览器版本问题_指定Webbrowser控件所用IE内核版本(转)

    如果电脑上安装了IE8或者之后版本的IE浏览器,Webbrowser控件会使用IE7兼容模式来显示网页内容.解决方法是在注册表中为你的进程指定引用IE的版本号. 比如我的程序叫做a.exe 对于32位 ...

  7. Delphi WebBrowser控件的使用(大全 good)

    Delphi WebBrowser控件的使用 WebBrowser控件属性:1.Application      如果该对象有效,则返回掌管WebBrowser控件的应用程序实现的自动化对象(IDis ...

  8. 强制IE浏览器或WebBrowser控件使用指定版本显示网页

    自从装了IE10之后,就发现好些个网站显示都不是那么的正常,网站上有些功能竟然还会出现一些意想不到的BUG——本来就是针对IE开发的,现在IE下竟然用不起来了,让用户情何以堪?但是就为少量用户使用的系 ...

  9. WPF中不规则窗体与WebBrowser控件的兼容问题解决办法

    原文:WPF中不规则窗体与WebBrowser控件的兼容问题解决办法 引言 这几天受委托开发一个网络电视项目,要求初步先使用内嵌网页形式实现视频播放和选单,以后再考虑将网页中的所有功能整合进桌面程序. ...

随机推荐

  1. 使用beautifulsoup与requests爬取数据

    1.安装需要的库 bs4 beautifulSoup  requests lxml如果使用mongodb存取数据,安装一下pymongo插件 2.常见问题 1> lxml安装问题 如果遇到lxm ...

  2. 【转】MySql中的函数

    原文:http://www.cnblogs.com/kissdodog/p/4168721.html MySQL数据库提供了很多函数包括: 数学函数: 字符串函数: 日期和时间函数: 条件判断函数: ...

  3. [js] 变量空值研究

    最近js的空值弄得焦头烂额,今天写个博客记录下. javascript变量空值一共有3种 1.“” var e=""; 2.null var e=null; 3.NaN var e ...

  4. 如何配置远程mysql服务器

    如何配置远程mysql服务器 分配用户权限 可以先看一下目前的用户权限状况: use mysql; select host,user,password from user; 然后分配新的权限给某一用户 ...

  5. JSP动作元素——————理论篇

    JSP动作元素的组成及作用 JSP使用Action来控制Servlet引擎的行为,可重复使用JavaBean组件. 常用Action: jsp:param       在 jsp:include.js ...

  6. jdbc java数据库连接 8)防止sql注入

    回顾下之前jdbc的开发步骤: 1:建项目,引入数据库驱动包 2:加载驱动 Class.forName(..); 3:获取连接对象 4:创建执行sql语句的stmt对象;  写sql 5:执行sql ...

  7. Hangfire入门(任务调度)

    一.简介 英文官网:http://hangfire.io/ 开源地址:https://github.com/HangfireIO Hangfire 不依赖于具体的.NET应用类型,包含.NET 和.N ...

  8. 部署 DevStack - 每天5分钟玩转 OpenStack(17)

    本节按照以下步骤部署 DevStack 实验环境,包括控制节点和计算节点 创建虚拟机 按照物理资源需求创建 devstack-controller 和 devstak-compute 虚拟机 安装操作 ...

  9. [LeetCode] Guess Number Higher or Lower II 猜数字大小之二

    We are playing the Guess Game. The game is as follows: I pick a number from 1 to n. You have to gues ...

  10. [LeetCode] Isomorphic Strings 同构字符串

    Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if the chara ...