public void InitializeOnceAtStartup(MainNavigationWindow navigator, ZkooTutorialModel appModel)
        {
            Trace.Assert(navigator != null);
            Trace.Assert(appModel != null);
            refToNavigator = navigator;
            refToAppModel  = appModel;

            this.DataContext = refToAppModel;

            ReplayPracticeNextButtonsUserControl.InitializeOnceAtStartup(appModel.TutorialAppHeaderMenu);
            TutorialAppHeaderMenuUserControl.InitializeOnceAtStartup(appModel.TutorialAppHeaderMenu);

            this.PreviewMouseMove += (sender, e) =>
            {
                MouseCursorPositionY = (int)e.GetPosition(this).Y;
                UpdateAppHeaderMenuVisibility();
            };

            TutorialAppHeaderMenuUserControl.MouseEnter += (sender, e) =>
            {
                IsMouseHoveredOnTutorialAppHeaderMenuUserControl = true;
                UpdateAppHeaderMenuVisibility();
            };
            TutorialAppHeaderMenuUserControl.MouseLeave += (sender, e) =>
            {
                IsMouseHoveredOnTutorialAppHeaderMenuUserControl = false;
                UpdateAppHeaderMenuVisibility();
            };

            videoPlayingUserControl.IsPlayingChanged += (sender, e) =>
            {
                UpdateAppHeaderMenuVisibility();
                ReplayPracticeNextButtonsUserControl.Visibility = videoPlayingUserControl.IsPlaying ? Visibility.Collapsed : Visibility.Visible;
            };

            this.Loaded += (sender, e) =>
            {
                // NOTE: This does not change device settings and so on.
                // NOTE: Called from asynchronous Task.Run() called from each Page's Loaded event.
                refToNavigator.Title = this.PageTitle;
                refToNavigator.SetWindowFullScreen();
                refToAppModel.EnableUpdatingCameraViewImageButHideWindow();
                videoPlayingUserControl.SetMediaElementSourceUriByFilePath(Path.Combine(refToAppModel.CurrentResources.TutorialVideoFilesFolderPath, VideoFileNameWithoutDirectory), UriKind.Relative);
                videoPlayingUserControl.Replay();
            };
        }
        public void InitializeOnceAtStartup(ZkooTutorialModel zkooTutorialModel)
        {
            Trace.Assert(zkooTutorialModel != null);
            refToZkooTutorialModel = zkooTutorialModel;

            LauncherView.InitializeOnceAtStartup(this, refToZkooTutorialModel);
            Tutorial00ZkooSetupTutorialVideo.InitializeOnceAtStartup(this, refToZkooTutorialModel);
            Tutorial01StartGestureTutorialVideo.InitializeOnceAtStartup(this, refToZkooTutorialModel);
            Tutorial01StartGestureTraining.InitializeOnceAtStartup(this, refToZkooTutorialModel.Tutorial01StartGestureTraining);
            Tutorial02MoveCursorTutorialVideo.InitializeOnceAtStartup(this, refToZkooTutorialModel);
            Tutorial02MoveCursorTraining.InitializeOnceAtStartup(this, refToZkooTutorialModel.Tutorial02MoveCursorTraining);
            Tutorial03TapGestureTutorialVideo.InitializeOnceAtStartup(this, refToZkooTutorialModel);
            Tutorial03TapGestureTraining.InitializeOnceAtStartup(this, refToZkooTutorialModel.Tutorial03TapGestureTraining);
            Tutorial04DragGestureTutorialVideo.InitializeOnceAtStartup(this, refToZkooTutorialModel);
            Tutorial04DragGestureTraining.InitializeOnceAtStartup(this, refToZkooTutorialModel.Tutorial04DragGestureTraining);
            Tutorial05FlickGestureTutorialVideo.InitializeOnceAtStartup(this, refToZkooTutorialModel);
            Tutorial05FlickGestureTraining.InitializeOnceAtStartup(this, refToZkooTutorialModel.Tutorial05FlickGestureTraining);
            Tutorial06BothHandsGestureTutorialVideo.InitializeOnceAtStartup(this, refToZkooTutorialModel);

            UpdatePagesSize();

            Tutorial00ZkooSetupTutorialVideo.Loaded        += delegate { OnTutorial00Moved(); };
            Tutorial01StartGestureTutorialVideo.Loaded     += delegate { OnTutorial01Moved(); };
            Tutorial01StartGestureTraining.Loaded          += delegate { OnTutorial01Moved(); };
            Tutorial02MoveCursorTutorialVideo.Loaded       += delegate { OnTutorial02Moved(); };
            Tutorial02MoveCursorTraining.Loaded            += delegate { OnTutorial02Moved(); };
            Tutorial03TapGestureTutorialVideo.Loaded       += delegate { OnTutorial03Moved(); };
            Tutorial03TapGestureTraining.Loaded            += delegate { OnTutorial03Moved(); };
            Tutorial04DragGestureTutorialVideo.Loaded      += delegate { OnTutorial04Moved(); };
            Tutorial04DragGestureTraining.Loaded           += delegate { OnTutorial04Moved(); };
            Tutorial05FlickGestureTutorialVideo.Loaded     += delegate { OnTutorial05Moved(); };
            Tutorial05FlickGestureTraining.Loaded          += delegate { OnTutorial05Moved(); };
            Tutorial06BothHandsGestureTutorialVideo.Loaded += delegate { OnTutorial06Moved(); };

            this.KeyUp += (sender, e) =>
            {
                if (true)
                {
                    if (e.Key == Key.Escape)
                    {
                        ExitTutorial();
                    }
                }
            };

            this.Loaded += (sender, e) =>
            {
                refToZkooTutorialModel.EnableUpdatingCameraViewImageButHideWindow();
            };

            cursorMonitorTimer.Tick += (sender, e) =>
            {
                if (refToZkooTutorialModel.RefToHostApp.OnePersonBothHandsViewModel == null)
                {
                    return;
                }
                var hand = refToZkooTutorialModel.RefToHostApp.OnePersonBothHandsViewModel.FirstFoundHand;
                if (hand == null || hand.IsTracking == false)
                {
                    return;
                }
                NativeMethods.SetCursorPos((int)hand.PositionX, (int)hand.PositionY);
            };
            cursorMonitorTimer.Start();
        }