本節主要介紹一下Application類的部分功能,咱們首先來看一下如何使用Application類來加載一個窗口:html
咱們首先建立一個控制檯程序,並引入相關的dll,而後修改Main()方法。windows
[STAThread] private static void Main() { var app = new Application(); var win = new Window1(); app.Run(win); //另外一種方法建立一個主窗口並顯示 //var app = new Application(); //var window1 = new Window1(); //app.MainWindow = window1; //window1.Show(); //app.Run(); Console.WriteLine("Window1 Closed"); }
該示例中用了兩種方法經過Application類來加載窗口。該窗口會被做爲主窗口顯示。當代碼執行Run()方法的時候,會觸發Application.StartUp事件,該事件執行完以後才顯示主窗口。無論是用上面的那種方法,應用程序一直運行,直到主窗口和其餘全部窗口都關閉,Run()方法才返回,並在應用程序結束以前,執行Run()方法後面的代碼。app
下面咱們來介紹一下常規的WPF應用程序,而且主要也使用這種方法。 ide
咱們在用Visual Studio建立WPF應用程序的時候,能夠使用它提供的WPF Application模板。它會爲咱們建立一個App.xaml和App.xaml.cs文件。咱們查看App.xaml文件,會發現有一個StartupUri="MainWindow.xaml",它的含義是指定程序的主窗口;在程序自動生成的文件App.g.i.cs中,會用到這個值,它是一個URI格式的值。咱們再查看代碼隱藏文件App.xaml.cs,發現只有一個繼承自System.Windows.Application的App部分類。ui
最初,App類是沒有包含任何代碼的。可是咱們能夠添加代碼來處理應用程序事件,接下來咱們來看看Application類中幾個重要的事件:spa
Startup:在Application.Run()方法以後,顯示主窗體以前發生。還能夠用這個事件的StartupEventArgs.Args屬性,獲取程序集命令行參數。甚至還能夠在該事件裏面建立和顯示主窗口,而不適用App.XAML中的StartupUri。操作系統
Exit:該事件發生在應用程序關閉以前,不能撤銷(無論是何種緣由關閉:調用Shutdown方法、Windows用戶註銷或者關閉結束回話等)。命令行
SessionEnding:發生,當用戶在註銷或關閉操做系統關閉 Windows 會話。能夠經過檢查SessionEndingCancelEventArgs.ReasonSessionEnding屬性值來明確緣由。若是要防止應用程序關閉,能夠設置SessionEndingCancelEventArgs.Cancel屬性值爲true(默認爲false)。code
Activated:當應用程序的一個窗口被激活的時候發生(包括:啓動主窗口的時候;對應用程序的用戶切換經過使用 ALT+TAB 或使用任務管理器;用戶單擊某一的任務欄按鈕在應用程序的窗口)。orm
Deactivated:當應用程序的一個窗口被取消激活的時候發生。
DispatcherUnhandledException:在應用程序中的任何位置,只要發生一個任何未處理的異常,就會發生該事件。咱們甚至能夠在該事件中使用DispatcherUnhandledExceptionEventArgs.Handled屬性,並設置爲true(默認爲false),讓程序繼續運行。
有2中選擇用於處理事件:經過App.xaml關聯事件處理程序;或者直接經過重寫相應的受保護的方法。
我還能夠經過ShutdownMode改變應用程序的關閉方式,有如下三種方式:
OnLastWindowClose:應用程序關閉時,或最後一個窗口關閉時關閉,或者Shutdown()方法調用。這是默認的行爲。
OnMainWindowClose:應用程序關閉時,或主窗口關閉時關閉,或者Shutdown()方法調用。
OnExplicitShutdown:僅當Shutdown()方法調用時,應用程序關閉。在此模式下,若是不調用Shutdown()方法,應用程序一直都不會結束(即便全部窗口都已經關閉)。
咱們已經對WPF的Application類已經有了必定的瞭解,接下來咱們看看其餘一些狀況:
訪問當前Application對象:經過靜態的Application.Current屬性,能夠在應用程序的任何位置獲取當前應用程序實例。
var app = Application.Current; var main = (MainWindow)app.MainWindow;//轉換爲正確的窗口類型 foreach (var window in app.Windows) { }
這個例子中須要注意的一點就是:Application.Current.Windows這個屬性的值是。當窗口(包括主窗口)顯示時,它們會被添加到Windows集合中;而當窗口關閉的時候,會從Windows集合中移除該窗口。
單實例應用程序:
一般,只要願意,咱們就能夠加載WPF應用程序的任意多個副本。在某些狀況下,這是很是合理的。可是在另一些狀況下,這多是一個問題。咱們能夠先來看一篇文章,而後再來看一個具體的例子:
1.咱們首先建立一個WPF應用程序,而後刪除掉App.xaml文件和其代碼後置文件
2.項目添加Microsoft.VisualBasic.dll文件引用
3.建立一個名爲App的類文件,並讓該App類繼承System.Windows.Application
protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); var main = new MainWindow(); main.Show(); }
4.建立一個名爲SingleInstanceApplicationWrapper的類文件,並讓該類繼承Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase
public class SingleInstanceApplicationWrapper : WindowsFormsApplicationBase { /// <summary> /// WPF App /// </summary> private App _app; public SingleInstanceApplicationWrapper() { IsSingleInstance = true; } protected override bool OnStartup(StartupEventArgs eventArgs) { base.OnStartup(eventArgs); _app = new App(); _app.Run(); return false;//這裏必定要返回false,指示應用程序是否應繼續啓動。 } }
5.接下來咱們就須要建立一個程序入口文件Program.cs
public class Program { [STAThread] public static void Main(string[] args) { var single = new SingleInstanceApplicationWrapper(); single.Run(args); } }
這樣,咱們一個簡單的只能運行單實例的應用程序就建立成功了。接下來基於上面的代碼,構建基於文檔的應用程序。
6.建立一個讀取文檔的窗口Document.xaml,用於顯示讀取文檔的內容:
/// <summary> /// Interaction logic for Document.xaml /// </summary> public partial class Document : Window { public Document() { InitializeComponent(); } private DocumentReference _docRef; public void LoadFile(DocumentReference docRef) { _docRef = docRef; Content = File.ReadAllText(docRef.Name); Title = docRef.Name; } protected override void OnClosed(EventArgs e) { base.OnClosed(e); ((App)Application.Current).Documents.Remove(_docRef); } }
7.建立一個實體類DocumentReference,用於MainWindow.xaml的ListBox控件綁定數據源
public class DocumentReference { public DocumentReference(Document document, string name) { Document = document; Name = name; } public Document Document { get; set; } public string Name { get; set; } }
咱們編輯Solution的Properties,修改Debug選項卡的Command line arguments,若是多個參數須要空格。
這樣咱們運行程序的時候,就會自動的打開文檔了。還須要注意的一點就是把項目中的全部.testDoc文檔Copy to Output Directory修改成,Copy always。