1. 程式人生 > >【WPF】如何獲取命令行參數

【WPF】如何獲取命令行參數

com 頁面 覆蓋 pps 分享 一點 new spa tro

應用程序以 Main 方法為入口點,如果為 Main 方法指定一個 string[] 類型的參數,在程序運行時,這個參數會獲取到傳遞給應用程序的命令行參數。

而 WPF 應用程序比較特殊,因為在VS中包含一些生成的的代碼,因此,Main 方法所在的代碼文件被隱藏了(文件名為App.g.cs,g 表示生成的意思),雖然在項目的obj目錄下能找到這個文件,但是直接在生成的文件中編寫代碼是沒有意義的,下次生成時就會覆蓋掉。

因此,在WPF應用程序中,應該將App類視為入口點,可以在App類中處理一些程序初始化的事情。

其實,在.net 框架中,Environment 類有個靜態的 GetCommandLineArgs 方法,它的好處是可以在程序的任意代碼處獲取傳遞給程序的命令行參數。所以,在WPF應用程序中,你依然可以調用 GetCommandLineArgs 方法來獲取命令行參數,不過,有一點得註意,GetCommandLineArgs 方法所返回的字符串數組中,第一個元素是當前程序的全路徑,從第二個元素起才是命令行參數。

比如,你可以這樣:

    string[] pargs = Environment.GetCommandLineArgs();

除了上述萬能方法外,特定於 WPF ,框架也提供了專門的方案。

Application 類用於管理 WPF 應用程序相關的各種數據,它有一個 Startup 事件,當應用程序啟動時,這個事件會發生,我們可以在這個事件中做一些初始化工作,比如分析命令行參數,實例化要顯示的窗口等。其中,事件參數 e (類型StartupEventArgs),有一個 Args 屬性,是一個字符串數組,裏面所包含的就是命令行參數。

在 Startup 事件處理結束之前,是不會加載UI的,所以在這個事件的處理代碼中,你不應該去訪問UI,而是初始化UI。

比如我開發了一個應用,叫【一念成佛,一念成魔】,它有兩個窗口,第一個窗口叫【天堂】,第二個窗口叫【地獄】。應用程序啟動後,是進入天堂還是墜入地獄,取決於傳遞給程序的命令行參數,如果帶參數 -a,就進入天堂模式;如果是-b,就進入地獄模式。

首先,為 Startup 事件聲明一個事件處理方法。

<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);
            }

這樣也很簡潔。

好,這是老周為大夥伴準備的兒童節禮物。

【WPF】如何獲取命令行參數