1 분 소요

😢상황

  • 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 개발을 위해 사용자 정의 컨트롤을 분리했다면,
이런 방식으로 외부 프로젝트의 컨트롤을 제대로 연결해보세요!