2008-09-16 1 views
3

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

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

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

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

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

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

ответ

4

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

Встроенный веб-браузер может быть настроен не показывать регулярное контекстное меню: IsWebBrowserContextMenuEnabled = ложь – Peter

+0

OOI PATH_SEPARATOR уже определен в рамках - Path.AltDirectorySeparatorChar – Fraser

1

Я понял.

Я просто передать полный разрешенный URL каталога еха в 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

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

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

0

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

0

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

Просто вызвать статический метод как так:

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); 
    } 
} 
Смежные вопросы