0x1 PRISM?
PRISM項目地址:https://github.com/PrismLibrary/Prismhtml
先看下簡介:git
Prism is a framework for building loosely coupled, maintainable, and testable XAML applications in WPF, Windows 10 UWP, and Xamarin Forms.github
谷歌翻譯:shell
Prism是一個框架,用於在WPF,Windows 10 UWP和Xamarin Forms中構建鬆散耦合,可維護和可測試的XAML應用程序。bootstrap
能夠看出PRISM並不單單是一個MVVM框架,他提供了一系列設計模式的實現。這聽上去就很Dior了。c#
0x2 Run
PRISM 再也不使用App.xaml
來爲程序設置入口,而是使用 Bootstrapper來初始化程序和啓動窗口。在 PRISM的項目中,須要刪除App.xaml
中的StartupUri
,由於你再也不須要使用他了。設計模式
一般狀況下,你的App.xaml
是這樣的:app
<Application x:Class="WpfApp1.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:WpfApp1" StartupUri="MainWindow.xaml"> <Application.Resources> </Application.Resources> </Application>
而PRISM項目中的App.xaml
是這樣的:框架
<Application x:Class="BootstrapperShell.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:BootstrapperShell"> <Application.Resources> </Application.Resources> </Application>
PRISM項目中,在 App.xaml.cs
中重寫了OnStartup
方法,讓app從Bootstrapper啓動:ide
protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); var bootstrapper = new Bootstrapper(); bootstrapper.Run(); }
順藤摸瓜,咱們看一下 Bootstrapper類
using Microsoft.Practices.Unity; using Prism.Unity; using BootstrapperShell.Views; using System.Windows; namespace BootstrapperShell { class Bootstrapper : UnityBootstrapper { protected override DependencyObject CreateShell() { return Container.Resolve<MainWindow>(); } protected override void InitializeShell() { Application.Current.MainWindow.Show(); } } }
Bootstrapper.cs
,中的CreateShell
方法來建立shell,InitializeShell
初始化shell。這裏的shell是宿主應用程序,就至關因而咱們的主窗體程序,其餘的view和module都將會被加載到shell中顯示。
固然你也能夠不用使用MainWindow
,做爲shell的窗口,能夠改爲任何你想要的名字,但他必定是Window類型,你還能夠將他放在任何一個位置,爲了未來適配MVVM思想,咱們將他放在Views目錄下面,之後咱們全部的View都將放到這個目錄下面。
那麼,咱們在初識WPF的時候,認識的App.g.cs
呢?他裏面不是有Main方法嗎?咱們在一樣的位置找到他:
using BootstrapperShell; using System.Windows.Shell; namespace BootstrapperShell { /// <summary> /// App /// </summary> public partial class App : System.Windows.Application { /// <summary> /// Application Entry Point. /// </summary> [System.STAThreadAttribute()] [System.Diagnostics.DebuggerNonUserCodeAttribute()] [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")] public static void Main() { BootstrapperShell.App app = new BootstrapperShell.App(); app.Run(); } } }
蛤蛤,他叛變了,App.g.cs
看上去更像是一個在編譯的時候纔會生成的中間文件,根據App.xaml.cs
中的OnStartup
方法來從新生成了Main方法。
[7.1update]Prism.UnityUnityBootstrapper
被標記爲 deprecated,而且建議使用 PrismApplication
做爲應用的基類,而且在7.1中Bootstrapper
類已經再也不使用,入口代碼整合到app.xaml及app.xaml.cs中去了,但這一節不影響咱們來了解wpf及prism,在接下來的例子中我會將實例代碼更新到7.1。