日常开发中,我们需要将一些Web页面嵌入到桌面客户端软件中。下面我们使用CefSharp嵌入浏览器来实现。

首先先介绍一下CefSharp嵌入式浏览器,它是基于Google浏览器的一个组件,我们可以在WPF/WinForm客户端软件中使用它。CefSharp的代码托管在GitHub上,.NET (WPF and Windows Forms) bindings for the Chromium Embedded Framework

目前最新版本的CefSharp是41.0版本,如果你的客户端软件需要支持WIN XP操作系统,建议使用CefSharp.Wpf 1.25.7及之前的版本。可以从Nuget上获取到具体的内容。在新版本的CefSharp中,已经取消了对WIN XP系统的支持。

具体的实现:(首先引用CefSharp.dll,CefSharp.Wpf.dll 另外将icudt.dll,libcef.dll这两个Dll放置在bin/Debug或者bin/Release目录下)

先创建一个UserControl,并继承IRequestHandler接口,代码如下:

UI:

  1. <UserControl x:Class="EmbeddedWebBrowserSolution.WebPageViewer"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  5. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  6. xmlns:local="clr-namespace:EmbeddedWebBrowserSolution"
  7. xmlns:uc="clr-namespace:EmbeddedWebBrowserSolution"
  8. mc:Ignorable="d"
  9. d:DesignHeight="300" d:DesignWidth="300">
  10. <Grid x:Name="MainGrid">
  11. <uc:MaskLoading x:Name="maskLoading"/>
  12. </Grid>
  13. </UserControl>

Code:

  1. public partial class WebPageViewer : UserControl, IRequestHandler
  2. {
  3. private WebView _view;
  4.  
  5. public WebPageViewer(string url)
  6. {
  7. InitializeComponent();
  8.  
  9. CEF.Initialize(new Settings { LogSeverity = LogSeverity.Disable, PackLoadingDisabled = true });
  10.  
  11. BrowserSettings browserSetting = new BrowserSettings { ApplicationCacheDisabled = true, PageCacheDisabled = true };
  12.  
  13. _view = new WebView(string.Empty, browserSetting)
  14. {
  15. Address = url,
  16. RequestHandler = this,
  17. Background = Brushes.White
  18. };
  19.  
  20. _view.LoadCompleted += _view_LoadCompleted;
  21.  
  22. MainGrid.Children.Insert(, _view);
  23. }
  24.  
  25. private void _view_LoadCompleted(object sender, LoadCompletedEventArgs url)
  26. {
  27. Dispatcher.BeginInvoke(new Action(() =>
  28. {
  29. maskLoading.Visibility = Visibility.Collapsed;
  30. }));
  31. }
  32.  
  33. public void View(string url)
  34. {
  35. if(_view.IsBrowserInitialized)
  36. {
  37. _view.Visibility = Visibility.Hidden;
  38.  
  39. maskLoading.Visibility = Visibility.Visible;
  40.  
  41. _view.Load(url);
  42. }
  43. }
  44.  
  45. #region IRequestHandler
  46. public bool GetAuthCredentials(IWebBrowser browser, bool isProxy, string host, int port, string realm, string scheme, ref string username, ref string password)
  47. {
  48. return false;
  49. }
  50.  
  51. public bool GetDownloadHandler(IWebBrowser browser, string mimeType, string fileName, long contentLength, ref IDownloadHandler handler)
  52. {
  53. return true;
  54. }
  55.  
  56. public bool OnBeforeBrowse(IWebBrowser browser, IRequest request, NavigationType naigationvType, bool isRedirect)
  57. {
  58. return false;
  59. }
  60.  
  61. public bool OnBeforeResourceLoad(IWebBrowser browser, IRequestResponse requestResponse)
  62. {
  63. return false;
  64. }
  65.  
  66. public void OnResourceResponse(IWebBrowser browser, string url, int status, string statusText, string mimeType, WebHeaderCollection headers)
  67. {
  68.  
  69. }
  70. #endregion
  71. }

