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