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

應用程序以 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);
            }

這樣也很簡潔。

 

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

相關文章
相關標籤/搜索