應用程序以 Main 方法爲入口點,若是爲 Main 方法指定一個 string[] 類型的參數,在程序運行時,這個參數會獲取到傳遞給應用程序的命令行參數。數組
而 WPF 應用程序比較特殊,由於在VS中包含一些生成的的代碼,所以,Main 方法所在的代碼文件被隱藏了(文件名爲App.g.cs,g 表示生成的意思),雖然在項目的obj目錄下能找到這個文件,可是直接在生成的文件中編寫代碼是沒有意義的,下次生成時就會覆蓋掉。框架
所以,在WPF應用程序中,應該將App類視爲入口點,能夠在App類中處理一些程序初始化的事情。測試
其實,在.net 框架中,Environment 類有個靜態的 GetCommandLineArgs 方法,它的好處是能夠在程序的任意代碼處獲取傳遞給程序的命令行參數。因此,在WPF應用程序中,你依然能夠調用 GetCommandLineArgs 方法來獲取命令行參數,不過,有一點得注意,GetCommandLineArgs 方法所返回的字符串數組中,第一個元素是當前程序的全路徑,從第二個元素起纔是命令行參數。spa
好比,你能夠這樣:.net
string[] pargs = Environment.GetCommandLineArgs();
除了上述萬能方法外,特定於 WPF ,框架也提供了專門的方案。命令行
Application 類用於管理 WPF 應用程序相關的各類數據,它有一個 Startup 事件,當應用程序啓動時,這個事件會發生,咱們能夠在這個事件中作一些初始化工做,好比分析命令行參數,實例化要顯示的窗口等。其中,事件參數 e (類型StartupEventArgs),有一個 Args 屬性,是一個字符串數組,裏面所包含的就是命令行參數。調試
在 Startup 事件處理結束以前,是不會加載UI的,因此在這個事件的處理代碼中,你不該該去訪問UI,而是初始化UI。code
好比我開發了一個應用,叫【一念成佛,一念成魔】,它有兩個窗口,第一個窗口叫【天堂】,第二個窗口叫【地獄】。應用程序啓動後,是進入天堂仍是墜入地獄,取決於傳遞給程序的命令行參數,若是帶參數 -a,就進入天堂模式;若是是-b,就進入地獄模式。xml
首先,爲 Startup 事件聲明一個事件處理方法。blog
<Application x:Class="HaoDongDong.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Startup="OnAppStartup"> <Application.Resources> </Application.Resources> </Application>
而後,處理代碼,分析命令行參數,顯示對應的窗口。
private void OnAppStartup(object sender, StartupEventArgs e) { if(e.Args.Length == 0) { // 退出 Shutdown(); } // 建立並顯示窗口 Window mWind; if (e.Args.Contains("-a")) { mWind = new Window1(); } else { mWind = new Window2(); } mWind.Show(); }
若是沒有命令行參數,就直接退出程序,Shutdown 方法是關閉當前程序,不是關機,不用懼怕。
在調試階段測試命令行參數,能夠打開項目屬性窗口,定位到【調試】選項卡,在右邊頁面上會看到,能夠輸入命令行參數,好比,我輸入 -b。
接着,調試運行,就會看到以下窗口打開。
設置程序要顯示的窗口,還有一種方法——直接設置 StartupUri 屬性,它須要一個指向XAML文件的 URI,項目內部能夠用相對路徑。
if (e.Args.Contains("-a")) { StartupUri = new Uri("Window1.xaml", UriKind.Relative); } else { StartupUri = new Uri("Window2.xaml", UriKind.Relative); }
這樣也很簡潔。
好,這是老周爲大夥伴準備的兒童節禮物。