오랫만의 WPF 포스팅입니다. :)
http://hoons.kr 에 올라온 질문에 대한 답변이기도 하고요.

WPF는 아주 쉬운 방법으로 기존의 Windows Forms 기반의 컨트롤들을 호스팅하고 사용할 수 있죠. 이 글에서는 WPF에서 Windows Forms 컨트롤 -여기에서는 WebBrowser-을 호스팅하고 제어하는 방법에 대해 간략하게 알아보겠습니다.

기반 지식
MSDN에서 이 토픽에 대해 친절하게 설명하고 있습니다. 이 글은 MSDN을 기반으로 하여 WebBrowser 컨트롤을 WPF 윈도우에 호스팅하는 예제를 알아보겠습니다.

우선 WPF와 Windows Forms 및 C# 프로그래밍에 대한 기초적인 지식이 필요합니다. 여기에서는 각 내용에 대해 충분히 알고 있다고 가정합니다.

Windows Forms 컨트롤을 호스팅하기

다음에 설명할 예제는 아래에서 다운받을 수 있습니다.
WindowsFormsHostSample.zip

Windows Forms Host Sample



Howto
1. WindowsFormsHostSample 이라는 이름으로 WPF Windows Application을 하나 생성합니다.

2. 솔루션 익스플로러의 References에서 마우스 오른쪽 버튼을 눌러 Add Reference를 선택하거나 메뉴의 Project->Add Reference를 선택하고 다음과 같이 [.Net] 탭에서 System.Windows.Forms와 WindowsFormsIntegration 어셈블리를 선택하고 [OK]를 누릅니다.


3. 다음과 같이 Window1.xaml의 루트 엘리먼트에 System.Windows.Forms의 네임스페이스를 추가하고 WindowsFormsHost엘리먼트와 그 하위의 WebBrowser 엘리먼트를 추가합니다. 예제에는 그 외에 URL 이동을 시험해볼 수 있는 다른 엘리먼트도 추가하였습니다.
XAML
<Window x:Class="WindowsFormsHostSample.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
    Title="Window1" Height="640" Width="480">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="20" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>

        <StackPanel Grid.Row="0" Orientation="Horizontal" Background="#FFCCCCCC">
            <TextBox x:Name="myUrl" Width="400" HorizontalAlignment="Left" />
            <Button x:Name="navigateUrl" Width="50" Content="" IsDefault="True" HorizontalAlignment="Left" />
        </StackPanel>

        <
WindowsFormsHost>
            <wf:WebBrowser x:Name="myBrowser" Url="http://google.com" />
        </WindowsFormsHost>
    </Grid>
</Window>

4. Window1.xaml.cs의 Window1 클래스에 다음과 같이 WebBrowser 컨트롤과 상호작용 할 수 있는 간단한 코드를 추가합니다.
C#
public Window1()
{
    InitializeComponent();
    myBrowser.DocumentCompleted +=
        new
System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(myBrowser_DocumentCompleted);
    navigateUrl.Click += new RoutedEventHandler(navigateUrl_Click);
}

// 이동 버튼을 눌렀을 때 해당 URL로 이동합니다.
void navigateUrl_Click(object sender, RoutedEventArgs e)
{

    try
    {
        myBrowser.Navigate(myUrl.Text);
    }
    catch (Exception ex)
    {
        MessageBox.Show("URL 이동에 예외 발생 : " + ex.Message.ToString());
    }
}

// 웹 문서의 로딩이 완료되었을 때 화면에 표시해줍니다.
void myBrowser_DocumentCompleted(object sender, System.Windows.Forms.WebBrowserDocumentCompletedEventArgs e)
{
    MessageBox.Show("문서 로딩이 완료되었습니다. : " + e.Url.ToString());
}

5. 프로젝트를 빌드하고 F5를 눌러 테스트해 봅니다. 다음과 같이 WebBrowser가 정상적으로 동작함을 알 수 있고, TextBox에 URL을 입력하고 [이동]버튼을 눌러보면 페이지 네비게이션이 됨을 확인할 수 있습니다.

