wpf中使用cefsharp加载本地html网页并实现cs和js的交互,并且cefsharp支持any cpu

废话少说,直接上代码:

第一步:

第二步:

第三步:

第四步:

App.xaml.cs对应的代码:

using CefSharp;
using CefSharp.Wpf;
using System;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Windows;

namespace CefSharpe
{
    /// <summary>
    /// App.xaml 的交互逻辑
    /// </summary>
    public partial class App : Application
    {
        public App()
        {
            //Add Custom assembly resolver
            AppDomain.CurrentDomain.AssemblyResolve += Resolver;

            //Any CefSharp references have to be in another method with NonInlining
            // attribute so the assembly rolver has time to do it‘s thing.
            InitializeCefSharp();
        }

        [MethodImpl(MethodImplOptions.NoInlining)]
        private static void InitializeCefSharp()
        {
            var settings = new CefSettings();

            // Set BrowserSubProcessPath based on app bitness at runtime
            settings.BrowserSubprocessPath = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase,
                                                   Environment.Is64BitProcess ? "x64" : "x86",
                                                   "CefSharp.BrowserSubprocess.exe");

            // Make sure you set performDependencyCheck false
            Cef.Initialize(settings, performDependencyCheck: false, browserProcessHandler: null);
        }

        // Will attempt to load missing assembly from either x86 or x64 subdir
        // Required by CefSharp to load the unmanaged dependencies when running using AnyCPU
        private static Assembly Resolver(object sender, ResolveEventArgs args)
        {
            if (args.Name.StartsWith("CefSharp"))
            {
                string assemblyName = args.Name.Split(new[] { ‘,‘ }, 2)[0] + ".dll";
                string archSpecificPath = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase,
                                                       Environment.Is64BitProcess ? "x64" : "x86",
                                                       assemblyName);

                return File.Exists(archSpecificPath)
                           ? Assembly.LoadFile(archSpecificPath)
                           : null;
            }

            return null;
        }
    }
}

以上实现的是cefsharp支持any cpu

下面实现加载本地html并且实现与js交互,对于如何下载cefsharp就不做过多说明,网上一大把

第五步:

<Window x:Class="CefSharpe.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:CefSharpe"
        xmlns:cefSharp="clr-namespace:CefSharp.Wpf;assembly=CefSharp.Wpf"
        mc:Ignorable="d"
        Title="cefSharp" >
    <Grid>
        <cefSharp:ChromiumWebBrowser x:Name="cefsharp"></cefSharp:ChromiumWebBrowser>
        <Button Height="30" VerticalAlignment="Bottom" Click="Button_Click">调用js的方法</Button>
    </Grid>
</Window>

第六步:

using CefSharp;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using CefSharp.Wpf;

namespace CefSharpe
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {

            InitializeComponent();

            CefSharpSettings.LegacyJavascriptBindingEnabled = true;

            this.cefsharp.Address = AppDomain.CurrentDomain.BaseDirectory+@"index.html";
            this.cefsharp.RegisterJsObject("JsObj", new CallbackObjectForJs(), new CefSharp.BindingOptions { CamelCaseJavascriptNames = false});            //阻止默认行为
            cefsharp.MenuHandler = new MenuHandler();
        }
        public class CallbackObjectForJs
        {

            public string name = "";
            public void showTest(string msg)
            {
                MessageBox.Show(msg);
                MessageBox.Show(name);
            }
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            cefsharp.ExecuteScriptAsync("ydb1(‘asdadaasdasdas我是杨道波‘)");
        }
        public class MenuHandler : IContextMenuHandler
        {
            public void OnBeforeContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model)
            {
                model.Clear();
            }
            public bool OnContextMenuCommand(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, CefMenuCommand commandId, CefEventFlags eventFlags)
            {
                return false;
            }
            public void OnContextMenuDismissed(IWebBrowser browserControl, IBrowser browser, IFrame frame)
            {
            }
            public bool RunContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model, IRunContextMenuCallback callback)
            {
                return false;
            }
        }

    }

}

第七步:

在本地项目中放入index.html

第八步:

index.html里面的内容

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1 id="ydb">我是杨道波sdadsad</h1>
<!--<script>-->

    <!--//屏蔽鼠标右键、Ctrl+N、Shift+F10、F11、F5刷新、退格键-->
    <!--document.oncontextmenu = function () { event.returnValue = false; }//屏蔽鼠标右键-->
    <!--window.onhelp = function () { return false }   //屏蔽F1帮助-->
    <!--document.onkeydown = function () {-->
        <!--if ((window.event.altKey) &&-->
            <!--((window.event.keyCode == 37) ||       //屏蔽   Alt+   方向键   ←-->
                <!--(window.event.keyCode == 39))) {     //屏蔽   Alt+   方向键   →-->
            <!--event.returnValue = false;-->
            <!--return false;-->
        <!--}-->
        <!--/* 注:这还不是真正地屏蔽Alt+方向键,-->
        <!--因为Alt+方向键弹出警告框时,按住Alt键不放,-->
        <!--用鼠标点掉警告框,这种屏蔽方法就失效了。*/-->
        <!--if ((event.keyCode == 8) ||                                 //屏蔽退格删除键-->
            <!--(event.keyCode == 116) ||                             //屏蔽   F5   刷新键-->
            <!--(event.ctrlKe && event.keyCode == 82)) {              //Ctrl   +   R-->
            <!--event.keyCode = 0;-->
            <!--event.returnValue = false;-->
        <!--}-->
        <!--if (event.keyCode == 122) { event.keyCode = 0; event.returnValue = false; }         //屏蔽F11-->
        <!--if (event.ctrlKey && event.keyCode == 78) event.returnValue = false;      //屏蔽Ctrl+n-->
        <!--if (event.shiftKey && event.keyCode == 121) event.returnValue = false;     //屏蔽shift+F10-->
        <!--if (window.event.srcElement.tagName == "A" && window.event.shiftKey)-->
            <!--window.event.returnValue = false;                                   //屏蔽shift加鼠标左键新开一网页-->
        <!--if ((window.event.altKey) && (window.event.keyCode == 115)) {              //屏蔽Alt+F4-->
            <!--window.showModelessDialog("about:blank", "", "dialogWidth:1px;dialogheight:1px");-->
            <!--return false;-->
        <!--}-->
    <!--}-->
