0

私はうまく機能する非常に激しいスレッドアプリケーションを持っています...しかし、再起動ボタンをクリックすると...コードをたどり、ビューモデルを破棄し、メインウィンドウを閉じます...したがって、ダイアログの結果を返し、app.xamlに戻ります.cs。

これが私が再起動を実装した方法です...

base.OnStartup(e);

        // Register required assemblies.
        RegisterAssemblies();

        foreach (FolderType type in FolderType.GetValues())
        {
            if (!Directory.Exists(type.Value))
            {
                Directory.CreateDirectory(type.Value);
            }
        }

        bool? restart = true;
        ShutdownMode = System.Windows.ShutdownMode.OnExplicitShutdown;
        dynamic window;
        MainWindowViewModel viewModel;

        while (restart == true)
        {
            running = true;
            string[] files = Directory.GetFiles(FolderType.LASTCONFIGURATION.Value);
            lastConfiguration = string.Empty;

            if (files.Length != 0)
            {
                lastConfiguration = files[0];
            }

#if (!DEBUG)
            if (SystemParameters.PrimaryScreenHeight == 1080)
            {
                window = new MainWindowHD();
            }
            else
            {
                window = new MainWindow();
            }

            Mouse.OverrideCursor = Cursors.None;
#else
            window = new MainWindow();
#endif

            window.ShowInTaskbar = false;
            viewModel = new MainWindowViewModel(lastConfiguration, "saved_settings.xml", FolderType.CASES + "\\" + "case_configuration.xml");

            Application.Current.Dispatcher.BeginInvoke(new Action(() =>
                {
                    window.DataContext = viewModel;
                }
            ));

            restart = window.ShowDialog();
        }

        if (systemShutdown)
        {
            Process.Start("shutdown", "/s /t 0");
        }

        Shutdown(0);

これは再びループし、ウィンドウ オブジェクトとビューモデル オブジェクトをリセットしますが、他のすべてのクラスの Application.Current.MainWindow は、それを所有する別のスレッドについて不平を言います。((App)Application).Dispatcher.Invoke を置くことでこれでうまくいくと思いますが、再起動する前に必要がなかったので、そうしないことをお勧めします。

Application.Current.MainWindow が作成されたのと同じスレッドではないことを説明するにはどうすればよいでしょうか?

乾杯。

4

1 に答える 1

0

このプロパティは、アプリケーションで最初に作成されたMainWindowときにのみ設定されます。ウィンドウを再作成するときは、プロパティを手動でWindow更新する必要があります。MainWindow

Application.Currentまた、コードが のOnStartupメソッドのオーバーライドで実行されている場合は、使用する必要はありませんApplication

this.MainWindow = window = new MainWindow();
window.ShowInTaskbar = false;
viewModel = new MainWindowViewModel(...);
Dispatcher.BeginInvoke(new Action(() => window.DataContext = viewModel));
restart = window.ShowDialog();

もう 1 つのコメント: HD 画面の解像度が 1080p を超える場合があることを忘れないでください。これを考慮して小切手を更新する必要があります。

if (SystemParameters.PrimaryScreenHeight >= 1080)
于 2013-03-27T20:03:13.527 に答える