WPF教程七:通過App.xaml來了解Application類都能干什么


  這個章節來了解Application類,我考慮了一晚上決定跳過控件類相關的學習,因為控件如果只是入門的話每個控件F12跳過去看一下屬性、事件就能大致了解的差不多,而且控件比較多,每個都這樣看一遍,感覺意義不大。同時控件的使用一般又同時包含了,資源、樣式、觸發器、模板、綁定、列表控件的話,可能還包含列表虛擬化和數據虛擬化。所以想了一下。打算先講Application類。

  教程的第一篇我們從hello world開始了解什么是程序。它是如何編譯、生成和運行的。現在這一個篇從App.xaml講解Application類中能包含哪些東西,。這個Application類有哪些應用場景。

App.xaml 里包含什么

我們新創建一個WPF的程序,默認什么代碼也不改動的情況下雙擊程序代碼中的App.xaml。我們看到如下代碼:

<Application x:Class="ApplicationLifeCycle.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:ApplicationLifeCycle"
             StartupUri="MainWindow.xaml"> 
    <Application.Resources>
         
    </Application.Resources>
</Application>

這里就是我們當前程序的入口部分了,如果需要修改入口則需要通過再解決方案上的程序集工程上右鍵=》屬性=》應用程序=》啟動對象=》設置為對應的。但是這里默認我們不修改。因為App.xaml這里已經提供了很豐富的功能。夠我們目前使用。

Application下XAML屬性再這個系列的第一篇博客里有詳細講過這些,我們主要講Application的屬性,我們用鼠標單擊代碼上的Application對象按下F12,我們截取幾個必要常用的屬性來講,其他的屬性感興趣了都可以花時間看一下。

 

 

  我們就講這些里面一部分常用的,剩下的建議以我們同樣的分析思路,去觀察一下其他的。

1)首先我們看程序啟動后的第一步。通過OnStartUp()方法做啟動參數檢查。

我們通過OnStartUp()方法的重寫來區分不同啟動參數,可以讓程序干很多不同的事情,我們打開任務管理器=》Name列右鍵點擊=》勾選顯示Command line,位置如下:

 

 

 

 

這樣我們就可以看到當前很多其他程序,都是由啟動參數的,啟動參數按空格分割,有的程序會有一組參數,所以對我們來說,啟動參數同樣也是很重要的東西。不管是單例,還是讓程序啟動不同的功能,啟動參數就是軟件功能解耦的第一步。

我們找到上上個截圖的OnStartup方法,我們在App.xaml.cs里重寫他,代碼如下,並在解決方案下的程序集右鍵=》屬性=》左側列表選擇調試=》命令行參數這里添加對應的調試參數,我們這里設置用空格分割一句話,這樣我們就可以調試了,F5啟動。

 

using System.Text;
using System.Windows;

namespace ApplicationLifeCycle
{
    /// <summary>
    /// App.xaml 的交互邏輯
    /// </summary>
    public partial class App : Application
    { 

        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e); 
            StringBuilder sb = new StringBuilder();
            foreach (var item in e.Args)
            {
                sb.Append(item);
            } 
            MessageBox.Show($"args length as {e.Args.Length},args content as {sb.ToString()}");
          
        }
    }
}

 

 我們看到了參數是4行,內容是-hello duwenong Mastery C#。這樣我們通過重寫OnStartup就可以實現參數對不同的參數做不同的處理。 

2)用戶注銷,但是程序正在處理關鍵任務,通過重寫OnSessionEnding()來提示當前工作尚未結束。

我們通過重寫OnSessionEnding()可以在重要工作沒做完但是,用戶選擇關機、重啟或注銷電腦時提示用戶我們有任務尚未結束。

 private bool _unsavedData = false;
        public bool UnsavedData
        {
            get { return _unsavedData; }
            set
            {
                _unsavedData = value;
            }
        }

        protected override void OnSessionEnding(SessionEndingCancelEventArgs e)
        {
            base.OnSessionEnding(e);
            //假設某些線程未完成保存,把UnsaveData設置為True
            UnsavedData = true;
            if (UnsavedData)
            {
                e.Cancel = true;
                MessageBox.Show($"我們的數據尚未保存完畢,{e.ReasonSessionEnding} 將丟失數據。");
            }
        }

這樣再程序開啟時,用戶選擇注銷電腦或者重啟關機等其他操作時,會彈出一個提示框,提示用戶數據未保存完成。是否強制執行他的操作。

3)默認啟動那個Window窗體。我們使用StartupUri設置可以修改默認啟動的Window窗體。

 

 這樣啟動的就是我們新創建的Window1.

4)通過ShutdownMode修改程序默認的關閉方式。

 

1.OnExplicitShutdown 這個方法比較特殊,他是除非通過代碼調用了Application.Shutdown()方法,否則即使所有窗口都關閉了,程序仍然駐留再后台。
2.OnLastWindowClose 這個是默認的值,只要至少有一個窗口存在,應用程序就保持運行狀態,但是注意如果關閉了主窗口,MainWindow扔就指向當時的窗體,需要代碼切換MainWindow到其他窗體
3.OnMainWindowClose 這個是只要主窗體還處於打開狀態,應用程序就保持運行,如果主窗體關閉進程就退出。

5)使用Application.Current訪問當前Application的實例

 private void GetCurrentWindowListButton_Click(object sender, RoutedEventArgs e)
        {
            Window mainWindow = Application.Current.MainWindow;
            foreach (var item in Application.Current.Windows)
            {
                var title = ((Window)item).Title;
            }

        }

我們使用代碼獲取當前打開的所有window的標題。

Application的屬性和方法目前就寫這么多,其他的大家可以自己F12看一下並嘗試寫一下代碼,資源和資源的查找雖然也是Application下的。但是我覺得這點要要出來單獨講,所以就不寫在這里啦。

   

我創建了一個C#相關的交流群。用於分享學習資料和討論問題。歡迎有興趣的小伙伴:QQ群:542633085

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM