2010-12-08 4 views
9

내 WPF 클라이언트 응용 프로그램, 나는,WPF 용 웹 브라우저 컨트롤에 HTML을로드하려면 어떻게해야합니까?

this.myWebBrowser.NavigateToString("<html><body><p>test page</p></body></html>"); 

내가 가진 문제를 이런 식으로 HTML을로드 할 수 있습니다 사용자 정의 HTML 페이지를 구축하고있다 어떻게 HTML 이미지가있는 경우 나, WebBrowser 컨트롤에 사용자 정의 HTML을로드 할 수 및 그것의 CSS 파일?

어떻게 이미지와 CSS를 참조합니까? 이미지와 CSS를 응용 프로그램에 임베드 할 수 있습니까? 아니면 어딘가에 디렉토리에 있어야합니까?

도움 주셔서 감사합니다.

답변

0

다른 모든 HTML 페이지와 똑같이 할 수 있습니다. 이미지와 CSS는 다른 HTML 페이지와 마찬가지로 URL로 참조됩니다. 여기에는 마법이 없습니다.

+0

내 응용 프로그램은 HTML을 생성하고 있으며, URL에는 존재하지 않습니다. – Tony

+1

다른 모든 HTML 페이지와 마찬가지로 URL을 통해 이미지 또는 CSS를 참조해야합니다. 이미지가 삽입 된 HTML 페이지는 없습니다. –

+0

예, 그렇게 생각합니다. 이 모든 것을 통해 생각하셨습니까? 어쩌면 HTML 튜토리얼을 끝내고 읽을 시간인가? –

4

실제로 이미지가 삽입 된 HTML 페이지 같은 것이 있습니다.

data URI scheme을 사용하여 이미지와 CSS를 HTML 문자열 내에 포함 할 수 있습니다. 그러나 모든 버전의 IE가이를 지원하는 것은 아니며 WebBrowser 컨트롤은 실제로 IE입니다. 코드가 IE < 8 인 시스템에서 실행될 수있는 경우이 방법이 도움이되지 않습니다.

다른 옵션은 이미지와 CSS를 포함 된 리소스로 저장하고 임시 파일에 기록한 다음 HTML을 생성 할 때 임시 파일에 절대 URL을 삽입하는 것입니다.

+0

나는 임베디드를 시도하고 잘 작동했다. – Tony

+0

webbrowser 컨트롤은 항상 로컬 IE를 사용합니까, 아니면 PC에 ie6 만있는 경우에도 항상 작동하도록 내 응용 프로그램에 컴파일됩니까? – Tony

+0

나는 항상 로컬 IE를 사용한다고 확신한다. 그렇지 않으면 테스트를 위해 단일 컴퓨터에 여러 버전의 IE를 설치하는 것이 더 쉬울 것입니다. –

1

HTML을 생성하기 때문에 디스크의 폴더를 가리키는 file : /// url과 같이 제어 할 수있는 지점을 가리키는 base element을 생성하여 모든 스크립트/이미지의 기본 URL을 설정할 수 있습니다. 로컬 웹 서버가 수신 대기중인 localhost를 가리키는 URL (인터넷에 너무 많은 http 서버 샘플이 있으므로 여기서 세부 정보를 얻지 못함) 또는 www의 웹 사이트.

문자열로 이동하면 HTML은 about : blank와 동일한 interenet 영역에 렌더링됩니다. 클라이언트의 IE 보안 영역 설정에 따라 HTML이 특정 위치 (예 : 인터넷 영역에있는 경우 컴퓨터의 스크립트 파일)에있는 파일을로드 할 수있는 권한이 없을 수도 있습니다.

Mark of the Web을 사용하여 HTML 페이지의 인터넷 영역을 변경할 수 있습니다.

1

참조를 위해 나는이 질문에 비틀 거리고 Joel Mueller 대답을 사용했지만 이미지 경로를 분석하는 것을 자동화하기로 결정했습니다. 어쩌면 누군가 내 코드가 비슷한 해결책을 선보이는 데 유용 할 것입니다. 매우 거칠고 더러워 지지만 잘 수행하는 것 같습니다.

저는 C# 리소스를 사용하고 있습니다. html 파일 안에는 이미지 파일 이름 만 넣습니다. 또한 정상적인 브라우저에서 파일을 열어서 어떻게 보이는지 테스트 할 수 있습니다. 이 코드는 html 내의 filename과 동일한 이름의 자원을 자동으로 찾고 응용 프로그램 데이터 디렉토리 아래에 저장하고 경로를 대체합니다.

이미 저장 한 파일과 다른 경우 응용 프로그램이 파일을 덮어 쓰게됩니다. 개발을 위해 주로 필요 했었지만 실제로는 이러한 파일이 많지 않았으므로 여기서 성능 손실을 걱정하지 않았습니다. 이 검사를 생략하고 파일이 최신이라고 가정하면 성능이 향상됩니다.

Settings.Default.ApplicationId은 응용 프로그램 이름이있는 간단한 문자열이며 응용 프로그램 데이터 내의 디렉토리 이름에 사용됩니다.내 수업이 찾고 결국 방법은

:

class MyHtmlImageEmbedder 
    { 
     static protected string _appDataDirectory = 
      Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), 
       Settings.Default.ApplicationId); 

     static public string getHtml() 
     { 
      String apiHelp = Resources.html_file; 
      Regex regex = new Regex(@"src=\""(.*)\""", RegexOptions.IgnoreCase); 
      MatchCollection mc = regex.Matches(apiHelp); 
      foreach (Match m in mc) 
      { 
       string filename = m.Groups[1].Value; 
       Image image = Resources.ResourceManager.GetObject(Path.GetFileNameWithoutExtension(filename)) as Image; 
       if (image != null) 
       { 
        var path = getPathTo(Path.GetFileNameWithoutExtension(filename) + ".png", imageToPngByteArray(image)); 
        apiHelp = apiHelp.Replace(filename, path); 
       } 
      } 
      return apiHelp; 
     } 

     static public string getPathTo(string filename, byte[] contentBytes) 
     { 
      Directory.CreateDirectory(_appDataDirectory); 
      var path = Path.Combine(_appDataDirectory, filename); 
      if (!File.Exists(path) || !byteArrayCompare(contentBytes, File.ReadAllBytes(path))) 
      { 
       File.WriteAllBytes(path, contentBytes); 
      } 
      return path; 
     } 

     [DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)] 
     static extern int memcmp(byte[] b1, byte[] b2, long count); 

     public static bool byteArrayCompare(byte[] b1, byte[] b2) 
     { 
      // Validate buffers are the same length. 
      // This also ensures that the count does not exceed the length of either buffer. 
      return b1.Length == b2.Length && memcmp(b1, b2, b1.Length) == 0; 
     } 

     public static byte[] imageToPngByteArray(Image image) 
     { 
      MemoryStream ms = new MemoryStream(); 
      image.Save(ms, System.Drawing.Imaging.ImageFormat.Png); 
      return ms.ToArray(); 
     } 
    } 

가 byteArrayCompareFunction는 성능상의 이유로 memcmp는 사용주의,하지만 쉽게 간단한 비교 루프를 대체 할 수 있습니다하시기 바랍니다.

그러면 browser.NavigateToString(MyHtmlImageEmbedder.getHtml());으로 전화합니다.

0
<WebBrowser Height="200" Name="myWebBrowser"></WebBrowser> 
myWebBrowser.NavigateToString("EnterHtmlString"); 
+0

이 질문에 어떻게 대답합니까? 그는 이미'NavigateToString'을 사용하고 있으며,'EnterHtmlString '을 전달하면 css와 이미지 파일의 문제를 해결할 수 있을지 의심 스럽습니다. – Stephan

관련 문제