Neutral Scent

App developments & Gadgets

WPFアプリの起動時にLogonウインドウを挿入する

Visual Studioで作成したWPF Windows Applicationは、App.xamlが自動的に作成されてWindow1.xamlを自動的に呼び出すようになってます。

< Application x:Class="BootSequenceDemo.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    StartupUri="Window1.xaml"
    >
    
         
    

StartupUriプロパティに指定するだけ、便利なもんです。
でも、例えばユーザー認証が必要なアプリなどの場合、メインウインドウが表示される前にLogonウインドウを出したかったりするわけです。でも、Application.MainWindowとかはメインウインドウにしておきたい。
なので、StartupUriを使わないパターンを一つ作ってみました。
StartupUriプロパティを削ってから、以下のようなコードをApp.xaml.csに追加してください。

	public partial class App : System.Windows.Application
	{
		public App(): base()
		{
			this.Startup += new StartupEventHandler(App_Startup);
		}

		void App_Startup(object sender, StartupEventArgs e)
		{
			this.MainWindow = new Window1();
			LogonWindow logon = new LogonWindow();
			bool? fLogon = logon.ShowDialog();
			if (fLogon != null && fLogon == true)
			{
				this.MainWindow.Show();
			}
			else
				this.Shutdown();
		}
	}

LogonWindow(Window派生クラス)の終了時のDialogResultがtrueだとWindow1を表示、falseだとアプリケーションを終了します。
(WPFになって、DialogResultやShowDialog()の戻り値がbool?になったのはなんでなんですかね? 非常に使いにくいです)
MainWindowをLogonWindowの前に入れてやることが重要です。この順番でないと、LogonWindowを勝手にMainWindowにしてしまうのか、ShowDialogのあとそのままアプリが終了してしまいます。

      • -

追記:
↑のMainWindowの設定順序ですが、絶対ではないようです。順序が入れ替わってもちゃんと動くケースもあるようで、もう少しこのあたりのトライが必要そうです。まぁ、とりあえずこの手順では動くということで参考までに。