Как я могу использовать 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.ShowActivated на false, только если заставка потеряла фокус. Но это вызывает исключение:

InvalidOperationException: невозможно отобразить окно, если ShowActivated имеет значение false, а для WindowState установлено значение Maximized.

Действительно, мой MainWindow устанавливает WindowState в Maximized (восстановлено из настроек предыдущего сеанса). Я не понимаю, почему есть такое ограничение с функцией ShowActivated. Я не смог найти никакой документации по этой проблеме.

Я попытался принудительно перевести WindowState в Normal, когда ShowActivated имеет значение false, и это предотвращает исключение, но также активирует окно! Может быть, изменение состояния окна на самом деле вызывает активацию?

Есть ли трюк, который я могу использовать, чтобы обойти это? Я хочу восстановить свое главное окно в развернутом состоянии и не позволять главному окну отвлекать внимание от других приложений, если пользователь сфокусировался на моем приложении во время заставки.


person Anthony Brien    schedule 08.04.2010    source источник


Ответы (1)


У меня тоже была эта проблема.

Первое, что я попробовал, это повторно активировать главное окно после создания и отображения заставки. Это вернуло активацию в главное окно и сработало, но выглядело не очень элегантно.

Лучшее решение — не устанавливать WindowState на экране-заставке для максимизации, а вручную максимизировать экран-заставку, чтобы покрыть весь экран, используя взаимодействие и Windows Forms, как описано здесь:

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

person Ashley Davis    schedule 19.05.2010
comment
Максимизировано главное окно, а не заставка. - person ChrisF; 19.05.2010
comment
Извините, мое недопонимание ;) Этот метод все еще может работать для вас, просто не устанавливайте состояние окна главного окна и вручную максимизируйте его. - person Ashley Davis; 19.05.2010