본문 바로가기

IT 살이/04. 기술 - 프로그래밍

WPF UserControl 베이스 클래스 만들기

Spring.NET의 컨테이너를 UI단에 적용하는 작업은 끝났다. 근데 정리할 시간이 없다. 7월부터 시작하는 UI단 프레임워크 개발 작업이 있다. 이것을 준비해야 하는 관계로 WPF를 좀 더 공부해야 한다. 그래서 정리 순서를 바꾸도록 했다. Spring.NET 컨테이너의 UI단 적용은 다음에 정리해야 할 것 같다.

 

흔히 기업용 애플리케이션을 제작할때는 윈폼 클래스 또는 사용자 정의 클래스들의 베이스 클래스를 만든다. 그래서 그곳에서 사용자 정보, 권한 정보들을 캐싱해 둔다. 현장의 개발자들은 그것을 상속해서 화면을 만든다.

달봉이도 이런 시나리오를 염두에 두고 WPF에서 제공하는 UserControl의 베이스를 하나 만들려고 했었다. 윈폼 시절의 UserControl을 생각해서 쉽게 될 줄 알았다. 근데, 이것 때문에 반나절을 고생했다.

다음은 WPF에서 UserControl의 상속이 지원이 안 되는  경우이다.

우선 Visual Studio의 솔루션 탐색기의 새 항목 추가 창을 통해서 UserControl 템플릿을 “Dalbong2ControlBase.xaml”이라는 이름으로 하나 추가한다.

그런 다음 동일한 방법으로 UserControl을 DerivedControl.xaml이라는 이름으로 추가한다.

그런 다음 DerivedControl.xaml의 코드 비하인드에서 DerivedControl 클래스의 베이스 클래스를 Dalbong2ControlBase로 수정한다.

빌드하면 에러가 발생한다.  구글링을 해 보고 수정을 반복하다 보면 만나게 되는 에러가 주로 다음 두 가지일 것이다.

이 에러 발생 원인을 설명하자면 XAML의 페이지 구조부터 컴파일 절차까지 설명해야 할 것 같다. 그러나 달봉이 시간이 없다. 지금 진행하고 있는 프로젝트가 WPF로 진행될 거라 빨리 프레임워크를 준비해야 한다.  이 에러의 원인만 정리한다.

WPF의 UserControl의 경우, UI가 있는 컨트롤 즉 XAML이 있는 UserControl은 자식 UserControl이 상속을 할 수 없다.

그러나 우리는 사용자 컨트롤의 베이스 클래스가 필요하다. 다음과 같은 방법을 사용할 수 있다.

사용자 컨트롤의 베이스 클래스로는 XAML이 없는 클래스를 사용하도록 한다.

다음 그림을 보자.

선택된 두 파일중에서 아래 것은 Visual Studio의 템플릿을 통해서 추가한 사용자 컨트롤이다. 이 녀석은 앞에서 얘기한 것처럼 베이스 클래스로 사용할 수 없다. UserControl의 베이스 클래스를 만들고 싶다면 순수한 C# 클래스 파일을 추가해서 다음처럼 UserControl을 상속받도록 해야 한다.

다음 코드를 보자.

    public class Dalbong2ControlBase : UserControl, IDalbong2Element

    {

    }

그런 다음 이 베이스 클래스 Dalbong2ControlBase는 다음처럼 사용할 수 있다.

먼저 코드 비하인드에서 베이스 클래스를 Dalbong2ControlBase로 수정한다.

 

    public partial class UserControl1 : Dalbong2.Win.Dalbong2ControlBase

    {

        public UserControl1()

        {

            InitializeComponent();

        }

    }

다음은 XAML 페이지로 간다.

붉은 색 부분을 추가해야 한다. Dalbon2.Win 네임스페이스에 있는 Dalbong2ControlBase를 사용자 컨트롤의 루트( 비쥬얼 컨테이너 )로 사용하겠다는 의미이다. 그리고 파란색 부분은 코드 비하인드의 현재 클래스를 나타낸다.

달봉이 고민

공통 정보는 베이스 클래스를 이렇게 작성해서 그곳에 넣어두면 된다지만,  UI 상속은 어떻게 해야 하는지 알 수 없다. 굳이 필요하다면 커스텀 컨트롤을 만들어서 사용할 수도 있겠다는 생각이지만,….그렇게까지 해야 하는 마음이 드는 것은 이전의 Windows Form 시절의 UserControl이 아쉽다는 생각이 들기 때문이다.