CefSharp开发笔记

应用开发过程有时候需要用到内嵌浏览器来显示HTML文件或网页。
WPF本身提供了一个WebBrowser控件,可以实现基本的浏览器功能。
另外还有CefSharp控件,相当于是基于谷歌的开源浏览器封装的,也可以实现内嵌浏览器的功能。

安装

WPF使用时,如果是.NET Framework安装:

Install-Package CefSharp.Wpf

如果是.NET CORE安装:

Install-Package CefSharp.OffScreen.NETCore

使用示例

需要在App.xaml.cs文件中添加:

    protected override void OnStartup(StartupEventArgs e)
    {
        Cef.Initialize(new CefSettings(), performDependencyCheck: true, browserProcessHandler: null);
        base.OnStartup(e);
    }

    protected override void OnExit(ExitEventArgs e)
    {
        base.OnExit(e);
        Cef.Shutdown();
    }

注意:Cef.Initialize语句需要放在 base.OnStartup(e)之前,不然有可能会报异常。

前台代码:

xmlns:cef="clr-namespace:CefSharp.Wpf;assembly=CefSharp.Wpf"

<cef:ChromiumWebBrowser x:Name="browser" />

如何是直接加载HTML文本,使用下面的语句:

browser.LoadHtml(htmlContent, "http://localhost");

第一个参数是 HTML 内容字符串。
第二个参数是基 URL,用于解析相对路径(例如,CSS 和 JavaScript 文件)。在这个例子中,我们使用 "http://localhost" 作为基 URL。
加载网址:

_browser.Load(webUrl);

FAQ

点击链接时,用系统默认浏览器打开

安装一个类:

public class CustomLifeSpanHandler : ILifeSpanHandler
{
    public bool OnBeforePopup(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, string targetUrl,
        string targetFrameName, WindowOpenDisposition targetDisposition, bool userGesture, IPopupFeatures popupFeatures,
        IWindowInfo windowInfo, IBrowserSettings browserSettings, ref bool noJavascriptAccess, out IWebBrowser newBrowser)
    {
        if (chromiumWebBrowser is ChromiumWebBrowser)
        {
            Process.Start(new ProcessStartInfo(targetUrl) { UseShellExecute = true });
        }
        newBrowser = null;
        return true;
    }

    public void OnAfterCreated(IWebBrowser chromiumWebBrowser, IBrowser browser)
    {
    }

    public bool DoClose(IWebBrowser chromiumWebBrowser, IBrowser browser)
    {
        return false;
    }

    public void OnBeforeClose(IWebBrowser chromiumWebBrowser, IBrowser browser)
    {
    }
}

在控件初始化时:

public partial class UcDataInfo : UserControl
{
    public UcDataInfo()
    {
        InitializeComponent();

        browser.LifeSpanHandler = new CustomLifeSpanHandler();
    }
}

重新加载网页时,把滚动条复位到控件的顶部

目前不是很明确,GPT出来,说是通过调用JavaScript来实现,但试了一上,有报一些异常。

private async void ScrollToTop_Click(object sender, EventArgs e)
{
    // 执行 JavaScript 代码滚动到页面顶部
    await browser.EvaluateScriptAsync("window.scrollTo(0, 0);");
}

本来想直接找出控件的ScrollBar,然后直接去操作,说是基于Cef封装的,没有ScrollBar控件。

缩放网页的内容

_browser.SetZoomLevel(1.0);

其中1.0是100%,1.5是150%。

posted @ 2024-11-06 10:28  wzwyc  阅读(17)  评论(0编辑  收藏  举报