前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >winform与cefsharp混合开发_winform窗体

winform与cefsharp混合开发_winform窗体

作者头像
全栈程序员站长
发布于 2022-11-05 02:36:28
发布于 2022-11-05 02:36:28
3K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

简介

CefSharp简单来说就是一款.Net编写的浏览器包,方便你在Winform和WPF中内嵌的Chrome浏览器组件。

资源

GitHub地址:传送门 wiki帮助文档地址:传送门 CefSharp最小的示例工程:传送门 gitter交流讨论区:传送门

快速入门

本文使用版本cefsharp/71

要求

安装

这块安装使用没有想象的那么简单,比较坑爹,各种修改配置,按照官网的A配置方案没有搞定,按照B配置方案勉强部署成功(VS2013/VS2017)!对于外文不好的我,看着英文文档脑壳疼。老外给的闭坑指南,但是感觉没有啥卵用。下面就介绍一下B方案安装部署的过程吧,A方案我就不讲了,想看的请去上面的官网查看。

简略测试部署过程

整个工程可在GitHub下载:传送门

  • 创建工程Test.App(Winform工程),将其中的Form1窗体删掉。
  • 创建工程Test.Chrome(类库)。
  • 在Test.Chrome工程添加NuGet引用,搜索CefSharp,选择CefSharp.Winforms。
  • 在解决方案上点配置管理器,将平台设置为x86或x64.
  • 在Test.Chrome工程添加Form1窗体,添加CefSharp窗体相关的代码。
  • Test.App添加Test.Chrome工程的引用,修改Program.cs文件,引用Test.Chrome工程的Form1窗体。

部署过程细节截图
  1. 创建一个基础的Winform应用,并使用NuGet引用CefSharp包。使用Nuget添加引用,搜索CefSharp,添加CefSharp.WinForm,CefSharp.Winform依赖好几个包,这块选择这一个安装就可以了,NuGet会自动帮你把其他依赖的包一并下载好的。

安装完你本地的Packages文件夹里有如下文件:

官方文档建议:安装完NuGet包之后,关闭vs然后重新打开,避免VS自带的智能感知引用有问题

  1. 在简介方案上右键—》选择配置管理—》修改目标平台为x86或x64

选择x86或x64

  1. 在你的窗体Form1窗体里添加相应代码,参考Using CEF (as Browser)中的代码。

Using CEF (as Browser)

在代码中引用相应的dll

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using CefSharp;
using CefSharp.WinForms;

完整示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using CefSharp;
using CefSharp.WinForms;

namespace embebbedChromium
{
    public partial class Form1 : Form
    {
        public ChromiumWebBrowser chromeBrowser;
 
        public Form1()
        {
            InitializeComponent();
            // Start the browser after initialize global component
            InitializeChromium();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            
        }

		//初始化浏览器并启动
        public void InitializeChromium()
        {
            CefSettings settings = new CefSettings();
            // Initialize cef with the provided settings
            Cef.Initialize(settings);
            // Create a browser component
            chromeBrowser = new ChromiumWebBrowser("https://www.baidu.com");
            // Add it to the form and fill it to the form window.
            this.Controls.Add(chromeBrowser);
            chromeBrowser.Dock = DockStyle.Fill;
        }
		
		//窗体关闭时,记得停止浏览器
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            Cef.Shutdown();
        }        
    }
}

3.2. Using CEF (as User Interface)

这块参考官方文档:传送门,做了部分内容的完善,这块我理解的就是提供了一个js调用C#类方法的一个示例。

下载Bootstrap相关的文件,传送门

将下载好的Bootstrap文件夹复制拷贝到你的VS项目中,并添加html文件夹,在里面新建一个index.html文件,具体如下图所示:

html文件内容参考这里:传送门,网页下方有示例,也有模板可以下载。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
    <title>Bootstrap 101 Template</title>

    <!-- Bootstrap -->
    <link href="css/bootstrap.min.css" rel="stylesheet">

    <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
    <!--[if lt IE 9]>
      <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
      <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
  </head>
  <body>
    <h1>Hello, world!</h1>

    <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
    <script src="https://ajax.proxy.ustclug.org/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    <!-- Include all compiled plugins (below), or include individual files as needed -->
    <script src="js/bootstrap.min.js"></script>
  </body>
