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如果您的代码OnStartupApplication.

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

另一条评论:不要忘记高清屏幕的分辨率可能大于 1080p。您应该更新您的支票以说明这一点:

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