Как мне ссылаться на локальный ресурс в сгенерированном HTML-файле в WinForms WebBrowser control?
-
09-06-2019 - |
Вопрос
Я использую веб-браузерный элемент управления 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);
}
}