WPFコマンドライン


99

コマンドライン引数を受け取るWPFアプリケーションを作成しようとしています。引数を指定しない場合、メインウィンドウがポップアップします。特定のコマンドライン引数がある場合は、コードをGUIなしで実行し、終了したら終了する必要があります。これを適切に実行する方法についての提案は、いただければ幸いです。

回答:


159

まず、App.xamlファイルの上部でこの属性を見つけて削除します。

StartupUri="Window1.xaml"

つまり、アプリケーションはメインウィンドウを自動的にインスタンス化して表示しません。

次に、AppクラスのOnStartupメソッドをオーバーライドしてロジックを実行します。

protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);

    if ( /* test command-line params */ )
    {
        /* do stuff without a GUI */
    }
    else
    {
        new Window1().ShowDialog();
    }
    this.Shutdown();
}

その時点でコンソール(Console.ReadLine / WriteLine)を操作できますか?
キーランベントン、

もちろん、Console.WriteLineを呼び出すことはできますが、アプリを起動したコンソールには出力は表示されません。WPFアプリケーションのコンテキストで「コンソール」が何であるかわかりません。
マットハミルトン

38
アプリが起動されたコンソールに書き込むには、AttachConsole(-1)、Console.Writeline(message)を呼び出し、完了後にFreeConsole()を呼び出す必要があります。
oltman 2010

7
注意:Windows1.xamlでは、Appリソースを使用できません。これらはまだロードされていません。System.Windows.Application.DoStartup(内部メソッド)にロードされ、OnStartupの直後にDoStartupが呼び出されます。
MuiBienCarlota

26

あなたの議論の存在を確認するには-マットの解決策ではこれをテストに使用します:

e.Args.Contains( "MyTriggerArg")


4

上記のソリューションの組み合わせ、.NET 4.0以降の場合、コンソールへの出力:

[DllImport("Kernel32.dll")]
public static extern bool AttachConsole(int processID);

protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);

    if (e.Args.Contains("--GUI"))
    {
        // Launch GUI and pass arguments in case you want to use them.
        new MainWindow(e).ShowDialog();
    }
    else
    {
        //Do command line stuff
        if (e.Args.Length > 0)
        {
            string parameter = e.Args[0].ToString();
            WriteToConsole(parameter);
        }
    }
    Shutdown();
}

public void WriteToConsole(string message)
{
    AttachConsole(-1);
    Console.WriteLine(message);
}

MainWindowのコンストラクターを変更して、引数を受け入れます。

public partial class MainWindow : Window
{
    public MainWindow(StartupEventArgs e)
    {
        InitializeComponent();
    }
}

そして削除することを忘れないでください:

StartupUri="MainWindow.xaml"

1

app.xaml.csファイルで以下を使用できます:

private void Application_Startup(object sender, StartupEventArgs e)
{
    MainWindow WindowToDisplay = new MainWindow();

    if (e.Args.Length == 0)
    {
        WindowToDisplay.Show();
    }
    else
    {
        string FirstArgument = e.Args[0].ToString();
        string SecondArgument = e.Args[1].ToString();
        //your logic here
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.