Visual Studio의 WPF 응용프로그램 템플릿으로 프로젝트를 생성하면 App.xaml 과 MainWindow.xaml 파일이 생성된다.
App.xaml 파일의 Build Action 프로퍼티값이 ApplicationDefinition으로 설정되어 있기 때문에 WPF는 빌드 작업을 통해 App.xaml 의 클래스가 응용프로그램 클래스인 지 알아내고, Main() 함수를 생성하고 App의 클래스 인스턴스를 생성하며 Run()메소드를 호출한다. 일반적으로 반복되는 작업이므로 템플릿으로 자동으로 코드가 추가되는 것이다.
이 상태에서 빌드 및 실행하면 MainWindow가 출력이 되는데, 내가 원하는 것은 MainWindow가 출력되기 전에 다른 윈도우를 출력 시키고, 해당 윈도우의 리턴값에 따라 응용프로그램이 종료되거나 MainWindow를 출력시키는 것이다.
WinForm에서는 Program.cs 파일에서 이런 작업을 해주었는데 WPF에서는 어디서 해줘야 할까??
WPF가 자동으로 Main()함수를 만들고, Application 인스턴스를 만든다. 또한 Application 인스턴스의 Run() 메소드를 실행 시킨다. Run() 메소드를 실행 시키면 Startup 이벤트가 발생하며 OnStartup 이벤트 핸들러가 호출되게 된다. 따라서 OnStartup 이벤트 핸들러에서 메인 윈도우를 출력하게 된다. 그래!! 그렇다면 여기서 MainWindow 호출 전에 처리할 작업을 작성하면 되는 것이다.
StartupUri 어트리뷰트를 지우고, Startup 어트리뷰트를 지정한다. 즉, Startup 이벤트의 이벤트 핸들러를 등록한다.
Startup 이벤트 핸들러에서 원하는 작업을 넣어주면 된다. MainWindow 를 사용하기 전에 WndDbLogin 윈도우를 먼저 사용하였으며 그 리턴값에 따라 MainWindow의 출력 유무가 결정된다.
Remarks
몇가지 주의해야 할 점이 있다.
Application 응용프로그램 인스턴스는 제일 처음으로 생성되는 윈도우를 MainWindow 프로퍼티에 설정한다.
즉, 최상위 윈도우로 설정하게 되는데 위 코드에서 WndDbLogin 을 먼저 생성하게 되면 이 윈도우가 MainWindow가 되므로 최상위 윈도우로 사용할 윈도우를 먼저 생성 및 MainWindow 프로퍼티에 설정해주다.
응용프로그램은 보통 하나의 주 윈도우를 사용하며 주 윈도우가 종료되면 응용프로그램도 종료되게 된다.
응용프로그램의 종료 모드는 ShutdownMode 프로퍼티를 통해 설정할 수 있으며 기본값으로는 OnLastWindowClose 열거값으로 설정되어 있다. 이 값을 OnMainWindowClose 열거값으로 설정해주자.