WPF: отображение содержимого на основе HTML, хранящегося в сборке ресурса - PullRequest
7 голосов
/ 06 февраля 2010

В моем проекте WPF мне нужно отобразить контент на основе HTML, где контент хранится в сборке ресурсов, на которую ссылается мой проект WPF.

Я посмотрел на элементы управления WPF Frame и WebBrowser. К сожалению, они оба предоставляют только события Навигации (Навигация, Навигация), но не события, которые позволили бы мне, основываясь на запрошенном URL, возвращать HTML-контент, извлеченный из сборки ресурса.

Я могу перехватывать запросы навигации и обслуживать HTML-контент, используя событие Navigating и метод NavigateToString (). Но это не работает для перехвата вызовов загрузки изображений, файлов CSS и т. Д.

Кроме того, мне известно о примере приложения HTML to Flowdocument SDK, которое может оказаться полезным, но мне, вероятно, придется значительно расширить образец для работы с изображениями и таблицами стилей.

Для чего бы это ни стоило, мы также генерируем контент HTML, который будет отображаться (через вики-страницы), чтобы исходный HTML был несколько предсказуемым (например, может быть, без JavaScript) с точки зрения местоположения ссылочных изображений и используемых таблиц стилей CSS. Мы стремимся отображать случайный HTML-контент из Интернета.

Обновление: Существует также возможность создания MHT-файла для каждой HTML-страницы, который «встроил бы» все изображения в MIME-типы и избавил бы от необходимости иметь более детализированные обратные вызовы.

Ответы [ 2 ]

3 голосов
/ 02 ноября 2010

WebBrowser предоставляет метод NavigateToStream (Stream) , который может работать для вас:

Если ваш контент затем сохраняется как встроенный ресурс, вы можете использовать:

var browser = new WebBrowser();
var source = Assembly.Load("ResourceAssemblyName");
browser.NavigateTo(source.GetManifestResourceStream("ResourceNamespace.ResourceName"));

Существует также метод NavigateToString(string), который ожидает содержимое документа string.

Примечание: я никогда не использовал это в гневе, поэтому я понятия не имею, насколько это поможет!

3 голосов
/ 02 ноября 2010

Если вы в порядке с использованием 28-мегабайтной библиотеки DLL, вы можете взглянуть на BerkeliumSharp , который представляет собой управляемую оболочку для потрясающей Berkelium библиотеки. Berkelium использует браузер Chromium по своей сути для предоставления закадрового рендеринга и делегированной модели обработки событий. Есть множество действительно крутых вещей, которые вы можете сделать с этим, но для вашей конкретной проблемы в Berkelium есть интерфейс, называемый ProtocolHandler. Назначение обработчика протокола - получить URL-адрес и предоставить заголовки и тело HTTP обратно в базовый механизм рендеринга.

В тестовом приложении BerkeliumSharp (один из проектов, доступных в исходном коде) вы можете увидеть одно конкретное использование этого FileProtocolHandler - оно обрабатывает все файловые операции ввода-вывода для протокола «file: //» с использованием протокола .NET управляемые классы (System.IO). Вы можете сделать то же самое для составленного протокола, такого как «resource: //». На самом деле есть только один метод, который вы должны переопределить, называемый HandleRequest, который выглядит так:

bool HandleRequest (string url, ref byte[] responseBody, ref string[] responseHeaders)

Таким образом, вы бы взяли URL-адрес, например «resource: // path / to / my / html», и выполнили все необходимые Assembly.GetResourceStream и т. Д. В этом методе. Должно быть довольно легко взглянуть на то, как FileProtocolHandler используется для адаптации вашего собственного.

И Berkelium, и Berkelium Sharp являются открытым исходным кодом с лицензией BSD.

...