C# 在后台线程上访问Caliburn.Micro应用程序创建的GUI窗口?
我有一个caliburn.micro WPF应用程序,我将从F#启动它,并调用以下函数:C# 在后台线程上访问Caliburn.Micro应用程序创建的GUI窗口?,c#,wpf,multithreading,mvvm,caliburn.micro,C#,Wpf,Multithreading,Mvvm,Caliburn.micro,我有一个caliburn.micro WPF应用程序,我将从F#启动它,并调用以下函数: public void LaunchGUI() { if (_guiWindow == null) { var windowThread = new Thread(() => {
public void LaunchGUI()
{
if (_guiWindow == null)
{
var windowThread = new Thread(() =>
{
try
{
// Create our context, and install it:
SynchronizationContext.SetSynchronizationContext(new DispatcherSynchronizationContext(Dispatcher.CurrentDispatcher));
AppBootstrapper.Initialize();
var app = new App();
app.InitializeComponent();
//guiWindow = app.MainWindow;
//// When the window closes, shut down the dispatcher
//guiWindow.Closed += (s, e) =>
// Dispatcher.CurrentDispatcher.BeginInvokeShutdown(DispatcherPriority.Background);
//guiWindow.Closed += (s, e) =>
// guiWindow = null;
//guiWindow.WindowState = WindowState.Minimized;
//guiWindow.Show();
//guiWindow.WindowState = WindowState.Normal;
//guiWindow.Activate();
// Start the Dispatcher Processing
Dispatcher.Run();
}
catch (Exception e)
{
LogMessage("error in gui thread: " + e);
//guiWindow.Close();
//guiWindow = null;
}
});
windowThread.SetApartmentState(ApartmentState.STA);
windowThread.IsBackground = true;
windowThread.Start();
}
else
{
_guiWindow.WindowState = WindowState.Minimized;
_guiWindow.Show();
_guiWindow.WindowState = WindowState.Normal;
_guiWindow.Activate();
}
}
}
问题是我需要有一个对主窗口的引用,这样我就可以跟踪它是否仍然打开,等等,但是它总是空的(因此注释的代码)。注意:当运行“普通”MVVM应用程序并以类似的方式初始化它时,此功能可以正常工作:
public void ShowGui()
{
if (guiWindow == null)
{
var windowThread = new Thread(() =>
{
try
{
// Create our context, and install it:
SynchronizationContext.SetSynchronizationContext(
new DispatcherSynchronizationContext(
Dispatcher.CurrentDispatcher));
guiWindow = new MainWindow();
// When the window closes, shut down the dispatcher
guiWindow.Closed += (s, e) =>
Dispatcher.CurrentDispatcher.BeginInvokeShutdown(DispatcherPriority.Background);
guiWindow.Closed += (s, e) =>
guiWindow = null;
guiWindow.WindowState = WindowState.Minimized;
guiWindow.Show();
guiWindow.WindowState = WindowState.Normal;
guiWindow.Activate();
// Start the Dispatcher Processing
Dispatcher.Run();
}
catch (Exception)
{
try
{
guiWindow.Close();
}
catch (Exception)
{
throw;
}
guiWindow = null;
}
});
windowThread.SetApartmentState(ApartmentState.STA);
windowThread.IsBackground = true;
windowThread.Start();
}
else
{
guiWindow.WindowState = WindowState.Minimized;
guiWindow.Show();
guiWindow.WindowState = WindowState.Normal;
guiWindow.Activate();
}
}
我的问题是如何访问创建的主窗口?//您可以像这样获得应用程序主窗口:
var _guiWindow=Application.Current.MainWindow作为主窗口 //应用程序主窗口如下所示:
var _guiWindow=Application.Current.MainWindow作为主窗口 不管我是从主线程还是从我在这里创建的GUI线程访问它,它总是空的。不管怎样,它看起来像是一个线程问题(需要等待一段时间才能初始化)。现在我有一个问题,试图从另一个线程获得它,但这是另一个主题。谢谢。不管我是从主线程还是从我在这里创建的GUI线程访问它,它总是空的。不管怎样,它看起来像是一个线程问题(需要等待一段时间才能初始化)。现在我有一个问题,试图从另一个线程获得它,但这是另一个主题。谢谢