2010-04-08 185 views
1

我有一个应用程序,在创建主窗口之前显示一个启动画面。如果用户在显示启动画面时关注了另一个应用程序,我想避免主窗口在创建时被盗。如何使用Window.ShowActivated = false与最大化窗口?

我的应用程序的启动是这样的:

private void Application_Startup(object sender, StartupEventArgs e) 
{ 
    SplashScreenService.Start(); 

    // Initializing stuff... 
    ... 

    // Ready to open the main window. 
    MainWindow mainWindow = MainWindow(); 
    mainWindow.ShowActivated = SplashScreenService.HasFocus(); 
    mainWindow.ShowDialog(); 
} 

为了防止越来越激活主窗口,我设置Window.ShowActivatedfalse,只有当闪屏已失去焦点。但是这会导致一个异常:

InvalidOperationException:当ShowActivated为false并且WindowState设置为Maximized时,无法显示窗口。

事实上,我的主窗口设置WindowStateMaximized(从以前的会话设置恢复)。我不明白为什么ShowActivated功能有这样的限制。我找不到有关此问题的任何文档。

我试图迫使WindowStateNormalShowActivated是假的,它阻止了异常,但它也激活窗口!也许改变窗口状态实际上会导致激活?

有没有一个技巧可以用来解决这个问题?我想在最大化状态下恢复主窗口,并且如果用户在启动画面期间已将注意力从我的应用程序中撤离,则主窗口不会从其他应用程序中窃取焦点。

回答

0

我也有这个问题。

我尝试的第一件事是在创建并显示启动画面后重新激活主窗口。这将激活返回到主窗口并工作,但它看起来不是很优雅。

一个更好的解决方案是不设置WindowState启动屏幕最大化,而不是手动最大限度的闪屏使用互操作,以覆盖整个屏幕和Windows Forms如下所述:

http://www.inveigledsoftware.com/2009/07/maximizing-a-wpf-window-with-windowstatenone/

+0

这是主最大化的窗口,而不是启动画面。 – ChrisF 2010-05-19 09:56:03

+0

对不起,我的误解;)这种技术仍然可以为你工作,只是不要设置主窗口的窗口状态并手动最大化它。 – 2010-05-19 11:20:59