Exemple #1
0
            public void Show(SplashScreen splashScreen, Func <SplashScreen, UserControl> splashFactory, WindowLogic windowLogic)
            {
                if (splashFactory == null)
                {
                    return;
                }
                var splash  = splashFactory(splashScreen);
                var service = new PopupService();

                popup = service.Show(PopupService.PopupSize.FullScreen, splash);
                windowLogic.ActivateWindow(WindowLogic.ActivateWindowSources.SplashScreen, this);
            }
        private async void StartupOrchestratorAsync(IActivatedEventArgs e, StartKind kind)
        {
            DebugWrite($"kind:{kind} previous:{e.PreviousExecutionState}");

            if (OriginalActivatedArgs == null)
            {
                OriginalActivatedArgs = e;

                // if resume tries to launch, don't continue on
                // StartupOrchestratorAsync will be called twice
                if (OriginalActivatedArgs == null)
                {
                    OnResuming(this, null, AppExecutionState.Terminated);
                    return;
                }
            }

            // is the kind really right?
            if (kind == StartKind.Launch && CurrentStateHistory.ContainsValue(BootstrapperStates.Launched))
            {
                kind = StartKind.Activate;
            }
            else if (kind == StartKind.Launch && e.PreviousExecutionState == ApplicationExecutionState.Running)
            {
                kind = StartKind.Activate;
            }
            else if (kind == StartKind.Activate && e.PreviousExecutionState != ApplicationExecutionState.Running)
            {
                kind = StartKind.Launch;
            }

            // handle activate
            if (kind == StartKind.Activate)
            {
                // never activate until launch has completed
                while (!CurrentStateHistory.ContainsValue(BootstrapperStates.Launched))
                {
                    await Task.Delay(10);
                }
                await OnStartAsync(kind, e);

                CurrentState = BootstrapperStates.Started;

                WindowLogic.ActivateWindow(ActivateWindowSources.Activating, SplashLogic);
                CurrentState = BootstrapperStates.Activated;
            }

            // handle first-time launch
            else if (kind == StartKind.Launch)
            {
                SplashLogic.Show(e.SplashScreen, this);

                // do some one-time things
                SetupKeyboardListeners();
                SetupLifecycleListeners();
                SetupSystemListeners();
                SetupCustomTitleBar();

                // default Unspecified extended session
                await ExtendedSessionService.StartAsync();

                // OnInitializeAsync
                await OnInitializeAsync(e);

                CurrentState = BootstrapperStates.Initialized;

                // if there no pre-existing root then generate root
                if (SplashLogic.Splashing || Window.Current.Content == null)
                {
                    Window.Current.Content = CreateRootElement(e);
                }

                // okay, now handle launch
                bool restored    = false;
                var  IsPrelaunch = (e as LaunchActivatedEventArgs)?.PrelaunchActivated ?? false;
                switch (e.PreviousExecutionState)
                {
                case ApplicationExecutionState.Suspended:
                case ApplicationExecutionState.Terminated:
                    OnResuming(this, null, IsPrelaunch ? AppExecutionState.Prelaunch : AppExecutionState.Terminated);
                    if (AutoRestoreAfterTerminated)
                    {
                        restored = await LifecycleLogic.AutoRestoreAsync(e as ILaunchActivatedEventArgs, NavigationService);

                        CurrentState = BootstrapperStates.Restored;
                    }
                    break;
                }

                // handle if pre-launch (no UI)
                if (IsPrelaunch)
                {
                    var runOnStartAsync = false;
                    await OnPrelaunchAsync(e, out runOnStartAsync);

                    CurrentState = BootstrapperStates.Prelaunched;
                    if (!runOnStartAsync)
                    {
                        return;
                    }
                }

                // handle if not restored (new launch)
                if (!restored)
                {
                    await OnStartAsync(StartKind.Launch, e);

                    CurrentState = BootstrapperStates.Started;
                }

                // this will also hide any showing splashscreen
                WindowLogic.ActivateWindow(ActivateWindowSources.Launching, SplashLogic);
                CurrentState = BootstrapperStates.Launched;
            }
        }
        private async void StartupOrchestratorAsync(IActivatedEventArgs e, StartKind kind)
        {
            DebugWrite($"kind:{kind} previous:{e.PreviousExecutionState}");

            // check if this is the first activation at all, when we can save PreviousExecutionState and PrelaunchActivated
            if (!_firstActivationExecuted)
            {
                _firstActivationExecuted = true;
                PreviousExecutionState   = e.PreviousExecutionState;
                PrelaunchActivated       = (e as LaunchActivatedEventArgs)?.PrelaunchActivated ?? false;
            }

            // is the kind really right?
            if (kind == StartKind.Launch && CurrentStateHistory.ContainsValue(BootstrapperStates.Launching))
            {
                kind = StartKind.Activate;
            }
            else if (kind == StartKind.Launch && e.PreviousExecutionState == ApplicationExecutionState.Running)
            {
                kind = StartKind.Activate;
            }
            else if (kind == StartKind.Activate && e.PreviousExecutionState != ApplicationExecutionState.Running)
            {
                kind = StartKind.Launch;
            }

            // handle activate
            if (kind == StartKind.Activate)
            {
                CurrentState = BootstrapperStates.Activating;

                // never activate until launch has completed
                while (!CurrentStateHistory.ContainsValue(BootstrapperStates.Launched))
                {
                    await Task.Delay(10);
                }

                while (CurrentStateHistory.Count(x => x.Value == BootstrapperStates.Starting) != CurrentStateHistory.Count(x => x.Value == BootstrapperStates.Started))
                {
                    await Task.Delay(10);
                }

                CurrentState = BootstrapperStates.Starting;

                await OnStartAsync(kind, e);

                CurrentState = BootstrapperStates.Started;

                WindowLogic.ActivateWindow(ActivateWindowSources.Activating, SplashLogic);

                CurrentState = BootstrapperStates.Activated;
            }

            // handle first-time launch
            else if (kind == StartKind.Launch)
            {
                CurrentState = BootstrapperStates.Launching;

                SplashLogic.Show(e.SplashScreen, this);

                // do some one-time things
                SetupKeyboardListeners();
                SetupLifecycleListeners();
                SetupSystemListeners();
                SetupCustomTitleBar();

                // default Unspecified extended session
                if (AutoExtendExecutionSession)
                {
                    await ExtendedSessionService.StartUnspecifiedAsync();
                }

                CurrentState = BootstrapperStates.Initializing;

                // OnInitializeAsync
                await OnInitializeAsync(e);

                CurrentState = BootstrapperStates.Initialized;

                // if there no pre-existing root then generate root
                if (SplashLogic.Splashing || Window.Current.Content == null)
                {
                    Window.Current.Content = CreateRootElement(e);
                }

                // okay, now handle launch
                bool restored    = false;
                var  IsPrelaunch = (e as LaunchActivatedEventArgs)?.PrelaunchActivated ?? false;
                switch (e.PreviousExecutionState)
                {
                case ApplicationExecutionState.Suspended:
                case ApplicationExecutionState.Terminated:
                    OnResuming(this, null, IsPrelaunch ? AppExecutionState.Prelaunch : AppExecutionState.Terminated);
                    var launchedEventArgs = e as ILaunchActivatedEventArgs;
                    if (AutoRestoreAfterTerminated &&
                        DetermineStartCause(e) == AdditionalKinds.Primary || launchedEventArgs?.TileId == string.Empty)
                    {
                        CurrentState = BootstrapperStates.Restoring;

                        restored = await NavigationService.LoadAsync();

                        CurrentState = BootstrapperStates.Restored;
                    }
                    break;
                }

                // handle if pre-launch (no UI)
                if (IsPrelaunch)
                {
                    CurrentState = BootstrapperStates.Prelaunching;

                    var runOnStartAsync = false;
                    await OnPrelaunchAsync(e, out runOnStartAsync);

                    CurrentState = BootstrapperStates.Prelaunched;

                    if (!runOnStartAsync)
                    {
                        return;
                    }
                }

                // handle if not restored (new launch)
                if (!restored)
                {
                    CurrentState = BootstrapperStates.Starting;

                    await OnStartAsync(StartKind.Launch, e);

                    CurrentState = BootstrapperStates.Started;
                }

                // this will also hide any showing splashscreen
                WindowLogic.ActivateWindow(ActivateWindowSources.Launching, SplashLogic);

                CurrentState = BootstrapperStates.Launched;
            }
        }