WPF 외부 프로젝트의 사용자 정의 컨트롤 가져오는 방법
😢상황
- WPF 프로젝트에서 다른 프로젝트에 정의된 사용자 정의 컨트롤을 사용하고자 함
- XAML에 컨트롤 태그를 추가했지만 인식되지 않거나 디자이너에서 오류 발생
- 외부 프로젝트의 컨트롤을 어떻게 불러오는지 구조를 잘 몰라서 막힘
🛠️해결법
전제 조건
- A 프로젝트: 사용자 정의 컨트롤이 정의된 프로젝트 (예:
MyControlsProject
) - B 프로젝트: 컨트롤을 사용하려는 메인 프로젝트 (예:
MainAppProject
) - 둘 다 WPF Application 또는 WPF Class Library 형태여야 함
1. 프로젝트 참조 추가
B 프로젝트에서 A 프로젝트를 참조합니다.
- 솔루션 탐색기 → B 프로젝트 우클릭 → 추가 → 프로젝트 참조
프로젝트 > MyControlsProject
선택
2. XAML에서 네임스페이스 등록
xmlns:ctrl="clr-namespace:MyControlsNamespace;assembly=MyControlsProject"
MyControlsNamespace
= 사용자 컨트롤 클래스가 정의된 네임스페이스MyControlsProject
= 컨트롤이 포함된 프로젝트의 어셈블리 이름
전체 예시
<Window x:Class="MainApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ctrl="clr-namespace:MyControlsLibrary.Controls;assembly=MyControlsLibrary">
<Grid>
<ctrl:MyCustomControl />
</Grid>
</Window>
3. 코드에서 동적 생성할 때
using MyControlsLibrary.Controls;
...
var myControl = new MyCustomControl();
myControl.Width = 200;
MainGrid.Children.Add(myControl);
4. 자주 발생하는 실수
문제 | 원인 |
---|---|
컨트롤이 인식되지 않음 | xmlns 에 네임스페이스나 어셈블리 이름이 잘못됨 |
디자이너 오류 발생 | 빌드가 되지 않았거나 순환 참조(Circular Reference) 문제 |
런타임 예외 | 컨트롤 내에 사용하는 리소스 또는 DLL 누락 |
보너스 팁: Resource Dictionary 공유
외부 프로젝트의 스타일이나 리소스를 함께 사용하려면 다음처럼 등록:
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/MyControlsProject;component/Themes/Generic.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
✅정리: 왜 이게 효과 있었는가?
- WPF는 다른 프로젝트의 컨트롤을 사용하려면 반드시 참조와 xmlns 등록을 명확히 해주어야 함
- 프로젝트와 네임스페이스가 일치하지 않거나, 어셈블리 이름을 틀리면 컨트롤 인식 불가
- 코드와 XAML 모두에서 유연하게 외부 컨트롤을 활용할 수 있음
👉 구조화된 UI 개발을 위해 사용자 정의 컨트롤을 분리했다면,
이런 방식으로 외부 프로젝트의 컨트롤을 제대로 연결해보세요!