私はうまく機能する非常に激しいスレッドアプリケーションを持っています...しかし、再起動ボタンをクリックすると...コードをたどり、ビューモデルを破棄し、メインウィンドウを閉じます...したがって、ダイアログの結果を返し、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 が作成されたのと同じスレッドではないことを説明するにはどうすればよいでしょうか?
乾杯。