WinForms WebBrowser 컨트롤에서 생성된 HTML의 로컬 리소스를 어떻게 참조합니까?

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

문제

저는 winforms 웹 브라우저 컨트롤을 사용하여 Windows 양식 앱에 일부 콘텐츠를 표시하고 있습니다.생성된 HTML을 작성하기 위해 DocumentText 속성을 사용하고 있습니다.그 부분은 훌륭하게 작동하고 있습니다.이제 마크업에 일부 이미지를 사용하고 싶습니다.(나는 또한 링크된 CSS와 JavaScript를 사용하는 것을 선호하지만 단지 삽입만으로 문제를 해결할 수 있습니다.)

며칠 동안 인터넷 검색을 했는데 제목 질문에 대한 답을 찾을 수 없는 것 같습니다.

상대 참조를 사용해 보았습니다.앱 exe는 bin\debug에 있습니다.이미지는 프로젝트 루트의 "Images" 디렉터리에 있습니다.컴파일 시 출력 디렉터리에 이미지가 복사되도록 설정했으므로 해당 이미지는 bin\debug\Images*에 저장됩니다.그래서 저는 "Images..."와 같은 참조를 exe와 관련이 있다고 생각하여 사용합니다.그러나 내장된 브라우저 창에서 이미지 속성을 보면 이미지 URL이 "about:blankImages/*"로 표시됩니다.HTML이 컨트롤에 작성되면 모든 것이 "about:blank"에 상대적인 것 같습니다.위치 컨텍스트가 부족하여 상대 파일 리소스 참조에 무엇을 사용해야 할지 알 수 없습니다.

이 문제를 해결하기 위해 무언가를 설정할 수 있는 방법이 있는지 알아보기 위해 컨트롤의 속성을 살펴보았습니다.나는 빈 HTML 페이지를 생성하고 파일에 대한 전체 로컬 경로를 사용하여 "Navigate()" 메서드를 사용하여 브라우저에 해당 페이지를 지정했습니다.이것은 빈 페이지에 대한 로컬 "file:///..." 경로를 보고하는 브라우저에서 제대로 작동했습니다.그런 다음 이번에는 Document.Write()를 사용하여 브라우저에 다시 썼습니다.이제 브라우저는 "about:blank"를 URL로 보고합니다.

동적 HTML 결과를 실제 파일에 작성하는 것 외에는 파일 리소스를 참조할 수 있는 다른 방법이 없습니까?

마지막으로 한 가지를 시도해 보겠습니다.이미지에 대한 절대 파일 경로를 구성하고 이를 HTML에 작성합니다.내 HTML은 직렬화된 개체 XML의 XSL 변환을 사용하여 생성되므로 일부 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">

다른 팁

나는 그것을 알아 냈습니다.

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" />

나는 결국 Ken이 제안한 것과 기본적으로 동일한 것을 사용하게 되었습니다.그러나 파일 접두사를 수동으로 추가하는 대신 UriBuilder 클래스를 사용하여 "파일" 프로토콜로 전체 URI를 구축했습니다.

이는 보다 현실적인 위치인 프로그램 파일에서 앱을 테스트할 때 발생하는 후속 문제도 해결했습니다.공백이 인코딩되었지만 파일이 표준 시스템 경로(예:"C:\Program%20Files...").실제 URI 값(file:///C:/Program Files/...)을 사용하면 효과가 있었습니다.

또는 일반적인 스타일의 상대 링크를 유지하고 HTML 변환 코드를 삭제하고 대신 다음과 같은 C# 웹 서버를 포함하십시오. 이것 exe에서 WebControl을 localhost:8199/myapp/와 같은 내부 URL로 지정합니다.

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);
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top