最初に生成されたウィンドウがメインウィンドウ
<Application x:Class="SoundKeyboard2012.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" StartupUri="MainWindow.xaml"> <Application.Resources> </Application.Resources> </Application>
こう書いたら、MainWindow がメインウィンドウになると思うじゃないですか。けれど、WPF って「最初に生成されたウインドウがメインウィンドウになる」んだね。Windows型のメンバ変数をフィールドで初期化していた( public Window HogeWindow = new HogeWindow() )ので、デバッグ時の動作(MainWindow.xaml がメインウィンドウ)と、リリースバイナリの動作(HogeDialog.xamlがメインウィンドウ)が違っていて、ちょっと困った。
private void Application_Startup(object sender, StartupEventArgs e) { MainWindow = new MainWindow(); }
明示的にメインウィンドウを指定してあげれば問題ない。
StartupUri を宣言で設定してもプログラムで設定しても、対応する UI リソースは Startup イベントが処理されるまで読み込まれません。 したがって、Startup の処理時には、Windows プロパティまたは MainWindow プロパティからのウィンドウにアクセスできません。
Application.StartupUri プロパティ (System.Windows)
MainWindow には、AppDomain でインスタンス化される最初の Window オブジェクトへの参照が自動的に設定されます。
Application.MainWindow プロパティ (System.Windows)