下一步,在MainWindow上来承载,

UI:

  1. <Grid>
  2. <DockPanel>
  3. <StackPanel DockPanel.Dock="Top" Orientation="Horizontal">
  4. <TextBlock Text="Address:" Margin="5"/>
  5. <TextBox x:Name="txtAddress" Width="350" Margin="5"/>
  6. <Button Content="Go" Margin="5" Click="OnGoClick" IsDefault="True"/>
  7. </StackPanel>
  8.  
  9. <Grid x:Name="MainGrid">
  10.  
  11. </Grid>
  12. </DockPanel>
  13. </Grid>

Code:

  1. private void OnGoClick(object sender, RoutedEventArgs e)
  2. {
  3. string url = txtAddress.Text;
  4.  
  5. if (!string.IsNullOrWhiteSpace(url))
  6. {
  7. WebPageViewer viewer = new WebPageViewer(url);
  8. MainGrid.Children.Insert(,viewer);
  9. }
  10. }

注意,需要将工程Platform Target设置为X86。

运行效果:

到这里,一个使用CefSharp来承载Web页面的例子就算完成了。

相比于WPF内置的WebBrowser,CefSharp在处理JS回掉时,比WebBrowser方便很多。请看下面的例子:

我们有这样一个HTML页面:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title></title>
  5. <meta charset="utf-8" />
  6. <script type="text/javascript">
  7. function callback()
  8. {
  9. callbackObj.showMessage('message from js');
  10. }
  11. </script>
  12. </head>
  13. <body>
  14. <input type="button" value="Click" onclick="callback()" ID="Button">
  15. </body>
  16. </html>

增加一个类,叫做:CallbackObjectForJs

  1. public class CallbackObjectForJs
  2. {
  3. public void showMessage(string msg)
  4. {
  5. MessageBox.Show(msg);
  6. }
  7. }

 注意这个方法的名称必须小写。

改造一下WebPageViewer类,在构造后WebView之后,注册一个JS对象,

  1. //...
  2. public WebPageViewer(string url)
  3. {
  4. InitializeComponent();
  5.  
  6. CEF.Initialize(new Settings { LogSeverity = LogSeverity.Disable, PackLoadingDisabled = true });
  7.  
  8. BrowserSettings browserSetting = new BrowserSettings { ApplicationCacheDisabled = true, PageCacheDisabled = true };
  9.  
  10. _view = new WebView(string.Empty, browserSetting)
  11. {
  12. Address = url,
  13. RequestHandler = this,
  14. Background = Brushes.White
  15. };
  16.  
  17. _view.RegisterJsObject("callbackObj", new CallbackObjectForJs());
  18.  
  19. _view.LoadCompleted += _view_LoadCompleted;
  20.  
  21. MainGrid.Children.Insert(, _view);
  22. }
  23. //...

运行效果如下:

通过这样的方式,我们可以很好的实现Web页面与客户端程序之间的交互。点击这里下载代码。

感谢您的阅读!

