2009-08-10 3 views
8

У меня есть встроенный HTML-ресурс (helloworld.htm) внутри моего проекта Visual Studio. (То есть, я добавил файл HTML в проект и установить его свойство «внедренный ресурс».MS WebBrowser + Встроенный HTML-ресурс + res: // Протокол

В одном приложении у меня есть контроль WebBrowser.

Я хотел бы направить обозревательУправление для отображения HTML-ресурс с помощью res:// protocol.

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

Любые идеи? Спасибо!

+0

Я получил это, чтобы работать ранее, но забыл формат для URL w/res: // протокола. – user144051

+1

Есть ли у вас обновления? –

ответ

0
webBrowser1.DocumentText = ResourceinWebBrowser.Properties.Resources.HTML.ToString(); 

Где:

  • webBrowser1 Является ли WebBrowser Control
  • ResourceinWebBrowser ваш ех/Название проекта.
  • HTML это имя вашего встроенного HTML ресурса
11

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

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

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

+0

Как-то VLC ActiveX не работает таким образом ... http: //stackoverflow.com/questions/14749242/vlc-activex-in-a-local-webpage-with-wpf-webbrowser-control –

6

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

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

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

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

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

Дополнительный ресурс:
MSDN Social: Webbrowser and res: protocol
DelphiDabbler: How to create and use HTML resource files

+0

это лучший ответ, теперь я знаю ограничение протокола res, потому что я не могу установить тип mime программно для файлов .mht – dns

1

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

Как звонить:

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

Самый простой способ, возможно, не самый безопасный или самый здравомыслящий, состоит в том, чтобы иметь переменную «Настройки», которая составляла базовую веб-страницу, размещать собственные метки маркеров для ЗАМЕНЫ при потоковой передаче строк в пакетах. Таким образом, как только нединамические части веб-страницы будут завершены, вам нужно будет отобразить динамические части для ЗАМЕНИТАНИЯ в строке. Затем установите DoumentText = stringWebStream. Обязательно установите AllowNavigation = True.

0

Я знаю, что это было предложено давно, но here's how IE интерпретирует res: протокол:

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

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

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

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

Смежные вопросы