WPFネタですよと
Applicationの作成方法には以下の3通りがある
- Main関数のApplication.Run
- <Application StartupUri="Window1"/>
- <Application Startup="App_Startup"/>
Applicationの初期処理を行う場合には1か3を選ぶことになる。
1の書き方は
http://msdn2.microsoft.com/en-us/library/ms597011(VS.90).aspx
3の書き方は
http://msdn2.microsoft.com/en-us/library/system.windows.application.startup(VS.90).aspx
ただポイントはStartupはイベントだってこと。
このイベントの中でウィンドウを開かないと最初のウィンドウができない状態のためにメッセージポンプループに陥ります。
ダメな例1
private void App_Startup(object sender, StartupEventArgs e )
{
return;
}
もう1個ダメなパターンが2個ウィンドウを開く
ダメな例2
private void App_Startup(object sender, StartupEventArgs e )
{
LoginWindow lw = new LoginWindow();
if ( lw.ShowDialog() == false ) { return; }
MainWindow mw = new MainWindow();
mw.ShowDialog();
return;
}
このパターンだと、lwが閉じた段階でアプリケーションの終了ルーチンに流れてしまいます。
ということで、ログイン画面を挟む場合には
よい例1
private void App_Startup(object sender, StartupEventArgs e )
{
LoginWindow lw = new LoginWindow();
lw.ShowDialog();
}
LoginWindow.Login()
{
if ( this.IsLogin() )
{
this.Hide();
MainWindow mw = new MainWindow();
mw.ShowDialog();
}
}
またはアプリケーションの終了パターンを変更するShutdownModeを設定します。
http://msdn2.microsoft.com/en-us/library/system.windows.application.shutdownmode(VS.90).aspx
よい例2
private void App_Startup(object sender, StartupEventArgs e )
{
this.ShutdownMode = ShutdownMode.OnExplicitShutdown;
try
{
LoginWindow lw = new LoginWindow();
if ( lw.ShowDialog() == false ) { return; }
MainWindow mw = new MainWindow();
mw.ShowDialog();
}
finally { this.Shutdown(); }
}
メッセージポンプは厳然としてそこに存在します。
Startupイベントで何もせずに抜けると無限ループになりますが、そのタイミングでブレークすると
WindowsBase.dll!System.Windows.Threading.Dispatcher.GetMessage(ref System.Windows.Interop.MSG msg, System.IntPtr hwnd, int minMessage, int maxMessage) + 0x4f バイト
こんなところで止まります。
あきらかにメッセージループです。
いままでのWindowsFormsと違うWPFですが、あきらかに同じところもあるわけです。