Como faço para fazer referência a um local de recursos em HTML gerado em WinForms controle WebBrowser?

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

Pergunta

Eu estou usando uma winforms controle webbrowser para exibir algum conteúdo em um windows forms aplicativo.Eu estou usando a propriedade DocumentText para escrever o HTML gerado.Essa parte é trabalhar de maneira espetacular.Agora eu quero usar algumas imagens na marcação.(Eu também prefiro usar vinculada CSS e JavaScript, no entanto, que pode ser contornado por apenas incorporar.)

Eu tenho sido pesquisando sobre o curso de vários dias e não consigo encontrar uma resposta para a pergunta do título.

Eu tentei usar uma referência relativa:o aplicativo exe está na pasta bin\debug.As imagens ao vivo no "Imagens" no diretório raiz do projeto.Eu tenho as imagens a serem copiados para o diretório de saída em compilar, assim que acabar no bin\debug\Imagens*.Então eu, em seguida, utilize uma referência de como este "Imagens..." pensando que vai ser em relação à exe.No entanto, quando eu olhar para as propriedades da imagem no navegador incorporado janela, eu vejo o URL da imagem a ser "sobre:blankImages/*".Tudo parece ser em relação à "sobre:em branco" quando HTML é escrito para o controle.A falta de um local de contexto, eu não consigo descobrir o que usar para um parente recurso de arquivo de referência.

Eu coloquei cerca de propriedades do controle para ver se há uma maneira de definir algo para corrigir isso.Eu criei uma página html em branco, e apontou o navegador-lo usando o "Navegar()" método, usando o caminho local para o arquivo.Isso funcionou bem com o navegador de relatório local "file:///..." o caminho para a página em branco.Então eu novamente escreveu para o navegador, desta vez usando o Documento.Write().Novamente, o browser agora relatórios "sobre:em branco" como URL.

Curto de escrever o HTML dinâmico resultados para um arquivo real, não existe outra maneira de fazer referência a um arquivo de recurso?

Eu vou tentar uma última coisa:a construção de absoluta caminhos de arquivo para as imagens e a escrita desses para o HTML.Minha HTML é gerado usando uma transformação XSL de um objeto serializado do XML para que eu vou precisar de jogar com alguns XSL parâmetros que vai demorar um pouco de tempo extra como eu não sou tão familiarizado com eles.

Foi útil?

Solução

Aqui está o que fazer, apesar de que eu deveria mencionar que estamos a usar um navegador da web personalizado para remover tais coisas como a capacidade de clique com o botão direito do mouse e ver o bom e velho IE menu de contexto:

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);

Basicamente, você precisa de ter uma imagem do caminho que tem um URI de arquivo, exemplo:

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

Outras dicas

Eu tenho que descobri.

Acabei de passar o completo resolvido url do diretório exe para a transformação XSL que contém a saída HTML com tags de imagem:

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

Então eu só o prefixo todas as imagens com o valor do parâmetro:

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

Eu acabei usando algo que é basicamente a mesma que Ken sugerido.No entanto, em vez de manualmente, acrescentando o prefixo do arquivo, eu usei o UriBuilder de classe para construir a completa URI com o "arquivo" do protocolo.

Isso também resolveu um subsequentes problema quando testamos o aplicativo em um ambiente mais realista de localização, os Arquivos de Programa.Os espaços foi codificado, mas o sistema operacional não conseguia lidar com os caracteres codificados, quando o arquivo foi referenciado usando um padrão de caminho de sistema (i.e."C:\Program%20Files...").Utilizando o verdadeiro valor URI (file:///C:/Arquivos de programas/...) trabalhou.

Em alternativa, manter o seu estilo normal links relativos, largar o HTML transformação de código e, em vez de incorporar um C# servidor web como este em seu exe e, em seguida, apontar o seu WebControl em sua URL interna, como localhost:8199/myapp/

Ken código foi falta de algumas coisas de que precisava para trabalhar.Eu já revisou, e criou um novo método que deve automatizar um pouco as coisas.

Basta chamar o método estático assim:

html = HtmlFormatter.ReplaceImagePathAuto(html);

e todos os links no html que correspondem file://ApplicationPath/ vai ser trocado com o diretório de trabalho atual.Se você deseja especificar um local alternativo, o original método estático é incluída (mais bits que estava em falta).

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top