¿Cómo hago referencia a un recurso local en HTML generado en WinForms control WebBrowser?

StackOverflow https://stackoverflow.com/questions/72103

Pregunta

Estoy usando un winforms control webbrowser para mostrar cierto contenido en una aplicación de formularios de windows.Estoy usando la propiedad DocumentText para escribir el código HTML generado.Esa parte está trabajando de forma espectacular.Ahora quiero usar algunas de las imágenes en el marcado.(También me gustaría usar vinculado CSS y JavaScript, sin embargo, que pueden ser resueltos sólo la incrustación de ella).

He estado buscando en google sobre el curso de varios días y parece que no puede encontrar una respuesta a la pregunta del título.

He intentado utilizar una referencia relativa:la aplicación exe está en el bin\debug.Las imágenes en vivo en el directorio "Imágenes" en la raíz del proyecto.Me he fijado que las imágenes se copian en el directorio de salida en la compilación, por lo que terminan en bin\debug\Imágenes*.Así que, a continuación, utilizar una referencia como esta "Imágenes..." pensando que va a ser relativa al exe.Sin embargo, cuando miro las propiedades de la imagen en el navegador incrustado ventana, veo la URL de la imagen a ser "acerca de:blankImages/*".Todo parece ser relativa a "about:blank" cuando HTML se escribe en el control.Carecen de un contexto de ubicación, que no puedo averiguar qué usar para una relación de recursos de archivos de referencia.

Me hurgó las propiedades del control para ver si hay una manera de configurar algo para solucionarlo.He creado una página html en blanco, y señaló que el navegador a través de "Navegar()" método, utilizando la plena ruta de acceso local para el archivo.Esto funcionó muy bien con el navegador de informes de los locales de "file:///..." ruta de acceso de la página en blanco.Luego me volvió a escribir para el navegador, esta vez utilizando el Documento.Write().De nuevo, el navegador ahora los informes de "about:blank", como la dirección URL.

Corto de escribir el HTML dinámico resultados a un archivo real, no hay otra forma de hacer referencia a un archivo de recursos?

Voy a intentar una última cosa:la construcción de absoluta rutas de acceso de archivo para las imágenes y la escritura de aquellos con el código HTML.Mi código HTML que se genera mediante una transformación XSL de un objeto serializado del XML por lo que deberá jugar con algunos XSL parámetros que se toman un poco de tiempo extra, ya que no estoy familiarizado con ellos.

¿Fue útil?

Solución

Aquí lo que hacemos, aunque debo mencionar que el uso de un navegador personalizado para quitar cosas tales como la capacidad de derecho-haga clic y ver el buen viejo IE menú contextual:

public class HtmlFormatter
{
    /// <summary>
    /// Indicator that this is a URI referencing the local
    /// file path.
    /// </summary>
    public static readonly string FILE_URL_PREFIX = 
        "file://";

    /// <summary>
    /// The path separator for HTML paths.
    /// </summary>
    public const string PATH_SEPARATOR = "/";
}


// We need to add the proper paths to each image source
// designation that match where they are being placed on disk.
String html = HtmlFormatter.ReplaceImagePath(
    myHtml, 
    HtmlFormatter.FILE_URL_PREFIX + ApplicationPath.FullAppPath + 
    HtmlFormatter.PATH_SEPARATOR);

Básicamente, usted necesita tener una ruta de la imagen que tiene un archivo de URI, por ejemplo,

<img src="file://ApplicationPath/images/myImage.gif">

Otros consejos

Lo tengo resuelto.

Acabo de pasar la completa resuelto url del directorio exe para la transformación XSL que contiene el resultado de HTML con las etiquetas de imagen:

XsltArgumentList lstArgs = new XsltArgumentList();
lstArgs.AddParam("absoluteRoot", string.Empty, Path.GetFullPath("."));

Luego me prefijo todas las imágenes con el valor de parámetro:

<img src="{$absoluteRoot}/Images/SilkIcons/comment_add.gif" align="middle" border="0" />

Terminé usando algo que es básicamente la misma que la de Ken sugerido.Sin embargo, en lugar de manualmente añadiendo el prefijo de archivo, he utilizado el UriBuilder de la clase para construir la URI completa con el "archivo" del protocolo.

Esto también resuelve un problema posterior cuando hemos probado la aplicación en un más realista ubicación, los Archivos de Programa.Los espacios fueron codificados, pero el sistema operativo no podía lidiar con los caracteres codificados cuando el archivo se hace referencia a la utilización de un estándar ruta de acceso del sistema (es decir,"C:\Program%20Files...").Usando el verdadero valor de URI (file:///C:/Archivos de Programa/...) trabajado.

Como alternativa, mantenga su estilo normal de los vínculos relativos, colocar el código HTML de la transformación de código y en lugar de incrustar un C# servidor web como este en el archivo exe, a continuación, seleccione su WebControl en la dirección URL interna, como localhost:8199/myapp/

Ken código faltaba un par de cosas que necesitaba para el trabajo.Yo he revisado, y creó un nuevo método que debe automatizar un poco las cosas.

Basta con llamar al método estático como así:

html = HtmlFormatter.ReplaceImagePathAuto(html);

y todos los enlaces en el código html de que coincida con file://ApplicationPath/ se intercambia con el directorio de trabajo actual.Si desea especificar una ubicación alternativa, el original método estático se incluye (además de los bits que faltaba).

public class HtmlFormatter
{

    public static readonly string FILE_URL_PREFIX = "file://";
    public static readonly string PATH_SEPARATOR = "/";
    public static String ReplaceImagePath(String html, String path)
    {
        return html.Replace("file://ApplicationPath/", path);
    }
    /// <summary>
    /// Replaces URLs matching file://ApplicationPath/... with Executable Path
    /// </summary>
    /// <param name="html"></param>
    /// <returns></returns>
    public static String ReplaceImagePathAuto(String html)
    {
        String executableName = System.Windows.Forms.Application.ExecutablePath;
        System.IO.FileInfo executableFileInfo = new System.IO.FileInfo(executableName);
        String executableDirectoryName = executableFileInfo.DirectoryName;
        String replaceWith = HtmlFormatter.FILE_URL_PREFIX
            + executableDirectoryName
            + HtmlFormatter.PATH_SEPARATOR;

        return ReplaceImagePath(html, replaceWith);
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top