Comment référencer une ressource locale dans le code HTML généré dans le contrôle WinForms WebBrowser?

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

Question

J'utilise un contrôle winforms webbrowser pour afficher du contenu dans une application Windows Forms. J'utilise la propriété DocumentText pour écrire le code HTML généré. Cette partie fonctionne de façon spectaculaire. Maintenant, je veux utiliser des images dans le balisage. (Je préférerais également utiliser des liens CSS et JavaScript, qui peuvent toutefois être contournés en les intégrant.)

Je suis sur Google depuis plusieurs jours et je n'arrive pas à trouver de réponse à la question du titre.

J'ai essayé d'utiliser une référence relative: le fichier exe de l'application se trouve dans le répertoire bin \ debug. Les images résident dans "Images". répertoire à la racine du projet. J'ai défini les images à copier dans le répertoire de sortie lors de la compilation, de sorte qu'elles se retrouvent dans bin \ debug \ Images *. J'utilise donc une référence comme celle-ci "Images ...". pensant que ce sera relatif à l'exe. Cependant, lorsque je regarde les propriétés de l'image dans la fenêtre du navigateur intégré, l'URL de l'image est "à propos de: blankImages / *". Tout semble être relatif à "à propos de: vide". lorsque HTML est écrit dans le contrôle. En l'absence d'un contexte d'emplacement, je ne vois pas quoi utiliser pour une référence de ressource de fichier relative.

J'ai parcouru les propriétés du contrôle pour voir s'il y avait un moyen de définir quelque chose pour y remédier. J'ai créé une page html vierge et ai dirigé le navigateur vers celle-ci à l'aide de l'option "Naviguer ()". méthode, en utilisant le chemin local complet du fichier. Le navigateur a signalé le fichier " fichier: ///..." chemin vers la page blanche. Ensuite, j'ai de nouveau écrit au navigateur, cette fois en utilisant Document.Write (). Encore une fois, le navigateur signale maintenant "à propos de: vide". en tant qu'URL.

À part l'écriture des résultats HTML dynamiques dans un fichier réel, n'y a-t-il pas d'autre moyen de référencer une ressource de fichier?

Je vais essayer une dernière chose: construire des chemins de fichiers absolus pour les images et les écrire au format HTML. Mon code HTML est généré à l'aide d'une transformation XSL du code XML d'un objet sérialisé. Je devrai donc utiliser certains paramètres XSL, ce qui prendra un peu plus de temps, car je ne les connais pas très bien.

Était-ce utile?

La solution

Voici ce que nous faisons, bien que je devrais mentionner que nous utilisons un navigateur Web personnalisé pour supprimer des éléments tels que la possibilité de cliquer avec le bouton droit de la souris et d'afficher le bon vieux menu contextuel d'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);

En principe, vous devez disposer d’un chemin d’image comportant un URI de fichier, par exemple.

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

Autres conseils

Je l'ai compris.

Je viens de passer l'URL résolue complète du répertoire exe à la transformation XSL contenant la sortie HTML avec les balises d'image:

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

Ensuite, je viens de préfixer toutes les images avec la valeur du paramètre:

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

J'ai fini par utiliser quelque chose qui est fondamentalement le même que celui suggéré par Ken. Cependant, au lieu d’ajouter manuellement le préfixe du fichier, j’ai utilisé la classe UriBuilder pour créer l’URI complet avec le fichier "fichier". protocole.

Cela a également résolu un problème ultérieur lorsque nous avons testé l'application dans un emplacement plus réaliste, Program Files. Les espaces étaient codés, mais le système d'exploitation ne pouvait pas gérer les caractères codés lorsque le fichier était référencé à l'aide d'un chemin système standard ("C: \ Program% 20Files ..."). Utiliser la vraie valeur URI (fichier: /// C: / Program Files / ...) a fonctionné.

Vous pouvez également conserver vos liens relatifs de style, supprimer le code de transformation HTML et intégrer un serveur Web C # tel que this dans votre exe, puis pointez votre WebControl vers votre URL interne, par exemple localhost: 8199 / myapp /

Le code de Ken manquait de quelques éléments nécessaires pour fonctionner. Je l'ai révisé et créé une nouvelle méthode qui devrait automatiser un peu les choses.

Appelez simplement la méthode statique comme suit:

html = HtmlFormatter.ReplaceImagePathAuto(html);

et tous les liens dans le code HTML qui correspondent au fichier: // ApplicationPath / seront échangés avec le répertoire de travail actuel. Si vous souhaitez spécifier un autre emplacement, la méthode statique d'origine est incluse (plus les bits qui lui manquaient).

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);
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top