最初に生成されたウィンドウがメインウィンドウ

執筆日時:

<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)