3

Windows フォーム アプリにコンテンツを表示するために、winforms webbrowser コントロールを使用しています。DocumentText プロパティを使用して、生成された HTML を記述しています。その部分は見事に機能しています。ここで、マークアップでいくつかの画像を使用したいと考えています。(リンクされた CSS と JavaScript も使用したいと思いますが、埋め込むだけで回避できます。)

私は数日間グーグルで検索してきましたが、タイトルの質問に対する答えが見つからないようです.

相対参照を使用してみました: アプリの exe は bin\debug にあります。イメージは、プロジェクトのルートにある "Images" ディレクトリにあります。コンパイル時にイメージを出力ディレクトリにコピーするように設定したので、最終的には bin\debug\Images* になります。したがって、この「画像...」のような参照を使用して、exeに関連すると考えています。しかし、埋め込みブラウザ ウィンドウで画像のプロパティを見ると、画像の URL が「about:blankImages/*」になっていることがわかります。HTML がコントロールに書き込まれると、すべてが「about:blank」に関連しているように見えます。場所のコンテキストがないため、相対ファイル リソースの参照に何を使用すればよいかわかりません。

これを修正するために何かを設定する方法があるかどうかを確認するために、コントロールのプロパティを調べました。空白の html ページを作成し、ファイルへの完全なローカル パスを使用して、"Navigate()" メソッドを使用してブラウザをそのページに向けました。これは、空のページへのローカル「file:///...」パスを報告するブラウザーで正常に機能しました。次に、今度は Document.Write() を使用して、再びブラウザーに書き込みました。繰り返しますが、ブラウザは URL として「about:blank」を報告します。

動的 HTML の結果を実際のファイルに書き込む以外に、ファイル リソースを参照する方法はありませんか?

最後に、画像への絶対ファイル パスを作成し、それらを HTML に書き込みます。私の HTML は、シリアル化されたオブジェクトの XML の XSL 変換を使用して生成されているため、いくつかの XSL パラメータをいじる必要があります。

4

5 に答える 5

5

これが私たちの仕事ですが、カスタムWebブラウザーを使用して、右クリックして古き良き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);

基本的に、ファイルURIを持つ画像パスが必要です。

<img src="file://ApplicationPath/images/myImage.gif">
于 2008-09-16T13:43:23.410 に答える
1

私はそれを理解しました。

exe ディレクトリの完全な解決済み URL を、イメージ タグ付きの HTML 出力を含む XSL 変換に渡すだけです。

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

次に、すべての画像にパラメーター値をプレフィックスとして付けました。

<img src="{$absoluteRoot}/Images/SilkIcons/comment_add.gif" align="middle" border="0" />
于 2008-09-16T14:06:58.380 に答える
0

または、通常のスタイルの相対リンクを保持し、HTML 変換コードをドロップして、代わりにこのような C# Web サーバーを exe に埋め込み、WebControl を localhost:8199/myapp/ のような内部 URL に向けます。

于 2008-11-07T22:29:11.170 に答える
0

ケンが提案したものと基本的に同じものを使用することになりました。ただし、ファイル プレフィックスを手動で追加する代わりに、UriBuilder クラスを使用して、"file" プロトコルで完全な URI を作成しました。

これにより、より現実的な場所である Program Files でアプリをテストしたときの問題も解決されました。スペースはエンコードされましたが、ファイルが標準のシステム パス (つまり、「C:\Program%20Files...」) を使用して参照された場合、OS はエンコードされた文字を処理できませんでした。真の URI 値 (file:///C:/Program Files/...) を使用すると機能しました。

于 2008-10-16T12:10:02.890 に答える
0

Ken のコードには、機能するために必要ないくつかのものが欠けていました。私はそれを修正し、物事を少し自動化する新しいメソッドを作成しました。

次のように静的メソッドを呼び出すだけです。

html = HtmlFormatter.ReplaceImagePathAuto(html);

file://ApplicationPath/ に一致する html 内のすべてのリンクは、現在の作業ディレクトリと交換されます。別の場所を指定する場合は、元の静的メソッドが含まれます (欠落していたビットも含まれます)。

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);
    }
}
于 2009-05-20T09:12:58.003 に答える