web-dev-qa-db-ja.com

WPFコマンドライン引数、スマートな方法?

ユーザーが渡した引数の値を読み取るだけで、コマンドライン引数をWPFアプリケーションに解析できる方法を探しています。

例として

application.exe /setTime 5

私が言うことができるコードを持っている方法があります:

MessageBox.Show(arg("setTime"));

5を出力します

解決策

スマートWPFコマンドライン引数の作成方法

42
Sandeep Bansal

私がいつもやる方法は、引数を「名前」/「値」のペアとして指定することです。

_myprogram.exe -arg1 value1 -arg2 value2
_

これは、コマンドラインを解析するときに、引数をキーとしてDictionaryに引数/値のペアを配置できることを意味します。すると、arg("SetTime")は次のようになります。

_MessageBox.Show(dictionary["SetTime"]);
_

(明らかに、実際の辞書を公開したくありません。)

最初に引数を取得するには、次を使用できます。

_string[] args = Environment.GetCommandLineArgs();
_

これはすべての引数を返すので、2つのステップで配列を解析する必要があります(最初に長さが2 + 1の倍数であることを確認した後):

配列の最初の要素は実行中のプログラムの名前です。 MSDNページ -したがって、ループは1つから開始する必要があります。

_for (int index = 1; index < args.Length; index += 2)
{
     dictionary.Add(args[index], args[index+1]);
}
_

これは、各引数が値のペアであるように2つのステップでループします。識別子と実際の値自体です。

_my.exe -arg1 value1 -arg2 value2
_

次に、キー_-arg1_が辞書にあるかどうかを確認することで、引数が指定されているかどうかを確認し、その値を読み取ります。

_string value;
if (dictionary.TryGetValue(arg, out value))
{
    // Do what ever with the value
}
_

これは、任意の順序で引数を指定し、指定したくない引数を省略することができることを意味します。

91
ChrisF

WPFでこれを行う別の方法があります。ここに 記事 があります。ここに実行する手順があります。

まず、App.xamlを開き、Startup="Application_Startup"の後にStartupUri="Window1.xaml"を追加します。したがって、App.xamlは次のようになります。

<Application x:Class="ParametersForWPF.App"
    xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
    StartupUri="Window1.xaml"
    Startup="Application_Startup">
    <Application.Resources>
    </Application.Resources>
</Application>

次に、関数Application_StartupApp.xaml.csファイルに自動的に追加されます。

public partial class App : Application
{
    private void Application_Startup(object sender, StartupEventArgs e)
    {

    }
}

この関数内で、アプリケーションに送信されたargsを確認できます。これを行う例は次のとおりです。

private void Application_Startup(object sender, StartupEventArgs e)
{
    foreach(string s in e.Args)
    {
        MessageBox.Show(s);
    }
}

Dictionaryとして必要な場合は、Application_Startup関数内に ChrisFの答え を簡単に実装できます。

0
Paul Karam