1

我正在使用 Prism 的 MefBootstrapper 来初始化我的 WPF 应用程序,作为此过程的一部分,正在初始化 Shell 窗口。

运行 MefBootstrapper 的 Run() 方法后,我将显示一个连接到服务器的登录窗口,如果连接成功,则会加载 Shell(从主 UI 线程)。

此登录窗口在一个新的专用 UI​​ 线程上运行,以免在此过程中冻结进度条(连接到服务器,尤其是 Shell 加载)。

不幸的是,登录窗口没有显示在顶部并且没有聚焦(即使我使用的是:Activate(), TopMost=true, Focus())。

            //UI mode - a new UI thread is initialized 
            var uiThread = new Thread(() =>
            {
                var loginWindow = new LoginWindow();

                loginWindow.Show();
                loginWindow.Activate();
                loginWindow.Topmost = true;  
                loginWindow.Topmost = false; 
                loginWindow.Focus();        

                System.Windows.Threading.Dispatcher.Run();
            });
            uiThread.SetApartmentState(ApartmentState.STA);
            uiThread.IsBackground = true;
            uiThread.Start();

我该如何解决这个问题?

4

2 回答 2

0

尝试uiThread.IsBackground = false;

您可以将新实例发送LoginWindow到线程吗?

        uiThread.Start(new LoginWindow());

然后使用 Thread 委托中的 loginWindow 参数来Show.

我猜这会导致窗口在当前调度程序上下文中呈现,并将其呈现在前台。

于 2013-06-26T14:24:03.393 回答
0

我会在创建ShellWindow之前创建loginWindow,就在ConfigureContainer()结束之前。

这样您就不会在您的区域中不必要地创建视图 - 视图模型。

请注意,在显示ShellWindow之前不要关闭窗口(即在成功登录时将其隐藏),否则应用程序也会关闭,这一点很重要。

于 2016-04-13T14:00:25.947 回答