【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應用時程序無法退出?

如何屏蔽瀏覽器右鍵菜單?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM