Wie verweisen ich eine lokale Ressource in generierten HTML-Code in WinForms-WebBrowser-Steuerelement?

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

Frage

Ich bin mit einem WinForms-WebBrowser-Steuerelement einige Inhalte in einer Windows Forms-Anwendung angezeigt werden soll. Ich bin mit der Documenttext-Eigenschaft des generierten HTML zu schreiben. Dieser Teil arbeitet spektakulär. Jetzt möchte ich einige Bilder im Markup verwenden. (Ich würde auch lieber verknüpfte CSS und JavaScript verwenden, aber die um ihn herum nur durch Einbettung gearbeitet werden kann.)

Ich habe den Verlauf von mehreren Tagen googeln über und kann nicht scheinen, eine Antwort auf die Titelfrage zu finden.

Ich habe versucht, eine relative Referenz verwendet: Die App exe ist in der bin \ debug. Die Bilder leben in der „Bilder“ im Stammverzeichnis des Projekts. Ich habe die Bilder auf das Ausgabeverzeichnis auf der Kompilierung kopiert werden, so dass sie am Ende * in ist \ debug \ Images auf. So verwende ich dann eine Referenz wie diese „Bilder ...“ Denken sie an die exe relativ sein. Allerdings, wenn ich an den Bildeigenschaften im eingebetteten Browser-Fenster schaue, sehe ich die Bild-URL zu sein „about: blankImages / *“. Alles scheint auf „about: blank“ relativ zu sein, wenn HTML in die Steuerung geschrieben wird. In Ermangelung eines Ortskontext, ich kann nicht herausfinden, was für eine relative Datei Ressource-Referenz zu verwenden.

Ich stocherte die Eigenschaften der Kontrolle zu sehen, ob es eine Möglichkeit, etwas zu setzen, ist dies zu beheben. Ich habe eine leere HTML-Seite und wies den Browser auf die „Navigate ()“ Methode verwenden, den vollständigen lokalen Pfad zur Datei. Das hat gut funktioniert mit dem Browser das lokale „file: /// ...“ reporting Weg auf die leere Seite. Dann wieder ich an den Browser geschrieben, diesmal document.write () verwenden. Auch hier nun der Browser meldet "about: blank". Als URL

Kurz von den dynamischen HTML-Ergebnisse zu einer echten Datei zu schreiben, gibt es keine andere Möglichkeit, eine Datei-Ressource zu verweisen?

Ich werde eine letzte Sache, um zu versuchen: Konstruieren absolute Dateipfade zu den Bildern und der zum Schreiben von HTML. Mein HTML erzeugt wird, unter Verwendung eines XSL-Transformation eines serialisierten XML-Objekt, damit ich mit einigen XSL Parametern muß spielen, die ein wenig mehr Zeit in Anspruch nehmen, wie ich mit ihnen nicht so vertraut bin.

War es hilfreich?

Lösung

Hier ist, was wir tun, obwohl ich erwähnen sollte, dass wir eine eigene Web-Browser verwenden, solche Dinge wie die Fähigkeit, um einen Rechtsklick zu entfernen und das gute alte IE-Kontextmenü finden Sie unter:

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

Grundsätzlich müssen Sie ein Bild Pfad haben, die eine Datei URI hat, z.B.

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

Andere Tipps

Ich habe es herausgefunden.

Ich gehe nur die komplette gelöst URL des exe-Verzeichnisses in dem XSL-Transformation, enthält die HTML-Ausgabe mit Image-Tags:

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

Dann alles, was ich als Präfix nur die Bilder mit dem Parameterwert:

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

ich am Ende mit etwas, das im Grunde ist das gleiche wie das, was Ken vorgeschlagen. Anstatt jedoch die Datei manuell Präfix anhängen, ich verwendet, um die UriBuilder Klasse die vollständige URI mit dem „Datei“ Protokoll zu bauen.

Dies löste auch ein nachfolgendes Problem, wenn wir die App in einer realistischeren Lage, Programme getestet. Die Räume wurden verschlüsselt, aber das Betriebssystem kann nicht mit den codierten Zeichen umgehen, wenn die Datei eines Standard-Systempfad verwiesen wurde unter Verwendung von (das heißt „C: \ Program% 20Files ...“). Mit dem wahren URI-Wert (file: /// C: / Programme / ...). Arbeitete

Alternativ halten Sie Ihren normalen Stil relative Links, löschen Sie den HTML-Code umzuwandeln und stattdessen eine C # Web-Server wie diese in Ihrer exe, dann WebControl auf Ihrer interne URL verweisen, wie localhost: 8199 / myapp /

Kens Code wurde ein paar Dinge fehlen, die es an die Arbeit benötigt wird. Ich habe es überarbeitet und eine neue Methode, die Dinge ein wenig automatisieren sollte.

Sie einfach die statische Methode aufrufen, wie so:

html = HtmlFormatter.ReplaceImagePathAuto(html);

und alle Links in dem HTML-Code, die Datei übereinstimmen: // ApplicationPath / werden mit dem aktuellen Arbeitsverzeichnis ausgetauscht werden. Wenn Sie einen anderen Speicherort angeben möchten, wird die ursprüngliche statische Methode enthalten (plus die Bits es fehlte).

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);
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top