Как ссылаться на локальный ресурс в сгенерированном HTML в элементе управления WinForms WebBrowser? - PullRequest
3 голосов
/ 16 сентября 2008

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

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

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

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

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

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

Ответы [ 5 ]

5 голосов
/ 16 сентября 2008

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

Я понял это.

Я просто передаю полный разрешенный 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" />
0 голосов
/ 20 мая 2009

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

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

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);
    }
}
0 голосов
/ 08 ноября 2008

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

0 голосов
/ 16 октября 2008

Я закончил тем, что использовал то, что в основном совпадает с тем, что предложил Кен. Однако вместо ручного добавления префикса файла я использовал класс UriBuilder для создания полного URI с протоколом «file».

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

...