/// <summary> /// Invoked when the application is launched normally by the end user. /// Other entry points will be used such as when the application is /// launched to open a specific file. /// <remarks> /// <para> /// To support the MVP-VM pattern an entry point to bootstrap the /// framework is required. We'll use the <b>Frame.Loaded</b> event (ref /// Figure 2) as it indicates "Occurs when a FrameworkElement has been /// constructed and added to the object tree, and is ready for /// interaction". /// </para><para> /// This provides our hook so that we can get an instance of the page /// which implements IShell. The IShell interface has a property /// <b>Bootstrapper</b> which is a local class, within the project, /// permitting you to set AppSettings and Modules in container. <br/> /// <br/><img src="{ImageFolder}/Images/010/010/020/SS010-010-020-030.png" /> /// <br/> Figure 1. MainPage IShell implementation of Bootstrapper /// </para> /// </remarks> /// <br/><img src="{ImageFolder}/Images/010/010/020/SD010-010-020-010.png" /> /// Figure 2. Sequence diagram for Bootstrapper /// <para> /// Reference the <see cref="Bootstrapper"/> for more information. /// </para> /// </summary> /// <param name="e">Details about the launch request and process.</param> protected override void OnLaunched(LaunchActivatedEventArgs e) { #if DEBUG if (System.Diagnostics.Debugger.IsAttached) { this.DebugSettings.EnableFrameRateCounter = true; } #endif Frame rootFrame = Window.Current.Content as Frame; // Do not repeat app initialization when the Window already has // content, just ensure that the window is active if (rootFrame == null) { // Create a Frame to act as the navigation context and // navigate to the first page rootFrame = new Frame(); // BillKrat.2016.02.12 - Code required to launch // bootstrapper configured in Shell // Step 1: apply the IShell interface to MainPage.cs and // implement Bootstrapper property // Step 2: subscribe to the rootFrame.Loaded event so that // we'll be notified when page instances is ready rootFrame.Loaded += (sender, args) => { // Step 3: get shell instance and cast to IShell var page = ((Frame)sender).Content as IShell; if (page != null) // We're done if not IShell { var errorGrid = page.FindName<Grid>("ErrorRegion"); var errorText = page.FindName<TextBlock>("ErrorTextBlock"); Guard.ArgumentNotNull(errorText, "OnLaunched.Loaded: ErrorTextBlock"); Guard.ArgumentNotNull(errorGrid, "OnLaunched.Loaded: ErrorRegion"); errorGrid.Visibility = Visibility.Collapsed; // Pass in page as argument (will be added to // container so it can be retrieved with IShell) var presenterArgs = new PresenterEventArgs {MainPage = page}; // Step 4: Get container instance // Step 5: Get Presenter instance // Step 6: Initialize Presenter passing in args var container = new GwnClassBase() .GetContainer(); // 4. // Subscribe to ErrorEvent and handle them by // displaying them in the bottom Grid within the // MainPage. container .Resolve<EventManager>() .GetEvent<ErrorEvent>() .Subscribe(err => { errorGrid.Visibility = Visibility.Visible; errorText.Text = err.ToString(); }); // Resolve presenter and initialize container .Resolve<MainPresenter>() // 5. .Initialize(this, presenterArgs); // 6. } }; // BillKrat.2016.02.12 - End of code segment ------------------------- rootFrame.NavigationFailed += OnNavigationFailed; if (e.PreviousExecutionState == ApplicationExecutionState.Terminated) { //TODO: Load state from previously suspended application } // Place the frame in the current Window Window.Current.Content = rootFrame; } if (rootFrame.Content == null) { // When the navigation stack isn't restored navigate to the first page, // configuring the new page by passing required information as a navigation // parameter rootFrame.Navigate(typeof(MainPage), e.Arguments); } // Ensure the current window is active Window.Current.Activate(); }
protected PresenterEventArgs GetArgs() { var args = new PresenterEventArgs { Module = this }; return args; }