WPF的Application類

本節主要介紹一下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。

 

代碼文件

相關文章
相關標籤/搜索