天天看點

怎樣在Winform窗體中嵌入Web浏覽器

背景

項目當中需要在Winform窗體中嵌入網頁,雖然微軟自帶了WebBrowser控件,但是她是以IE模式運作的,相容性實在太差,找了一圈發現有個叫CefSharp的家夥還不錯,于是就拿來玩了一下。

CefSharp 主要特征

  • 支援.NET Framework 4.5.2+
  • 支援Winform,WPF
  • 基于Chromium核心
  • 支援Javascript互操作
  • BSD商業開源,位址https://github.com/cefsharp/CefSharp

快速入門

注:筆者的環境是Visual Studio 2019.

  • 建立winform項目。
  • 打開Nuget包管理器。
  • 搜尋CefSharp.WinForms,可以看到目前最新的版本是81.x, 點選安裝。
  • 編譯項目,會出現以下錯誤:
    CefSharp.Common is unable to proceeed as your current Platform is ‘AnyCPU’. To target AnyCPU please read https://github.com/cefsharp/CefSharp/issues/1714. Alternatively change your Platform to x86 or x64 and the relevant files will be copied automatically. For details on changing your projects Platform see https://docs.microsoft.com/en-gb/visualstudio/ide/how-to-configure-projects-to-target-platforms?view=vs-2017

這是因為編譯的時候預設使用的AnyCPU選項,官方也給出了不同的解決方案,根據其中一種做了以下修改:

  • 用文本工具打開項目檔案,找到第一個PropertyGroup節點,添加子節點:<CefSharpAnyCpuSupport>true</CefSharpAnyCpuSupport>
  • 修改App.Config,添加probing節點,修改後如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
    </startup>
    <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <probing privatePath="x86"/>
      </assemblyBinding>
    </runtime>
</configuration>
           
  • 修改Program的Main函數,如下:
static void Main()
    {
        var settings = new CefSettings();
        settings.BrowserSubprocessPath =System.IO.Path.GetFullPath(@"x86\CefSharp.BrowserSubprocess.exe");

        Cef.Initialize(settings, performDependencyCheck: false, browserProcessHandler: null);

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
           
  • 最後在Form裡面嵌入浏覽器控件即可:
public Form1()
{
    InitializeComponent();

    ChromiumWebBrowser browser = new ChromiumWebBrowser("http://www.bigname65.com");
    browser.Dock = DockStyle.Fill;
    this.Controls.Add(browser);
}
           

繼續閱讀