Question

I am trying to create a WPF application that takes command line arguments. If no arguments are given, the main window should pop up. In cases of some specific command line arguments, code should be run with no GUI and exit when finished. Any suggestions on how this should properly be done would be appreciated.

Was it helpful?

Solution

First, find this attribute at the top of your App.xaml file and remove it:

StartupUri="Window1.xaml"

That means that the application won't automatically instantiate your main window and show it.

Next, override the OnStartup method in your App class to perform the logic:

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

OTHER TIPS

To check for the existence of your argument - in Matt's solution use this for your test:

e.Args.Contains("MyTriggerArg")

A combination of the above solutions, for .NET 4.0+ with output to the console:

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

Alter the constructor in your MainWindow to accept arguments:

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

And don't forget to remove:

StartupUri="MainWindow.xaml"

You can use the below in app.xaml.cs file :

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 with attribution
Not affiliated with StackOverflow
scroll top