2

メイン ウィンドウを作成する前にスプラッシュ スクリーンが表示されるアプリケーションがあります。スプラッシュ画面が表示されている間にユーザーが別のアプリケーションにフォーカスした場合、メインウィンドウが作成されたときにフォーカスを盗むのを避けたいです。

私のアプリケーションの起動は次のようになります。

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 に設定されている場合、ウィンドウを表示できません。

実際、私の MainWindow は(以前のセッション設定から復元された)WindowStateに設定します。Maximized機能にこのような制限がある理由がわかりませんShowActivated。この問題に関するドキュメントは見つかりませんでした。

When is falseを強制しようとしWindowStateましNormalShowActivatedが、例外は防止されますが、ウィンドウもアクティブになります! ウィンドウの状態を変更すると、実際にアクティベーションが発生するのでしょうか?

これを回避するために使用できるトリックはありますか? メイン ウィンドウを最大化された状態に戻したいのですが、スプラッシュ スクリーン中にユーザーがアプリからフォーカスを外した場合に、メイン ウィンドウが他のアプリケーションからフォーカスを奪わないようにしたいと考えています。

4

1 に答える 1

0

私もこの問題を抱えていました。

最初に試したのは、スプラッシュ スクリーンを作成して表示した後、メイン ウィンドウを再度アクティブにすることでした。これにより、アクティブ化がメイン ウィンドウに戻り、機能しましたが、あまり洗練されていませんでした。

より良い解決策は、スプラッシュ スクリーンを最大化するように設定WindowStateするのではなく、手動でスプラッシュ スクリーンを最大化して、相互運用機能と Windows フォームを使用して画面全体をカバーすることです。

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

于 2010-05-19T09:37:04.170 に答える