Come faccio a fare riferimento a una risorsa locale nell'HTML generato nel controllo WebBrowser WinForms?

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

Domanda

Sto utilizzando un controllo del browser web Winforms per visualizzare alcuni contenuti in un'app Windows Form.Sto utilizzando la proprietà DocumentText per scrivere l'HTML generato.Quella parte funziona in modo spettacolare.Ora voglio utilizzare alcune immagini nel markup.(Preferirei anche utilizzare CSS e JavaScript collegati, tuttavia, è possibile aggirare il problema semplicemente incorporandolo.)

Ho cercato su Google nel corso di diversi giorni e non riesco a trovare una risposta alla domanda del titolo.

Ho provato a utilizzare un riferimento relativo:l'exe dell'app si trova nel cestino\debug.Le immagini risiedono nella directory "Immagini" alla radice del progetto.Ho impostato le immagini da copiare nella directory di output durante la compilazione, in modo che finiscano in bin\debug\Images*.Quindi utilizzo un riferimento come questo "Immagini..." pensando che sarà relativo all'exe.Tuttavia, quando guardo le proprietà dell'immagine nella finestra del browser incorporato, vedo che l'URL dell'immagine è "about:blankImages/*".Tutto sembra essere relativo a "about:blank" quando l'HTML viene scritto nel controllo.In mancanza di un contesto di posizione, non riesco a capire cosa utilizzare per un riferimento relativo alla risorsa file.

Ho curiosato tra le proprietà del controllo per vedere se c'è un modo per impostare qualcosa per risolvere questo problema.Ho creato una pagina html vuota e l'ho indirizzata al browser utilizzando il metodo "Navigate()", utilizzando il percorso locale completo del file.Funzionava bene con il browser che riportava il percorso locale "file:///..." alla pagina vuota.Quindi ho scritto di nuovo nel browser, questa volta utilizzando Document.Write().Ancora una volta, il browser ora riporta "about:blank" come URL.

A parte scrivere i risultati HTML dinamici in un file reale, non esiste altro modo per fare riferimento a una risorsa di file?

proverò un'ultima cosa:costruendo percorsi di file assoluti per le immagini e scrivendoli nell'HTML.Il mio HTML viene generato utilizzando una trasformazione XSL dell'XML di un oggetto serializzato, quindi dovrò giocare con alcuni parametri XSL che richiederanno un po' di tempo extra poiché non li conosco molto bene.

È stato utile?

Soluzione

Ecco cosa facciamo, anche se dovrei menzionare che utilizziamo un browser Web personalizzato per rimuovere cose come la possibilità di fare clic con il pulsante destro del mouse e visualizzare il buon vecchio menu contestuale di IE:

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

Fondamentalmente, devi avere un percorso dell'immagine che abbia un URI di file, ad es.

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

Altri suggerimenti

Ho capito.

Passo semplicemente l'URL completo risolto della directory exe alla trasformazione XSL che contiene l'output HTML con tag immagine:

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

Quindi ho semplicemente preceduto tutte le immagini con il valore del parametro:

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

Alla fine ho usato qualcosa che è fondamentalmente uguale a quello suggerito da Ken.Tuttavia, invece di aggiungere manualmente il prefisso del file, ho utilizzato la classe UriBuilder per creare l'URI completo con il protocollo "file".

Ciò ha risolto anche un problema successivo quando abbiamo testato l'app in una posizione più realistica, Programmi.Gli spazi erano codificati, ma il sistema operativo non riusciva a gestire i caratteri codificati quando si faceva riferimento al file utilizzando un percorso di sistema standard (ad esempio"C:\Programmi%20File...").L'utilizzo del vero valore URI (file:///C:/Program Files/...) ha funzionato.

In alternativa, mantieni i collegamenti relativi allo stile normale, rilascia il codice di trasformazione HTML e incorpora invece un server Web C# come Questo nel tuo file eseguibile, quindi indirizza il tuo WebControl al tuo URL interno, come localhost:8199/myapp/

Al codice di Ken mancavano alcune cose necessarie per funzionare.L'ho rivisto e creato un nuovo metodo che dovrebbe automatizzare un po' le cose.

Basta chiamare il metodo statico in questo modo:

html = HtmlFormatter.ReplaceImagePathAuto(html);

e tutti i collegamenti nell'HTML che corrispondono a file://ApplicationPath/ verranno scambiati con la directory di lavoro corrente.Se desideri specificare una posizione alternativa, viene incluso il metodo statico originale (più i bit mancanti).

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);
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top