2009-08-10 16 views
8

Tengo un recurso HTML incrustado (helloworld.htm) dentro de mi proyecto de Visual Studio. (Es decir, he añadido un archivo HTML para el proyecto y establecer sus propiedades a "Recurso incrustado".MS WebBrowser + HTML incorporado Recurso + res: // Protocolo

Dentro de la misma aplicación que tengo un control WebBrowser.

me gustaría dirigir el control WebBrowser para visualizar el recurso HTML utilizando el res:// protocol.

Pero no puedo averiguar el formato exacto necesario para hacer frente a un recurso incrustado utilizando este estilo de dirección URL.

¿Alguna idea? Gracias!

+0

He conseguido que esto funcione anteriormente, pero he olvidado el formato para el protocolo URL w/res: //. – user144051

+1

¿Hay actualizaciones disponibles? –

Respuesta

2
res://project.exe/helloworld.htm 
0
webBrowser1.DocumentText = ResourceinWebBrowser.Properties.Resources.HTML.ToString(); 

Dónde:

  • webBrowser1 es el control de WebBrowser
  • ResourceinWebBrowser es su exe/Nombre del proyecto.
  • HTML es el nombre de su recurso HTML incrustado
11

Sé que este hilo está muerto, pero tenía que hacer esto ayer y no podía conseguir cualquiera de estos métodos para trabajar. Así que investigué un poco y encontré el método a continuación, usando la clase Stream. Yo pensé que había puesto aquí por si acaso alguien se encuentra con el mismo sentido:

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

Esto funcionó para mí sin ningún tipo de retoques, y era tan simple. ¡Espero que beneficie a alguien más!

+0

De alguna manera, VLC ActiveX no funciona de esa manera ... http: //stackoverflow.com/questions/14749242/vlc-activex-in-a-local-webpage-with-wpf-webbrowser-control –

6

El protocolo res: no está muerto y sigue siendo una excelente manera de incrustar páginas web en aplicaciones de Windows utilizando un control WebBrowser. Desafortunadamente, me parece que hay dos tipos de recursos en archivos exe y dll: recursos C y recursos .net. Es posible incrustar recursos de C en un dll de .net pero todavía no he resuelto cómo hacerlo.

Para responder a su pregunta, el protocolo res se documenta en here pero en realidad la construcción de la DLL o EXE es la parte difícil. El protocolo de res es bastante simple. La esencia básica es especificar res: //, seguir eso por la ruta al ejecutable o dll (solo el nombre dll si está en la ruta actual). Para los recursos de tipo HTML, siga eso con el nombre del archivo. Aquí hay un artículo reciente de MSDN que habla sobre algunos problemas conocidos con el protocolo res: http://support.microsoft.com/kb/220830.

Crear los recursos dll o exe puede ser un poco complicado. Para obtener resultados más fáciles, cree todos sus recursos de tipo HTML (incluso sus archivos .js, .png, .jpg). En lugar de nombrar sus recursos con un #identificador de recursos definido, los archivos de resolución modernos le permiten nombrar los archivos con una cadena. Hacer esto hará que tu vida sea mucho más fácil.

Consejo avanzado: Tener nombres de las carpetas en el nombre del recurso es complicado; No lo he pensado todavía. Creo que puede simular carpetas poniendo barras en el nombre del recurso, pero creo que el protocolo de res se confunde con las barras al pensar que la primera parte de la ruta es el tipo de recurso. Especificar explícitamente el tipo de recurso puede aliviar esto.

Sugerencia avanzada 2: Para la ruta, las versiones más nuevas de IE pueden tratar con el carácter '\', pero puede usar '% 5C' como sustituto de '\' si necesita especificar el valor absoluto o relativo ubicación del dll o exe.

Recursos adicionales:
MSDN Social: Webbrowser and res: protocol
DelphiDabbler: How to create and use HTML resource files

+0

este es el mejor respuesta, ahora soy consciente de la limitación del protocolo de res porque no puedo establecer el tipo de mime programáticamente para los archivos .mht – dns

1

Esta es la pequeña clase de ayuda y cómo lo llaman:

Como llamar

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

Clase auxiliar:

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

La manera más fácil, tal vez no la más segura o más sensata, es tener una variable de configuración que compone la página web básica, coloque sus propias etiquetas de marcador para REEMPLAZAR al transmitir las cadenas en paquetes. De esta forma, una vez que se completan las partes no dinámicas de la página web, solo necesita representar las porciones dinámicas para REEMPLAZAR en la cadena. Luego configure DoumentText = stringWebStream. Asegúrese de establecer AllowNavigation = True.

0

Sé que se ha pedido hace mucho tiempo, pero here's how IE interpreta la res: protocolo:

res: // sFile [/ sType]/SIA

sFile Ruta codificada por porcentaje y nombre de archivo del módulo que contiene el recurso.

sType opcional. Cadena o tipo de recurso numérico. Puede ser un recurso personalizado o uno de los tipos de recursos predefinidos que se reconocen mediante la función FindResource. Si se especifica un tipo de recurso numérico , el número del identificador debe seguir un carácter # . Si no se especifica este parámetro, el recurso predeterminado es RT_HTML o RT_FILE.

sID Cadena o identificador numérico del recurso. Si se especifica un identificador numérico, el número real del identificador, no el identificador , debe seguir un carácter #. Consulte el ejemplo para obtener más información sobre .

Cuestiones relacionadas