Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在后台线程上访问Caliburn.Micro应用程序创建的GUI窗口?_C#_Wpf_Multithreading_Mvvm_Caliburn.micro - Fatal编程技术网

C# 在后台线程上访问Caliburn.Micro应用程序创建的GUI窗口?

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(() => {

我有一个caliburn.micro WPF应用程序,我将从F#启动它,并调用以下函数:

            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线程访问它,它总是空的。不管怎样,它看起来像是一个线程问题(需要等待一段时间才能初始化)。现在我有一个问题,试图从另一个线程获得它,但这是另一个主题。谢谢