</html>

将上面的css、fonts、html、js文件夹里的文件全部选中—》然后点击鼠标右键,选中属性—》设置始终复制

新建一个类CefCustomObject,用来让js调用C#中类的方法,具体代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using CefSharp;
using CefSharp.WinForms;
using System.Diagnostics;

namespace embebbedChromium
{
    class CefCustomObject
    {
        // Declare a local instance of chromium and the main form in order to execute things from here in the main thread
        private static ChromiumWebBrowser _instanceBrowser = null;
        // The form class needs to be changed according to yours
        private static Form1 _instanceMainForm = null;


        public CefCustomObject(ChromiumWebBrowser originalBrowser, Form1 mainForm)
        {
            _instanceBrowser = originalBrowser;
            _instanceMainForm = mainForm;
        }

        public void showDevTools()
        {
            _instanceBrowser.ShowDevTools();
        }

        public void opencmd()
        {
            ProcessStartInfo start = new ProcessStartInfo("cmd.exe", "/c pause");
            Process.Start(start);
        }
    }
}

修改Form1窗体的代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using CefSharp;
using CefSharp.WinForms;
using System.Runtime.InteropServices;
namespace embebbedChromium
{
public partial class Form1 : Form
{
public ChromiumWebBrowser chromeBrowser;
public Form1()
{
InitializeComponent();
// Start the browser after initialize global component
InitializeChromium();
//需要添加此句代码,否则下面执行会报错
CefSharpSettings.LegacyJavascriptBindingEnabled = true;	            
// Register an object in javascript named "cefCustomObject" with function of the CefCustomObject class :3
chromeBrowser.RegisterJsObject("cefCustomObject", new CefCustomObject(chromeBrowser, this));
}
private void Form1_Load(object sender, EventArgs e)
{
//此句代码执行有错,官网示例的跑不起来
//chromeBrowser.ShowDevTools();
}
public void InitializeChromium()
{
CefSettings settings = new CefSettings();
// Note that if you get an error or a white screen, you may be doing something wrong !
// Try to load a local file that you're sure that exists and give the complete path instead to test
// for example, replace page with a direct path instead :
// String page = @"C:\Users\SDkCarlos\Desktop\afolder\index.html";
String page = string.Format(@"{0}\html-resources\html\index.html", Application.StartupPath);
//String page = @"C:\Users\SDkCarlos\Desktop\artyom-HOMEPAGE\index.html";
if (!File.Exists(page))
{
MessageBox.Show("Error The html file doesn't exists : "+page);
}
// Initialize cef with the provided settings
Cef.Initialize(settings);
// Create a browser component
chromeBrowser = new ChromiumWebBrowser(page);
// Add it to the form and fill it to the form window.
this.Controls.Add(chromeBrowser);
chromeBrowser.Dock = DockStyle.Fill;
// Allow the use of local resources in the browser
BrowserSettings browserSettings = new BrowserSettings();
browserSettings.FileAccessFromFileUrls = CefState.Enabled;
browserSettings.UniversalAccessFromFileUrls = CefState.Enabled;
chromeBrowser.BrowserSettings = browserSettings;
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
Cef.Shutdown();
}
}
}
  1. 运行查看效果,如下图所示

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/191642.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月19日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
[Keras深度学习浅尝]实战一·DNN实现Fashion MNIST 数据集分类
Fashion-MNIST是一个替代MNIST手写数字集的图像数据集。 它是由Zalando(一家德国的时尚科技公司)旗下的研究部门提供。其涵盖了来自10种类别的共7万个不同商品的正面图片。Fashion-MNIST的大小、格式和训练集/测试集划分与原始的MNIST完全一致。60000/10000的训练测试数据划分,28x28的灰度图片。你可以直接用它来测试你的机器学习和深度学习算法性能,且不需要改动任何的代码。
小宋是呢
2019/06/27
1.2K0
[Keras深度学习浅尝]实战一·DNN实现Fashion MNIST 数据集分类
【动手学深度学习笔记】之图像分类数据集(Fashion-MNIST)
这个数据集是我们在后面学习中将会用到的图形分类数据集。它的图像内容相较于手写数字识别数据集MINIST更为复杂一些,更加便于我们直观的观察算法之间的差异。
树枝990
2020/08/20
3.7K0
【动手学深度学习笔记】之图像分类数据集(Fashion-MNIST)
Basic classification: Classify images of clothing
This guide trains a neural network model to classify images of clothing, like sneakers and shirts.
XianxinMao
2021/07/27
4020
终版API已定型,TensorFlow 2.0 Beta蜕变归来
TensorFlow 发布以来,已经成为全世界最广泛使用的深度学习库。但 Tensorflow 1.x 时代最广受诟病的问题是:学习门槛较高、API 重复且复杂、模型部署和使用不够方便。之后,谷歌下定决心改变这一问题,在今年早些时候,发布了 Tensorflow 2.0 的 Alpha 版本。Alpha 版本一经问世,便受到深度学习研究者、开发者和在校学生的好评,其简洁的 API 和快速易上手的特性吸引了更多用户的加入。今天,Tensorflow 官方发布了 2.0 时代的 Beta 版本,标志着 Tensorflow 这一经典的代码库进一步成熟。
AI算法与图像处理
2019/06/14
7420
终版API已定型,TensorFlow 2.0 Beta蜕变归来
TensorFlow从1到2(四)时尚单品识别和保存、恢复训练数据
在TensorFlow官方新的教程中,第一个例子使用了由MNIST延伸而来的新程序。 这个程序使用一组时尚单品的图片对模型进行训练,比如T恤(T-shirt)、长裤(Trouser),训练完成后,对于给定图片,可以识别出单品的名称。
俺踏月色而来
2019/04/22
7250
TensorFlow从1到2(四)时尚单品识别和保存、恢复训练数据
使用tensorflow创建一个简单的神经网络
本文是对tensorflow官方入门教程的学习和翻译,展示了创建一个基础的神经网络模型来解决图像分类问题的过程。具体步骤如下
生信修炼手册
2021/07/06
1.1K0
使用tensorflow创建一个简单的神经网络
小白学PyTorch | 15 TF2实现一个简单的服装分类任务
之前的15节课的pytorch的学习,应该是让不少朋友对PyTorch有了一个全面而深刻的认识了吧 (如果你认真跑代码了并且认真看文章了的话) 。
机器学习炼丹术
2020/10/15
9020
小白学PyTorch | 15 TF2实现一个简单的服装分类任务
【TensorFlow2.x 实践】服装分类
基于TensorFlow2.x的框架,使用PYthon编程语言,实现对服装图像进行分类。
润森
2022/09/22
8040
【TensorFlow2.x 实践】服装分类
[MXNet逐梦之旅]练习四·使用MXNetFashionMNIST数据集分类简洁实现
[MXNet逐梦之旅]练习四·使用MXNetFashionMNIST数据集分类简洁实现 code #%% import sys import time from mxnet import gluon as gl import mxnet as mx from matplotlib import pyplot as plt from mxnet import autograd, nd import numpy as np mnist_train = gl.data.vision.FashionMNIST(r
小宋是呢
2019/06/27
6010
毕业设计(基于TensorFlow的深度学习与研究)之完结篇
本文是我的毕业设计基于TensorFlow的深度学习与研究的完结篇,在本篇推文中,我将分为三个部分去写:
石璞东
2020/04/21
4.6K0
毕业设计(基于TensorFlow的深度学习与研究)之完结篇
从零开始学TensorFlow【01-搭建环境、HelloWorld篇】
最近在学习TensorFlow的相关知识,了解了TensorFlow一些基础的知识,现在周末有空了,就写写一些笔记,记录一下自己的成长~
Java3y
2019/08/27
8190
从零开始学TensorFlow【01-搭建环境、HelloWorld篇】
针对时尚类MINIST数据集探索神经网络
fashion MNIST数据集可以从Github获取。它包含10种类别的灰度图像,共7000个,每个图像的分辨率均为28x28px。下图以25张带有标签的图片向我们展示了该数据集中的数据。
AI研习社
2019/05/14
1.2K0
MNIST终结者:Fashion-MNIST
8月27日,Fashion-MNIST图片库在GitHub上开源,MNIST的时代宣告终结。 这不是巧合,而是Fashion-MNIST蓄谋已久。它克隆了MNIST的所有外在特征: 60000张训练图像和对应Label; 10000张测试图像和对应Label; 10个类别; 每张图像28x28的分辨率; 4个GZ文件名称都一样; 对于已有的MNIST训练程序,只要修改下代码中的数据集读取路径,或者残暴的用Fashion-MNIST数据集文件将MNIST覆盖,替换就瞬间完成了。 不同的是,Fashion-MN
袁承兴
2018/04/11
1.1K0
MNIST终结者:Fashion-MNIST
MOOC TensorFlow入门实操课程代码回顾总结(一)
0 T-shirt/top(体恤) 1 Trouser(裤子) 2 Pullover(套头衫) 3 Dress(连衣裙) 4 Coat(外套) 5 Sandal(凉鞋) 6 Shirt(衬衫) 7 Sneaker(运动鞋) 8 Bag(袋子) 9 Ankle boot(短靴)
荣仔_最靓的仔
2022/01/05
7340
MOOC TensorFlow入门实操课程代码回顾总结(一)
[MXNet逐梦之旅]练习三·使用MXNetFashionMNIST数据集分类手动实现
[MXNet逐梦之旅]练习三·使用MXNetFashionMNIST数据集分类手动实现 code #%% import sys import time from mxnet import gluon as gl import mxnet as mx from matplotlib import pyplot as plt from mxnet import autograd, nd import numpy as np mnist_train = gl.data.vision.FashionMNIST(r
小宋是呢
2019/06/27
4240
TensorFlow Serving
TensorFlow Serving[1] 可以快速部署 Tensorflow 模型,上线 gRPC 或 REST API。
GoCoding
2021/05/06
5820
TensorFlow Serving
TensorFlow 2.0 Tutorial: 4 - 几个常用技术
下面这个过程是一个最基础的模型建立到评估到预测的流程, 几乎都是遵循这样的一个过程,
杨熹
2019/04/22
5640
Pytorch 基于VGG-16的服饰识别(使用Fashion-MNIST数据集)
✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的博客 🍊个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 🥭本文内容:Pytorch 基于VGG的服饰识别(使用Fashion-MNIST数据集) 更多内容请见👇 Python sklearn实现K-means鸢尾花聚类 Pytorch 基于LeNet的手写数字识别 Pytorch 基于AlexNet的服饰识别(使用Fashion-MNIST数据集) ---- 本文目录 介绍 1
小嗷犬
2022/11/15
1.3K1
Pytorch 基于VGG-16的服饰识别(使用Fashion-MNIST数据集)
Pytorch 基于ResNet-18的服饰识别(使用Fashion-MNIST数据集)
✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的博客 🍊个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 🥭本文内容:Pytorch 基于ResNet-18的服饰识别(使用Fashion-MNIST数据集) 更多内容请见👇 Pytorch 基于AlexNet的服饰识别(使用Fashion-MNIST数据集) Pytorch 基于VGG-16的服饰识别(使用Fashion-MNIST数据集) Pytorch 基于NiN的服饰识别
小嗷犬
2022/11/15
1K0
Pytorch 基于ResNet-18的服饰识别(使用Fashion-MNIST数据集)
动手学深度学习(一)——逻辑回归(从零开始)
版权声明:博客文章都是作者辛苦整理的,转载请注明出处,谢谢! https://blog.csdn.net/Quincuntial/article/details/79298122
Tyan
2019/05/25
3860
推荐阅读
相关推荐
[Keras深度学习浅尝]实战一·DNN实现Fashion MNIST 数据集分类
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档