在启动屏幕关闭后将主窗口置于前面

hko*_*kon 8 wpf splash-screen

我遇到了自定义wpf启动画面实现的问题.问题是在加载完成并且应该显示MainWindow之后,它有时不会被带到前面,即Activate()调用失败.它可能发生1/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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我试过这个:

MainWindow = new Shell();
MainWindow.Topmost = true;
MainWindow.Show();
MainWindow.Activate();
MainWindow.Topmost = false;
Run Code Online (Sandbox Code Playgroud)

它似乎工作,谢谢你的所有建议

hko*_*kon 3

MainWindow = new Shell();
MainWindow.Topmost = true;
MainWindow.Show();
MainWindow.Activate();
MainWindow.Topmost = false;
Run Code Online (Sandbox Code Playgroud)