19

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」の設定は機能しません。

リバースアセンブリで、OnStartupの後にAppのDoStartupメソッドが呼び出されることを確認したため、技術的にはStartupUriを読み込む必要がありますが、App.xamlではstartupuriがまったく定義されていません。

注:バグが確認されました

ShowDialogがApplication.MainWindowを設定し、ダイアログが終了するとnullに戻すことに気付きました。この設定のため、OnStartupまたはStartupイベントでモーダルダイアログを呼び出した後、StartupUriは機能しません。

無効なURIなどに関するエラーや例外はありません。

このメソッドは、StartupイベントまたはOnStartupでDialogBoxが呼び出されなくても機能します。このメソッドでshowdialogを呼び出すと、メインウィンドウが期限切れのウィンドウに設定され、この後にシャットダウンするようなものになると思います。

4

4 に答える 4

20

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

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

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

于 2010-05-13T00:41:30.160 に答える
8

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)

于 2009-12-22T11:52:41.550 に答える
7

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

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

于 2009-12-22T19:56:59.910 に答える
6

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

StartupUri = new Uri("Forms/CustomerEntry.xaml", UriKind.Relative);
于 2012-07-25T12:16:05.580 に答える