App.csを変更し、コードビハインドからWPF XAMLファイルをロードしようとしていますが、正常に機能していません。
StartupUriとして設定しようとしても起動しない場合でも、プログラムはこの後に終了します。
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
LoginDialog dlg = new LoginDialog();
if (dlg.ShowDialog() != true)
return;
switch (dlg.ChoiceApp) {
case ChoiceApp.CustomerEntry:
StartupUri = new Uri("/MyApp;component/Forms/CustomerEntry.xaml",
UriKind.Relative);
break;
case ChoiceApp.VendorEntry:
StartupUri = new Uri("/MyApp;component/Forms/VendorEntry.xaml",
UriKind.Relative);
break;
}
}
}
トレースを行ったところ、LoginDialogは正しく機能し、値が正しく返されますが、 "StartupUri"の設定は機能しません。
AppのDoStartupメソッドがOnStartupの後に呼び出されることを逆アセンブリでチェックしたので、技術的にはStartupUriをロードする必要がありますが、ロードしません。App.xamlで起動URIがまったく定義されていません。
注:確認済みのバグ
ShowDialogはApplication.MainWindowを設定し、ダイアログが終了するとnullに設定されることに気付きました。この設定のため、OnStartupまたはStartupイベントでモーダルダイアログを呼び出した後、StartupUriは機能しません。
無効なURIなどのエラーや例外はありません。
このメソッドは、StartupイベントまたはOnStartupでDialogBoxが呼び出されなくても機能します。このメソッドでshowdialogを呼び出すと、メインウィンドウが期限切れのウィンドウに設定され、この後にシャットダウンされるようになります。
XAMLでまだStartupUriが指定されていますか?その場合は、それを削除し、それが役立つかどうかを確認します。 MSDNソース
そうでない場合は、これに別の方法でアプローチする必要がある場合があります。ダイアログをスタートアップとして使用し、その時点から、選択した値に基づいて別のウィンドウを開きます。
Akashさん、まさにあなたと同じようにLoginDialogを実装しようとしてこの問題に遭遇しました。ダイアログにはバグはありませんが、動作は仕様によるものです。
バグではありません。アプリケーションのデフォルトのShutdownModeはOnLastWindowClosedであるため、最初のウィンドウが閉じられるとすぐに、アプリケーションはシャットダウンを開始します。 OnExplicitShutdownに変更すると機能しますが、シャットダウンを管理する必要があります。
この前のStackOverflowの質問を参照してください: WPF ShowDialogは2回目の呼び出しですぐにnullを返します
onStartup()メソッドをオーバーライドする代わりに、代わりにイベントにフックします。
xAML
<Application x:Class="SOTestWPF.App"
xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
Startup="Application_Startup">
<Application.Resources>
</Application.Resources>
</Application>
背後のコードで:
private void Application_Startup(object sender, StartupEventArgs e)
{
var rnd = new Random();
if (rnd.NextDouble() > 0.5)
StartupUri = new Uri("/SOTestWPF;component/Window1.xaml", UriKind.Relative);
else
StartupUri = new Uri("/SOTestWPF;component/Window2.xaml", UriKind.Relative);
}
これは私のテストケースであり、正しく動作することを確認しました(ランダムに:D)
OnStartup()で試してください:
StartupUri = new Uri("Forms/CustomerEntry.xaml", UriKind.Relative);