在WPF中使用CefSharp嵌入浏览器的更多相关文章

  1. 在WPF中使用CefSharp嵌入浏览器(转)

    在WPF中使用CefSharp嵌入浏览器   日常开发中,我们需要将一些Web页面嵌入到桌面客户端软件中.下面我们使用CefSharp嵌入浏览器来实现. 首先先介绍一下CefSharp嵌入式浏览器,它 ...

  2. WPF中使用cefsharp

    原文:WPF中使用cefsharp 新入职一家公司,由写服务端接口变成了软硬件通信.服务器.客户端.C/S.B/S乱七八糟各种打杂.首先接收一个WPF项目,因为不熟WPF,再加上前端我也不熟,我打算使 ...

  3. 【WPF】使用CefSharp嵌入HTML网页

    需求:WPF项目中要做用户的商铺主页,由于考虑到每个商家的主页布局各不相同,不能用XAML写死布局.最好的办法是WPF这边XAML写好一个容器,用户使用HTML可视化编辑器(比如这个)来准备好网页,输 ...

  4. .net core Wpf中使用cefsharp加载本地html网页,并且cefsharp支持any cpu

    第一步,在程序包管理器安装 cefsharp.wpf 第二步 您必须在项目的第一个 < propertygroup > 中添加 < cefsharpanycpusupport > ...

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

    废话少说,直接上代码: 第一步: 第二步: 第三步: 第四步: App.xaml.cs对应的代码: using CefSharp; using CefSharp.Wpf; using System; ...

  6. 浏览器扩展系列————在WPF中定制WebBrowser快捷菜单

    原文:浏览器扩展系列----在WPF中定制WebBrowser快捷菜单 关于如何定制菜单可以参考codeproject上的这篇文章:http://www.codeproject.com/KB/book ...

  7. 在WPF中嵌入WebBrowser可视化页面

    无论是哪种C/S技术,涉及数据可视化就非常的累赘了,当然大神也一定有,只不过面向大多数人,还是通过网页来实现,有的时候不想把这两个功能分开,一般会是客户的原因,所以我们打算在WPF中嵌入WebBrow ...

  8. WPF中嵌入普通Win32程序的方法

    公司现在在研发基于.Net中WPF技术的产品,由于要兼容旧有产品,比如一些旧有的Win32程序.第三方的Win32程序等等,还要实现自动登录这些外部Win32程序,因此必须能够将这些程序整合到我们的系 ...

  9. WPF中嵌入Office编辑器(支持Word、Excel、PPT、Visio等)

    现在有一个项目,需要使用wpf做一个简单的客户端,用来生成word.excel.ppt.visio等文档,这就需要能够在wpf中嵌入office的编辑器,并对office文档进行编辑. 在网上搜索了一 ...

随机推荐

  1. linux中shell截取字符串方法总结

    截取字符串的方法一共有八种,主要为以下方法 shell中截取字符串的方法有很多中, ${expression}一共有9种使用方法. ${parameter:-word} ${parameter:=wo ...

  2. 使用GitHub

    1. 进入 1.1 建立账号 打开网站https://github.com/主页上就可以注册.注册之后会有一个简单的帮助文档,在帮组文档上可以下载一个PC客户端(如果是WINDOWS平台,需要.NET ...

  3. 循环(loop), 递归(recursion), 遍历(traversal), 迭代(iterate)的区别

    表示“重复”这个含义的词有很多, 比如循环(loop), 递归(recursion), 遍历(traversal), 迭代(iterate). 循环算是最基础的概念, 凡是重复执行一段代码, 都可以称 ...

  4. http://www.htmleaf.com/ziliaoku/qianduanjiaocheng/

    http://www.htmleaf.com/ziliaoku/qianduanjiaocheng/ box-shadow  :   http://blog.csdn.net/freshlover/a ...

  5. ODATA 云驱动 http://www.cdata.com/cloud/

    ODATA 云驱动   http://www.cdata.com/cloud/    目前支持:ORACLE.MS SQL . MYSQL. -------------- rssbus      ht ...

  6. monitor disk

    #!/bin/bash # #top #Big_USERS - find big disk space users in various directories ################### ...

  7. hdu 1556.Color the ball 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1556 题目意思:有 n 个气球从左到右排成一排,编号依次为1,2,3,...,n.给出 n 对 a, ...

  8. 【QT】视频播放

    在网上没找到,在书上也没有.后来突然想直接在官网的类里面找Video 居然就有了. 把http://qt-project.org/doc/qt-5/qmediaplayer.html的例子补充完整后就 ...

  9. DropDownList如何添加一个空白的选项

    ddl_class.Items.Insert(0,new ListItem("",""));

  10. August 9th 2016, Week 33rd Tuesday

    Tomorrow is never clear, our time is here. 明天是未知的,我们还是要过好当下. Tomorrow is not unpredictable, it is cl ...