2013-06-26 66 views
1

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

运行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(); 

我该如何解决这个问题?

+0

您可能在窗口已经初始化后设置TopMost标志。在你的问题中显示代码的相关部分。 – NVM

+0

如果在显示窗口之前将TopMost设置为true,则窗口没有焦点。 –

+0

那么你的问题不应该是:如何把焦点放在最上面的窗口?你只是混淆了这个问题。 – NVM

回答

0

尝试uiThread.IsBackground = false;

你能的LoginWindow新实例发送到线程?

 uiThread.Start(new LoginWindow()); 

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

我想这会导致窗口在当前调度器上下文中呈现,并将呈现在前台。

+0

尝试过......不改变它。 –

+0

看到我的下一个猜测。 –

0

我会创建 ShellWindow之前创建登录窗口,只是 ConfigureContainer()年底前。

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

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