У меня возникла проблема с пользовательской реализацией экрана-заставки wpf. Проблема в том, что после завершения загрузки и отображения MainWindow, иногда это не так.вынесен на передний план, т.е. вызов Activate () не выполняется. Такое бывает раз в 10 раз. Приложение работает под управлением Windows7 / 64.
Вот имплантация (полный исходный код образец )
public partial class App : Application
{
private Splash _splash;
private SplashVM _viewModel;
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
// starts splash in separate GUI thread
StartSplash();
// continues on loading main application in main gui thread
LoadMainAppFakeSteps(1000, 3);
// tells splash screen to start shutting down
Stop();
// Creates mainwindow for application
// The problem is that the mainwindow sometimes fails to activate,
// even when user has not touched mouse or keyboard (i.e has not given any other programs or components focus)
MainWindow = new Shell();
MainWindow.Show();
MainWindow.Activate();
}
private void StartSplash()
{
_viewModel = new SplashVM();
var thread = new Thread(SplashThread);
thread.SetApartmentState(ApartmentState.STA);
thread.IsBackground = true;
thread.Start(_viewModel);
}
private void SplashThread(object vm)
{
_splash = new Splash();
_splash.DataContext = vm;
_splash.Show();
System.Windows.Threading.Dispatcher.Run();
_splash = null;
_viewModel = null;
}
private void LoadMainAppFakeSteps(int stepDelayMs, int numSteps)
{
for (int i = 1; i <= numSteps; i++)
{
_viewModel.Text = i.ToString();
Thread.Sleep(stepDelayMs);
}
}
private void Stop()
{
if (_splash == null) throw new InvalidOperationException("Not showing splash screen");
_splash.Dispatcher.BeginInvokeShutdown(DispatcherPriority.Normal);
}
}
Я пробовал это:
MainWindow = new Shell();
MainWindow.Topmost = true;
MainWindow.Show();
MainWindow.Activate();
MainWindow.Topmost = false;
, и, похоже, это сработало, спасибо всем вашим предложениям