关于 c#:CefSharp LoadHtml

CefSharp LoadHtml

有人可以向我解释一下 CefSharp LoadHtml 函数是如何工作的吗?

1
LoadHtml(string html, string url)

htmlurl 参数代表什么?

我有兴趣将原始 HTML 字符串中的页面加载到 CefSharp 浏览器中。


Update: CefSharp has a new LoadHtml(string html) method that loads the HTML as a base64-encoded data URI. It is more reliable that the LoadHtml(string html, string url) method described below.

LoadHtml(string html, string url):

html 是您的 HTML 字符串,例如"<html><body>Hello world</body></html>"。实际上,你甚至可以在字符串中放入其他内容,例如 SVG 标记,只要 Chromium 能够理解即可。

url 是必需的,因为您的 HTML 代码可能包含尝试执行 AJAX 调用的 JavaScript,并且 Web 浏览器需要了解适用的安全限制。方案(例如"http:"、"about:")和域(例如"localhost"、"google.com")会影响点击链接、AJAX 请求、iframe 等行为。

如果您想简单地呈现静态 HTML,请将 url 设置为独特的内容,例如 http://rendering/(这样资源处理程序就不会与 Web 上的真实 url 重叠)。如果您需要加载 HTML,然后与之交互或执行 AJAX 调用,请选择一个与您要与之交互的域匹配的 url - 例如,如果您想要创建另一个 Google 主页并执行 AJAX 搜索查询,您将希望使用 https://www.google.com/ 作为您的 URL,以便与它进行通信。

您可以在此处查看 LoadHtml 的源代码。

CefSharp 所做的是:

  • 为给定的 url 注册一个资源处理程序。
  • 调用 Load(url) 来告诉 Chromium 加载给定的 url
  • 然后,在引擎盖下:

  • Chromium 请求 url
  • 资源处理程序拦截请求,并返回您的 html
  • Chromium 呈现您的 html 而不是 URL 的真实内容。

  • 试试下面的代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Cef.Initialize(new CefSettings());

    ChromiumWebBrowser browser = new ChromiumWebBrowser(string.Empty) {
        Location = new Point(0, 0),
        Dock = DockStyle.Fill
    };

    //add to a System.Windows.Forms.Form or some other container.
    this.Controls.Add(browser);
    //the url parameter does not have to be an existing address.
    browser.LoadHtml("<html><head></head><body>Hello, World!</body></html>","http://www.example.com/");

    希望这有帮助。


    对于 WPF 项目,请尝试以下操作。

    在 xaml 中创建对 CefSharp.Wpf 的命名空间引用。

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

    将 ChromiumWebBrowser 元素添加到您的窗口中。

    1
    <cef:ChromiumWebBrowser x:Name="browser" IsBrowserInitializedChanged="browser_IsBrowserInitializedChanged"></cef:ChromiumWebBrowser>

    请记住为元素指定一个名称(在本例中,该元素称为浏览器)。稍后我们将使用它来调用 LoadHtml 方法。

    为 IsBrowserInitializedChanged 事件创建一个事件处理程序。这很重要,因为一旦 ChromiumWebBrowser 控件准备就绪,就会触发此事件。然后我们可以加载 html.

    把它们放在一起......

    主窗口.xaml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <Window x:Class="CEF.MainWindow"
        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:local="clr-namespace:CEF"
        xmlns:cef="clr-namespace:CefSharp.Wpf;assembly=CefSharp.Wpf"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
        <Grid>
            <cef:ChromiumWebBrowser x:Name="browser" IsBrowserInitializedChanged="browser_IsBrowserInitializedChanged"></cef:ChromiumWebBrowser>
        </Grid>
    </Window>

    主窗口.xaml.cs

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    using System.Windows;

    namespace CEF
    {
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }

            private void browser_IsBrowserInitializedChanged(object sender, DependencyPropertyChangedEventArgs e)
            {
                // the browser control is initialized, now load the html

                browser.LoadHtml("<html><head></head><body>Hello, World!</body></html>","http://www.example.com/");
            }
        }
    }