2013年08月25日

WPFサンプル:コマンドラインの引数を得る

   このエントリーをはてなブックマークに追加 Clip to Evernote
Mainメソッドが隠蔽されてしまっているWPFでも、コマンドラインから引数を受け取ることができます。
まず、App.xaml.cs に以下のプロパティとメソッドを追加します。

public partial class App : Application {
    public static string[] CommandLineArgs { get; private set; }
    private void Application_Startup(object sender, StartupEventArgs e) {
        if (e.Args.Length == 0)
            return;
        CommandLineArgs = e.Args;
    }
}

StartupEventArgsのArgsプロパティに、アプリケーションに渡されたコマンド ライン引数が 入ってきますので、これを Appクラスの CommandLineArgs プロパティに設定しています。
Appクラスは、Visual Studio が自動生成してくれるクラスで、ソリューションエクスプローラからは、App.xaml -> App.xaml.cs -> App とたどっていくことで、開くことができます。

CommandLineArgs プロパティはstaticプロパティですので、これで、どこからでもコマンドライン引数を参照することができるようになりました。

例えば、Button_Click イベントハンドラで、以下のようなコードを書けば、コマンド引数をListBoxに表示させることができます。

private void Button_Click(object sender, RoutedEventArgs e) {
    if (App.CommandLineArgs == null)
        return;
    foreach (string arg in App.CommandLineArgs) {
        this.listBox1.Items.Add(arg);
    }
}

※ バインディングせずに、あえて ListBox.ItemsにAddしています。

このプログラムが、Sample.exeだとすると、

C:\>Sample.exe Visual Studio 2013

とタイプして Sample.xeをたちあげ、ボタンをクリックすれば、以下のような 実行結果が得られます。

cmdlineargs

エクスプローラ上のSample.exeのアイコンに、ファイルをDrag&Dropしてsample.xeを起動すれば、 Drag&Dropされたファイルパスが、コマンドライン引数として渡されますから、 以下のように、ファイルパスを得ることができます。

cmdlineargs2
※ 3つのファイルをアイコン上にD&Dした例です。


ちなみに、このサンプルのXAMLは、以下のように定義しています。

<Window x:Class="CommandLineSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Button Content="Button" HorizontalAlignment="Left"
                Margin="10,10,0,0" VerticalAlignment="Top"
                Width="75" Click="Button_Click"/>
        <ListBox HorizontalAlignment="Stretch" Height="200"
                 Margin="5,50,5,5" VerticalAlignment="Top"
                 Name="listBox1"/>
    </Grid>
</Window>


WPFサンプル・目次


 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/52332887