web-dev-qa-db-ja.com

WPFアプリケーションのStartupUriを変更する方法

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を呼び出すと、メインウィンドウが期限切れのウィンドウに設定され、この後にシャットダウンされるようになります。

17
Akash Kava

XAMLでまだStartupUriが指定されていますか?その場合は、それを削除し、それが役立つかどうかを確認します。 MSDNソース

そうでない場合は、これに別の方法でアプローチする必要がある場合があります。ダイアログをスタートアップとして使用し、その時点から、選択した値に基づいて別のウィンドウを開きます。

6
Joel Cochran

Akashさん、まさにあなたと同じようにLoginDialogを実装しようとしてこの問題に遭遇しました。ダイアログにはバグはありませんが、動作は仕様によるものです。

バグではありません。アプリケーションのデフォルトのShutdownModeはOnLastWindowClosedであるため、最初のウィンドウが閉じられるとすぐに、アプリケーションはシャットダウンを開始します。 OnExplicitShutdownに変更すると機能しますが、シャットダウンを管理する必要があります。

この前のStackOverflowの質問を参照してください: WPF ShowDialogは2回目の呼び出しですぐにnullを返します

19
tofutim

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)

6
Alastair Pitts

OnStartup()で試してください:

StartupUri = new Uri("Forms/CustomerEntry.xaml", UriKind.Relative);
6
jug