MS WebBrowser + встроенный HTML-ресурс + res: // протокол - PullRequest
9 голосов
/ 10 августа 2009

У меня есть встроенный HTML-ресурс (helloworld.htm) внутри моего проекта Visual Studio. (То есть я добавил HTML-файл в проект и установил для его свойств значение «Встроенный ресурс».

В том же приложении у меня есть элемент управления WebBrowser.

Я бы хотел, чтобы элемент управления WebBrowser отображал ресурс HTML, используя res: // protocol .

Но я не могу определить точный формат, необходимый для адресации встроенного ресурса, используя этот стиль URL.

Есть идеи? Спасибо!

Ответы [ 7 ]

12 голосов
/ 03 февраля 2011

Я знаю, что этот поток мертв, но я должен был сделать это вчера и не смог заставить работать ни один из этих методов. Поэтому я провел небольшое исследование и нашел метод ниже, используя класс Stream. Я думал, что выложу это здесь на всякий случай, если кто-то столкнется с такой же ерундой:

Stream docStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("NameSpace.HTMLPage.html");
WebBrowser.DocumentStream = docStream;

Это сработало для меня без каких-либо проблем, и это было так просто. Я надеюсь, что это принесет пользу кому-то еще!

7 голосов
/ 28 марта 2013

Протокол res: не является мертвым и по-прежнему является отличным способом встраивания веб-страниц в приложения Windows с использованием элемента управления WebBrowser. К сожалению, мне кажется, что есть два типа ресурсов в файлах exe и dll: ресурсы C и ресурсы .net. Может быть возможно встроить ресурсы C в .net dll, но я еще не понял, как это сделать.

Чтобы ответить на ваш вопрос, протокол res задокументирован на здесь , но на самом деле сборка dll или exe - сложная часть. Протокол res достаточно прост. Основная суть этого в том, что вы указываете res: //, следуя по пути к исполняемому файлу или dll (просто имя dll, если оно находится в текущем пути). Для ресурсов типа HTML следуйте этому с именем файла. Вот недавняя статья MSDN, в которой рассказывается о некоторых известных проблемах с протоколом res: http://support.microsoft.com/kb/220830.

Создание ресурсов dll или exe может быть немного сложнее. Для простоты используйте все свои ресурсы типа HTML (даже файлы .js, .png, .jpg). Вместо того, чтобы называть ресурсы с помощью #defined идентификатора ресурса, современные файлы res позволяют вам называть файлы строкой. Это сделает вашу жизнь намного проще.

Расширенный совет: Иметь имена папок в имени ресурса сложно; Я еще не поняла это. Я думаю, что вы можете смоделировать папки, поставив косую черту в имени ресурса, но я думаю, что протокол res запутывается из косой черты, думая, что первая часть пути - это тип ресурса. Явное указание типа ресурса может облегчить это.

Расширенный совет 2: Для пути более новые версии IE могут работать с символом «\», но вы можете использовать «% 5C» вместо «\», если вам нужно указать абсолютное или относительное местоположение dll или exe.

Дополнительный ресурс:
MSDN Social: веб-браузер и res: протокол
DelphiDabbler: как создавать и использовать файлы ресурсов HTML

2 голосов
/ 18 августа 2009
res://project.exe/helloworld.htm
1 голос
/ 24 января 2014

Это маленький вспомогательный класс и как его называть:

Как позвонить:

StreamResourceInfo info = 
    ResourceHelper.GetResourceStreamInfo(@"Resources/GraphicUserGuide.html");
if (info != null)
{
    WebBrowser.NavigateToStream(info.Stream);
}

Класс помощника:

using System;
using System.Reflection;
using System.Windows;
using System.Windows.Media.Imaging;
using System.Windows.Resources;

namespace HQ.Wpf.Util
{
    public class ResourceHelper
    {
        // ******************************************************************
        /// <summary>
        /// Load a resource WPF-BitmapImage (png, bmp, ...) from embedded resource defined as 'Resource' not as 'Embedded resource'.
        /// </summary>
        /// <param name="pathInApplication">Path without starting slash</param>
        /// <param name="assembly">Usually 'Assembly.GetExecutingAssembly()'. If not mentionned, I will use the calling assembly</param>
        /// <returns></returns>
        public static BitmapImage LoadBitmapFromResource(string pathInApplication, Assembly assembly = null)
        {
            if (assembly == null)
            {
                assembly = Assembly.GetCallingAssembly();
            }

            return new BitmapImage(ResourceHelper.GetLocationUri(pathInApplication, assembly));
        }

        // ******************************************************************
        /// <summary>
        /// The resource should be defined as 'Resource' not as 'Embedded resource'.
        /// </summary>
        /// <param name="pathWithoutLeadingSlash">The path start with folder name (if any) then '/', then ...</param>
        /// <param name="assembly">If null, then use calling assembly to find the resource</param>
        /// <returns></returns>
        public static Uri GetLocationUri(string pathWithoutLeadingSlash, Assembly assembly = null)
        {
            if (pathWithoutLeadingSlash[0] == '/')
            {
                pathWithoutLeadingSlash = pathWithoutLeadingSlash.Substring(1);
            }

            if (assembly == null)
            {
                assembly = Assembly.GetCallingAssembly();
            }

            return new Uri(@"pack://application:,,,/" + assembly.GetName().Name + ";component/" + pathWithoutLeadingSlash, UriKind.Absolute);
        }

        // ******************************************************************
        /// <summary>
        /// The resource should be defined as 'Resource' not as 'Embedded resource'.
        /// Example:            
        ///     StreamResourceInfo info = ResourceHelper.GetResourceStreamInfo(@"Resources/GraphicUserGuide.html");
        ///     if (info != null)
        ///     {
        ///         WebBrowser.NavigateToStream(info.Stream);
        ///     }
        /// </summary>
        /// <param name="path">The path start with folder name (if any) then '/', then ...</param>
        /// <param name="assembly">If null, then use calling assembly to find the resource</param>
        /// <returns></returns>
        public static StreamResourceInfo GetResourceStreamInfo(string path, Assembly assembly = null)
        {
            if (assembly == null)
            {
                assembly = Assembly.GetCallingAssembly();
            }

            return Application.GetResourceStream(ResourceHelper.GetLocationUri(path, assembly));
        }

        // ******************************************************************

    }
}
0 голосов
/ 23 марта 2015

Я знаю, что об этом уже давно спрашивают, но вот как IE интерпретирует протокол res::

Рез: // sFile [/ Stype] / Sid

sFile Кодированный в процентах путь и имя файла модуля, который содержит ресурс.

sType Необязательно. Строковый или числовой тип ресурса. Это может быть пользовательский ресурс или один из предопределенных типов ресурсов, которые распознаются функцией FindResource . Если числовой ресурс указывается тип, номер идентификатора должен следовать за # персонаж. Если этот параметр не указан, ресурс по умолчанию тип RT_HTML или RT_FILE.

sID Строка или числовой идентификатор ресурса. Если указан числовой идентификатор, фактический номер идентификатора, а не Сам идентификатор, должен следовать за символом #. Смотрите пример для более информация.

0 голосов
/ 18 марта 2014

Самый простой способ, может быть, не самый безопасный или самый нормальный, - это иметь переменную Settings, которая составляла бы базовую веб-страницу, размещать свои собственные метки-метки в REPLACE при потоковой передаче строк в пакетах. Таким образом, после того, как не динамические части веб-страницы завершены, вам нужно только отобразить динамические части в REPLACE в строке. Затем установите DoumentText = stringWebStream. Обязательно установите AllowNavigation = True.

0 голосов
/ 14 декабря 2009
webBrowser1.DocumentText = ResourceinWebBrowser.Properties.Resources.HTML.ToString();

Где:

  • webBrowser1 - это WebBrowser элемент управления
  • ResourceinWebBrowser - это ваш exe / имя проекта.
  • HTML - это имя вашего встроенного HTML-ресурса
...