zoukankan      html  css  js  c++  java
  • 【WPF】使用CefSharp嵌入HTML网页

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

    选择插件:Webkit.Net只支持32位的,已经好多年没再更新了,试过后不太好用。最后搜到CefSharp这个项目,下载后运行试用,觉得符合需求,且自带的WPF的Demo这个这个容易上手。

    坑点:因为CefSharp不支持AnyCPU,需要VS中为项目编译平台单独指定x86和x64,否则会发现引入的相关DLL都是黄色叹号不可用的,且编译不通过要求必须指定x86或x64平台。根据报错提示参考这里操作后也不能解决这个问题,最后是照着教程设置才可用的。从Nuget引入CefSharp后,还有一个bug是要重启VS才能开始使用该插件。这些小问题都在教程(https://www.codeproject.com/Articles/881315/Display-HTML-in-WPF-and-CefSharp-Tutorial-Part)中有提及,需要小心。

    从Nuget中安装好后,弹出的文档有提到上面的问题。

    最简单的例子:

    <Window x:Class="CefSharpTest.Presentation.Views.ShellWindow"
            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:vm="clr-namespace:CefSharpTest.Applications.ViewModels"
            xmlns:wpf="clr-namespace:CefSharp.Wpf;assembly=CefSharp.Wpf"
            xmlns:cef="clr-namespace:CefSharp;assembly=CefSharp.Core"
            mc:Ignorable="d" Title="{Binding Title}" Icon="{StaticResource ApplicationIcon}" Width="800" Height="600">
    
        <DockPanel>
            <Grid>
                <wpf:ChromiumWebBrowser x:Name="Browser" Address="http://www.baidu.com"/>
            </Grid>
        </DockPanel>
    </Window>

    注意使用xmlns:wpf="clr-namespace:CefSharp.Wpf;assembly=CefSharp.Wpf"来引入浏览器控件所在的程序集。

    运行效果:

    想要支持AnyCPU怎么办?

    CefSharp ver51.0.0开始支持AnyCPU

    1. Github上对该问题的讨论:https://github.com/cefsharp/CefSharp/issues/1714
    2. 参考Demo:https://github.com/cefsharp/CefSharp.MinimalExample/tree/demo/anycpu
    3. 其他资料:https://ourcodeworld.com/articles/read/173/how-to-use-cefsharp-chromium-embedded-framework-csharp-in-a-winforms-application

    实践发现第3点中的做法有问题!导致项目AnyCPU运行即报错,请完全不要参照第3点中的做法!

    从代码看,Demo中的做法是在App入口用AppDomain.CurrentDomain.AssemblyResolve += Resolver给当前应用程序域注册了一个程序集解析失败时发生的回调,在该回调中通过判断当前程序的运行环境来为程序集动态地加载x86或x64的三个CefSharp相关DLL文件(CefSharp.dll、CefSharp.Core.dll、CefSharp.Wpf.dll),然后用Cef.Initialize()初始化CefSharp.BrowserSubprocess.exe。

    其他问题

    关闭WPF应用时程序无法退出?

    如何屏蔽浏览器右键菜单?

  • 相关阅读:
    机器学习笔记
    python学习笔记-day8
    python学习笔记-day7
    python学习笔记-day6
    python学习笔记-day5
    python习题
    単語
    bat批处理----copy和xcopy区别
    C#
    VB
  • 原文地址:https://www.cnblogs.com/guxin/p/wpf-embed-html-by-cefsharp.html
Copyright © 2011-2022 走看看