如何在最大化窗口中使用Window.ShowActivated = false?

时间:2010-04-08 17:38:29

标签: wpf focus splash-screen windowstate

我有一个在创建主窗口之前显示启动画面的应用程序。如果用户在显示初始屏幕时聚焦了另一个应用程序,我想避免主窗口在创建焦点时窃取焦点。

我的应用程序的启动看起来像这样:

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.ShowActivated设置为false,仅当启动画面失去焦点时才会这样做。但这会导致异常:

  

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

确实,我的MainWindow将WindowState设置为Maximized(从以前的会话设置恢复)。我不明白为什么ShowActivated功能存在这样的限制。我找不到任何关于这个问题的文档。

WindowState为false时,我尝试强制NormalShowActivated,并且它会阻止异常,但它也会激活窗口!也许改变窗口状态实际上会导致激活?

我可以用它来解决这个问题吗?我希望以最大化状态恢复主窗口,如果用户在启动画面期间远离我的应用程序,则不要让主窗口远离其他应用程序。

1 个答案:

答案 0 :(得分:0)

我也有这个问题。

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

更好的解决方案是不要在启动屏幕上设置WindowState以使其最大化,而是使用互操作和Windows窗体手动最大化启动屏幕以覆盖整个屏幕,如下所述:

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