참고

MSDN:
http://msdn2.microsoft.com/en-us/library/ms742875.aspx : Windows Forms Control 호스팅하기
http://msdn2.microsoft.com/en-us/library/system.windows.forms.integration.windowsformshost.aspx : WindowsFormsHost Class
Posted by gongdo

Submit comment.

  1. Favicon of http://pobeez.tistory.com BlogIcon pobeez 2007.06.05 11:40  comment URL  Edit/Remove  Submit comment.

    좋은글 잘 읽었습니다.

  2. Favicon of http://pobeez.egloos.com BlogIcon pobeez 2007.06.06 02:54  comment URL  Edit/Remove  Submit comment.

    죄송합니다.
    제가 블로깅에 미숙하여 본의 아니게 피해를 끼쳐 드렸습니다.

    항상 좋은 글 잘 읽고 있습니다.

    다음부터는 실수 없도록 하겠습니다.

    • Favicon of http://gongdo.tistory.com BlogIcon gongdo 2007.06.06 16:12  comment URL  Modify/Remove

      피해 본건 없어요 ^^;
      다만 제 의견과 블로그 운영 방침이 그렇다는거죠. 양해해 주세요 :)

  3. 신동현 2007.07.03 18:17  comment URL  Edit/Remove  Submit comment.

    안녕하세요 질문을 올려도 되는지 모르겠는데-_-;
    제가 2d control 을 3d 표면에 띄워볼려구
    TextBox 같은 것을
    제가 만든 3D Cube 에 맵핑 했는데요..
    이게 도무지 클릭이 되질 않아요-,-;;
    안에 text 메세지를 주면 내용이 보이긴 하는데
    그걸 클릭해서 뭔가 타이핑 할려고 하면
    도무지 커서가 뜨지를 않네요 ㅜㅜ
    혹시 방법을 아시는지 ㅠㅠ

    • Favicon of http://gongdo.tistory.com BlogIcon 공도 2007.07.03 21:20  comment URL  Modify/Remove

      3D에 대한 지식은 전무해서 오히려 제가 물어봐야할 정도네요;

      혹시 이런 방법이 가능하지 않을까 싶은데요
      TextBox는 2D 화면상의 안보이는 공간에 두고 3D 표면에는 TextBox에 대한 VisualBrush로 뿌려주는거죠.
      그리고 3D표면에 클릭이나 포커스가 오면 포커스를 실제 TextBox로 옮겨주는거죠.

      시도해보시고 피드백을 주세요^^;

  4. 신동현 2007.07.04 17:55  comment URL  Edit/Remove  Submit comment.

    음 공도님 말씀듣고 바로 시도해보았는데
    되네요-,-;;
    고민했던게 어이 없을 만큼 완벽하게 동작합니다.
    너무 감사드립니다 :D

    • Favicon of http://gongdo.tistory.com BlogIcon 공도 2007.07.04 18:38  comment URL  Modify/Remove

      이런걸 보고 소 뒷걸음치다 쥐잡은 격이라고 하죠;;;
      제게 3D는 안드로메다 저편에 있는 영역이라 당황했는데 다행이에요^^

      .NET 기술들의 가장 큰 특징은 역시 '경험의 재사용'에 있는 것 같아요. 서로 다른 구현 영역이더라도 아마 이렇게 되지 않을까...가 제대로 먹히면 너무 기분이 좋죠.

  5. Favicon of http://chaoskcuf.com BlogIcon chaoskcuf 2007.08.08 10:57  comment URL  Edit/Remove  Submit comment.

    혹시 Vista에서 사용해보셨나요?
    Webbrowser에 한글 입력이 안되는 문제가 있는데요.
    어떻게 해결방법이 없을까요?

    • Favicon of http://gongdo.tistory.com BlogIcon 공도 2007.08.08 17:20  comment URL  Modify/Remove

      네, VISTA에서 한글입력이 안된다는 이슈가 있었어요. 그런데 제가 VISTA를 안써서 해결책은 못찾았네요. :(
      해외 포럼을 검색해보시는게 좋을 것 같아요.

  6. outsider 2008.01.23 19:00  comment URL  Edit/Remove  Submit comment.

    안녕하세요 항상 공도님 포스트된 글을 성서처럼 받드는 WPF/E를 공부하는 학생입니다. ^^

    지금 제가 만들고 있는 프로그램에 위에 포스트된 글을 기반으로 만들고 있거든여

    WPF 윈도우 어플리케이션에 윈폼에 얹은 웹브라우저를 가져와서 WPF윈도우 어플리케이션에 보여주고

    있는데 글쎄 문제가 생겼습니다. 이 호스팅된 웹브라우저위에 WPF콘트롤들이 안올라가집니다. ㅜ.ㅜ

    어떻하면 좋죠 ???

    • Favicon of https://gongdosoft.com BlogIcon gongdo 2008.01.24 02:23 신고  comment URL  Modify/Remove

      지금 다시 보면 잘못된 정보도 상당히 많이 유포되어 있어요. ^^;
      아쉽게도 제가 찾아본 정보로는 그런 일은 불가능하네요.
      http://www.codeprof.com/dev-archive/174/153-119-1748863.shtm
      WindowsFormsHost를 사용한 영역은 아마도 WPF의 렌더링 시스템과 다른 방식을 사용하는 것 같아요. 그래서 알파 프로세싱 등이 들어갈 수 있는 WPF엘리먼트가 그 위로 표현될 수 없다..라고 이해했어요. 혹시 가능하게 하는 방법을 발견하시면 댓글을 주세요;

  7. outsider 2008.01.24 03:27  comment URL  Edit/Remove  Submit comment.

    예^^ 꼭 그 문제를 해결하게 되면 알려드리겠습니다.^^

  8. outsider 2008.01.24 14:20  comment URL  Edit/Remove  Submit comment.

    그럼 혹시 WinowsFormsHost를 이용하지 않고 HTML문서, web 브라우저를 WPF윈도우 어플리케이션에 띄울수 있는 방법이 있을까여???

    • Favicon of http://gongdosoft.com BlogIcon 공도 2008.01.24 15:37  comment URL  Modify/Remove

      혹시나 VisualBrush를 이용하면 되지 않을까 했는데 그렇게는 안되는군요. 그리고 된다고 해도 VisualBrush는 단지 렌더링을 할 뿐, 인터랙션을 하는 건 아니니까 의미가 없겠고요.

      반대로, WinForm에서 WPF 컨트롤을 올리는 방법이 있긴한데 이 경우에도 잘 될지는 의문이기도 하고 썩 좋은 방법이 아닐 것 같아요.

      결국, 아직까지는 방법이 없을 것 같은데요. 뭐 누군가 멋진 사람이 WPF용 웹브라우저 컨트롤을 만들지도 모를일이죠.

      마지막으로, 메신저에서 얘기했듯이 구현하시려는 서비스는 웹브라우저를 올리는 지저분한 방법보다는 Live를 통해 직접 데이터를 연동하는 것이 훨씬 좋은 방법일거라고 생각해요.

  9. Favicon of http://rkttu.com BlogIcon 남정현 2008.01.27 14:27  comment URL  Edit/Remove  Submit comment.

    웹 브라우저 이야기가 나와서 말입니다만... 문서를 편집할 수 있는 WPF 기반의 위지윅 에디터 컨트롤이 있다거나 이를 대치할 방법이 있는지도 궁금하네요. 리치 에디트는 충분히 시험해보았습니다만 원하는 수준이 못되서요.

    • Favicon of http://gongdosoft.com BlogIcon 공도 2008.01.27 21:28  comment URL  Modify/Remove

      저도 WPF쪽은 딱히 정보를 찾아보고 있지 않아서 잘 모르겠네요.
      물론 WPF는 실버라이트에 비해 텍스트 렌더링 능력이 좋겠지만 실버라이트는 확실히 대량의 텍스트를 표현하기엔 무리가 따르는 것 같아요.