오랫만의 WPF 포스팅입니다. :)
http://hoons.kr 에 올라온 질문에 대한 답변이기도 하고요.
WPF는 아주 쉬운 방법으로 기존의 Windows Forms 기반의 컨트롤들을 호스팅하고 사용할 수 있죠. 이 글에서는 WPF에서 Windows Forms 컨트롤 -여기에서는 WebBrowser-을 호스팅하고 제어하는 방법에 대해 간략하게 알아보겠습니다.
http://hoons.kr 에 올라온 질문에 대한 답변이기도 하고요.
WPF는 아주 쉬운 방법으로 기존의 Windows Forms 기반의 컨트롤들을 호스팅하고 사용할 수 있죠. 이 글에서는 WPF에서 Windows Forms 컨트롤 -여기에서는 WebBrowser-을 호스팅하고 제어하는 방법에 대해 간략하게 알아보겠습니다.
기반 지식
MSDN에서 이 토픽에 대해 친절하게 설명하고 있습니다. 이 글은 MSDN을 기반으로 하여 WebBrowser 컨트롤을 WPF 윈도우에 호스팅하는 예제를 알아보겠습니다.
우선 WPF와 Windows Forms 및 C# 프로그래밍에 대한 기초적인 지식이 필요합니다. 여기에서는 각 내용에 대해 충분히 알고 있다고 가정합니다.
Windows Forms 컨트롤을 호스팅하기
다음에 설명할 예제는 아래에서 다운받을 수 있습니다.
WindowsFormsHostSample.zip
참고
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
MSDN에서 이 토픽에 대해 친절하게 설명하고 있습니다. 이 글은 MSDN을 기반으로 하여 WebBrowser 컨트롤을 WPF 윈도우에 호스팅하는 예제를 알아보겠습니다.
우선 WPF와 Windows Forms 및 C# 프로그래밍에 대한 기초적인 지식이 필요합니다. 여기에서는 각 내용에 대해 충분히 알고 있다고 가정합니다.
Windows Forms 컨트롤을 호스팅하기
다음에 설명할 예제는 아래에서 다운받을 수 있습니다.

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 이동을 시험해볼 수 있는 다른 엘리먼트도 추가하였습니다.
4. Window1.xaml.cs의 Window1 클래스에 다음과 같이 WebBrowser 컨트롤과 상호작용 할 수 있는 간단한 코드를 추가합니다.
5. 프로젝트를 빌드하고 F5를 눌러 테스트해 봅니다. 다음과 같이 WebBrowser가 정상적으로 동작함을 알 수 있고, TextBox에 URL을 입력하고 [이동]버튼을 눌러보면 페이지 네비게이션이 됨을 확인할 수 있습니다.

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>
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());
}
{
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