Как мне ссылаться на локальный ресурс в сгенерированном HTML-файле в WinForms WebBrowser control?

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

Вопрос

Я использую веб-браузерный элемент управления winforms для отображения некоторого содержимого в приложении Windows forms.Я использую свойство DocumentText для записи сгенерированного HTML-кода.Эта часть работает великолепно.Теперь я хочу использовать некоторые изображения в разметке.(Однако я также предпочел бы использовать связанные CSS и JavaScript, с которыми можно справиться, просто внедрив их.)

Я гуглил в течение нескольких дней и, похоже, не могу найти ответа на заглавный вопрос.

Я попробовал использовать относительную ссылку:исполняемый файл приложения находится в папке bin\debug.Изображения находятся в каталоге "Images" в корневом каталоге проекта.Я настроил копирование изображений в выходной каталог при компиляции, чтобы они попадали в bin\debug\Images *.Поэтому я затем использую ссылку, подобную этой "Images ...", думая, что она будет относиться к exe.Однако, когда я просматриваю свойства изображения во встроенном окне браузера, я вижу, что URL-адрес изображения должен быть "about: blankImages /*".Кажется, что все относительно "about: blank", когда HTML записывается в элемент управления.Не имея контекста местоположения, я не могу понять, что использовать для ссылки на относительный файловый ресурс.

Я покопался в свойствах элемента управления, чтобы посмотреть, есть ли способ установить что-нибудь, чтобы исправить это.Я создал пустую html-страницу и указал браузеру на нее с помощью метода "Navigate()", используя полный локальный путь к файлу.Это прекрасно сработало, когда браузер сообщил локальный путь "file: ///..." к пустой странице.Затем я снова написал в браузер, на этот раз используя Document .Write().Опять же, браузер теперь сообщает "about: blank" в качестве URL-адреса.

Кроме записи динамических результатов HTML в реальный файл, нет ли другого способа сослаться на файловый ресурс?

Я собираюсь попробовать еще кое-что напоследок:построение абсолютных путей к файлам к изображениям и запись их в HTML.Мой HTML генерируется с использованием XSL-преобразования XML сериализованного объекта, поэтому мне нужно будет поиграть с некоторыми параметрами XSL, что займет немного больше времени, поскольку я с ними не очень знаком.

Это было полезно?

Решение

Вот что мы делаем, хотя я должен упомянуть, что мы используем пользовательский веб-браузер, чтобы удалить такие вещи, как возможность щелкнуть правой кнопкой мыши и увидеть старое доброе контекстное меню 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">

Другие советы

Я во всем разобрался.

Я просто передаю полный разрешенный URL-адрес каталога exe в XSL-преобразование, которое содержит вывод HTML с тегами изображений:

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

Затем я просто добавил ко всем изображениям значение параметра:

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

В итоге я использовал то, что в основном совпадает с тем, что предложил Кен.Однако вместо того, чтобы вручную добавлять префикс file, я использовал класс UriBuilder для создания полного URI с помощью протокола "file".

Это также решило последующую проблему, когда мы тестировали приложение в более реалистичном месте - Program Files.Пробелы были закодированы, но ОС не смогла обработать закодированные символы, когда на файл ссылались с использованием стандартного системного пути (т.е."C:\Program%20Files...").Использование истинного значения URI (файл: ///C:/Program Files/...) сработало.

В качестве альтернативы, сохраните относительные ссылки в обычном стиле, удалите код преобразования HTML и вместо этого внедрите веб-сервер C #, например это в вашем EXE-файле укажите WebControl на свой внутренний URL-адрес, например localhost: 8199 / myapp/

В коде Кена отсутствовало несколько вещей, которые были необходимы для его работы.Я пересмотрел его и создал новый метод, который должен немного автоматизировать работу.

Просто вызовите статический метод следующим образом:

html = HtmlFormatter.ReplaceImagePathAuto(html);

и все ссылки в html, которые соответствуют файлу://ApplicationPath/, будут заменены текущим рабочим каталогом.Если вы хотите указать альтернативное местоположение, включается исходный статический метод (плюс те биты, которых в нем не хватало).

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);
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top