CefSharp LoadHtml

Может ли кто-нибудь объяснить мне, как работает функция CefSharp LoadHtml?

LoadHtml(string html, string url)

Что представляют параметры html и url?

Мне интересно загрузить страницу из необработанной строки HTML в браузер CefSharp.

Ответ 1

  Обновление: в CefSharp появился новый метод LoadHtml(string html), который загружает HTML как URI данных в кодировке base64. Более надежным является метод LoadHtml(string html, string url), описанный ниже.

В LoadHtml(string html, string url):

html - ваша HTML-строка, например "<html><body>Hello world</body></html>". На самом деле, вы даже можете поместить в строку другое содержимое, например разметку SVG, если Chromium сможет это понять.

url необходим, потому что ваш HTML-код может содержать JavaScript, который пытается выполнять вызовы AJAX, и веб-браузер должен понимать, какие ограничения безопасности применяются. Схема (например, "http:", "about:") и домен (например, "localhost", "google.com") влияют на поведение, такое как нажатие на ссылки, запросы AJAX, фреймы и т.д.

Если вы хотите просто визуализировать статический HTML, сделайте url чем-то уникальным, например http://rendering/ (чтобы обработчик ресурсов не перекрывался с реальным url в Интернете). Если вам нужно загрузить HTML, а затем взаимодействовать с ним или выполнять вызовы AJAX, выберите url, который соответствует домену, с которым вы хотите взаимодействовать - например, если вы хотите создать альтернативную домашнюю страницу Google и выполнять поисковые запросы AJAX, вы захотите использовать https://www.google.com/ в качестве своего URL, чтобы вы могли общаться с ним.


Вы можете увидеть исходный код для LoadHtml здесь.

Что CefSharp делает:

  1. Зарегистрируйте обработчик ресурса для данного url.
  2. Позвоните Load(url) и сообщите Chromium загрузить данный url.

Затем под капотом:

  1. Хром запрашивает url.
  2. Обработчик ресурсов перехватывает запрос и возвращает ваш html.
  3. Chromium отображает ваш html вместо реального содержимого URL.

Ответ 2

Попробуйте использовать следующий код

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><h1>Hello, World!</h1></body></html>", "http://www.example.com/");

Надеюсь, что это поможет.

Ответ 3

Для проекта WPF попробуйте следующее.

Создайте ссылку пространства имен для CefSharp.Wpf в xaml.

XMLNS: CEF = "CLR-имен: CefSharp.Wpf; сборка = CefSharp.Wpf"

Добавьте элемент ChromiumWebBrowser в ваше окно.

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

Не забудьте присвоить имя элементу (в этом случае элемент называется браузером). Мы будем использовать его для вызова метода LoadHtml позже.

Создайте обработчик событий для события IsBrowserInitializedChanged. Это важно, потому что это событие будет запущено, как только элемент ChromiumWebBrowser будет готов. Затем мы можем загрузить html.

Объединяя все это вместе...

MainWindow.xaml

<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>

MainWindow.xaml.cs

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><h1>Hello, World!</h1></body></html>", "http://www.example.com/");
        }
    }
}