<!--</script>-->

<script>
    ydb.onclick = function(){
        JsObj.name = "asdsadasdas";

        JsObj.showTest("test");
    }
    function ydb1(msg) {

        alert(msg)

    }
</script>
</body>
</html>

效果展示:

点击文字:

点击名为(调用js的方法)的按钮:

拿走不谢.

这是要把我一个学前端逼的转行的节奏啊.

原文地址:https://www.cnblogs.com/jsydb/p/9993516.html

时间: 2024-10-11 12:17:55

wpf中使用cefsharp加载本地html网页并实现cs和js的交互,并且cefsharp支持any cpu的相关文章

关于jquery中load()无法加载本地文件的问题

今天开始刚开始学习jQuery的AJAX就遇到一个头疼的问题,按照教程的代码,我编写的代码如下(使用VS Code编辑器): <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>LOAD方法</title> <script src="../jQuery库/jquery-3.2.1.min.js

iOS 加载本地HTML网页 js css images等文件

开发环境:Xocde Version 7.0.1 (7A1001) 模拟器SDK:Version 9.0 (SimulatorApp-620 CoreSimulator-179) 项目需求:在进入一个新的页面时,webView展示本地HTML网页,并带js交互. 需要注意:调了一下午也没跳出来,错误原因就是往工程里拖要显示的html等资源时,选错了选项. 选creat groups ,运行时会崩溃: reason: '*** -[NSURL initFileURLWithPath:]: nil

WP8.1程序开发中,如何加载本地文件资源或安装在程序包中的资源。

Web 要访问来自 Web 的文件,你可以使用标准的绝对 HTTP URI: <img src="http://www.contoso.com/images/logo.png" alt="Logo" /> 要访问存储在应用附带的框架或库程序包中的文件,请使用绝对 URI(和 ms-appx: 方案): <script src="ms-appx:///Bing.Maps.JavaScript//js/veapicore.js"&g

worker中加载本地文件报错的解决方案

如果在一个swf的主线程中加载文件时,报安全沙箱的错误, 网上有诸多的解决方案.但是如果在一个worker中加载本地文件报类似如下的错误: *** 安全沙箱冲突 *** SecurityError: Error #2148 不能访问本地资源. 网上给出的方案几乎都不能有效的解决问题, 之所以说几乎, 是因为如果以后读者搜到这篇文章时, 有效的解决方案就在这里. 即在本地架设一个http资源服务器, 加载的时候不要用本地地址作为加载路径,而是使用http 地址作为加载地址即可正确加载.

重新想象 Windows 8.1 Store Apps (81) - 控件增强: 加载本地 html, 智能替换 html 中的 url 引用, 通过 Share Contract 分享 WebView 中的内容, 为 WebView 截图

原文:重新想象 Windows 8.1 Store Apps (81) - 控件增强: 加载本地 html, 智能替换 html 中的 url 引用, 通过 Share Contract 分享 WebView 中的内容, 为 WebView 截图 [源码下载] 作者:webabcd 介绍重新想象 Windows 8.1 Store Apps 之控件增强 WebView 加载本地 html,智能替换 html 中的 url 引用 WebView 通过 Share Contract 分享 WebVi

angular 图片加载失败 情况处理? 如何在ionic中加载本地图片 ?

1.angular 图片加载失败 情况处理 在directive中定义组件,在ng-src错误时,调用err-src app.directive('errSrc',function(){ return { link: function(scope, element, attrs){ if(attrs.src == 'undefined'){ attrs.$set('src', attrs.errSrc); } element.bind('error', function() { if (attr

WPF 仪表盘 刻度盘 动态 加载中 开源

原文:WPF 仪表盘 刻度盘 动态 加载中 开源 1. 表盘 参数可以设置, codeproject上写的.网址在这里. 源码里有demo,很详细. 源码在这里. 2. 动态Loading 截图效果跟实际有点不一样. 自己把源码写成 资源就好用了呗 地址在这里 3.  有两个类似的                              地址1  地址2 原文地址:https://www.cnblogs.com/lonelyxmas/p/9689224.html

解决maven无法加载本地lib/下的jar包问题(程序包XXX不存在)

这次一个项目用到maven编译,我在本地开发的时候jar包都是放在WEB-INF/lib目录下,通过 BuildPath将jar包导入,然后用MyEclipse中的:maven package命令打成war包,这个war包在tomcat下能正常运行,war包下是有lib下的jar包的. 但是我往服务器上传的是项目源码,用SVN上传,然后服务器上用maven插件编译运行,编译时报错:找不到WEB-INF/lib下jar包.显然maven编译时不会自动加载WEB-INF/lib下的jar包. 项目的

Android中的Glide加载图片

注意:在Android Studio的项目的build.gradle中添加: compile 'com.github.bumptech.glide:glide:3.6.1' 然后同步一下 目录: 使用Glide结合列表的样式进行图片加载 如果使用的是RecyclerView,可以在Adapter的onBindViewHolder方法中使用 当加载网络图片时,由于加载过程中图片未能及时显示,此时可能需要设置等待时的图片,通过placeHolder()方法 当加载图片失败时,通过error(Draw