Сообщите SplashScreen, что MainWindow является его родительским окном. Когда дочернее окно теряет фокус, его родитель получает фокус. Если родителя нет, менеджер окон решает.
splashScreen.Show (MainWindow);
EDIT
Я только что узнал, что есть класс SplashScreen . Похоже, вы используете этот класс, а не просто обычную форму, как я предполагал.
Итак, я только что сделал простое приложение WPF с SplashScreen, и для меня упомянутый эффект не произошел. Главное окно не потеряло фокус.
Я бы предложил вам комментировать части кода инициализации вашего приложения до тех пор, пока мигание не прекратится. Тогда у вас есть отправная точка для дальнейших исследований, почему фокус потерян.
EDIT2
Не зная вашего кода, я пытался воспроизвести это явление, и это было не слишком сложно. Что бы я ни пытался, изменение фокуса всегда происходило, когда главное окно уже было показано и имело фокус.
Итак, лучшее решение, которое я вижу, - это вручную показать главное окно после вызова метода Close () на заставке:
Удалите StartupUri из App.xaml
Показать SplashScreen после запуска приложения и инициализации ресурсов. После (в настоящее время фиксированной) задержки закройте SplashScreen и покажите главное окно:
public partial class App : Application
{
const int FADEOUT_DELAY = 2000;
SplashScreen splash = new SplashScreen("splash.jpg");
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
splash.Show(false, true);
var worker = new BackgroundWorker();
worker.DoWork += (sender, ea) =>
{
Thread.Sleep(1000);
splash.Close(new TimeSpan(0, 0, 0, 0, FADEOUT_DELAY));
// you could reduce the delay and show the main window with a nice transition
Thread.Sleep(FADEOUT_DELAY);
Dispatcher.BeginInvoke(new Action(() => MainWindow.Show()));
};
worker.RunWorkerAsync();
MainWindow = new MainWindow();
// do more initialization
}
}