Winform에서 WPF Control을 사용하는 방법입니다. .NetFramework 때는 도구상자에서 WPF 상호 운용성 / ElementHost 를 사용해서 WPF를 사용할 수 있었는데 .NET으로 업그레이드되면서 없어진 것 같습니다. Visual Studio버전 때문일 수도 있습니다. 현재 사용하는 Visual Studio 2022 Community / .NET6.0 환경에서 Winform 내에 WPF UserConrol을 사용하는 방법입니다.
✅ ElementHost
사내 프로젝트 중 Winform으로 만들어진 기존 프로젝트에 WPF로 개발한 것을 연동해야합니다. Winform으로 만들어진 것을 WPF로 컨버전하려니 시간이 너무 많이 소요될 것 같아 찾아보니 ElementHost라는 컨트롤을 사용하면 Winform에서도 WPF를 사용할 수 있습니다. .NET6.0 기반이며 MS에서 제공해주는 샘플코드로 테스트해보려고 했으나 제대로 동작하지 않는 것 같아 참고하여 만들었습니다.
Winform 프로젝트를 생성합니다.
생성한 뒤 프로젝트 속성에서
Windows Presentation Foundation (WPF) 항목을 체크합니다.
이제 WPF 컨트롤을 사용할 수 있습니다.
WPF
프로젝트에 WPF 사용자 정의 컨트롤을 추가합니다.
테스트 용도의 컨트롤을 만듭니다. TextBlock과 TextBox를 한 개씩 추가했습니다.
<UserControl x:Class="WinFormsApp1.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WinFormsApp1"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<Grid Background="White">
<TextBlock Text="aaaaaaaaaaaaaaaaa"/>
<TextBox Margin="0,54,0,0"/>
</Grid>
</UserControl>
Winform
Form1.cs 의 디자인화면을 엽니다.
Panel을 한개 추가합니다.
F7을 눌러서 에디터창으로 전환합니다.
public partial class Form1 : Form
{
private ElementHost _ctrlHost;
private UserControl1 _wpfControl;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
_ctrlHost = new ElementHost { Dock = DockStyle.Fill };
panel1.Controls.Add(_ctrlHost);
_wpfControl = new UserControl1();
_wpfControl.InitializeComponent();
_ctrlHost.Child = _wpfControl;
}
}
UserControl1이 WPF로 생성한 사용자 정의 컨트롤입니다.
ElementHost를 통해 WPF UserControl사용이 가능합니다. 실행하면 Panel 영역에 WPF컨트롤이 나타납니다.
실행
도움이 되셨다면 커피 한 잔~!
✅ ElementHost - 끝
참고사이트
https://github.com/microsoft/WPF-Samples/tree/master