Línea de comandos de WPF

99

Estoy tratando de crear una aplicación WPF que tome argumentos de línea de comando. Si no se dan argumentos, debería aparecer la ventana principal. En los casos de algunos argumentos específicos de la línea de comandos, el código debe ejecutarse sin GUI y salir cuando termine. Se agradecería cualquier sugerencia sobre cómo debe hacerse correctamente.

bingles
fuente

Respuestas:

159

Primero, busque este atributo en la parte superior de su archivo App.xaml y elimínelo:

StartupUri="Window1.xaml"

Eso significa que la aplicación no instanciará automáticamente su ventana principal y la mostrará.

A continuación, anule el método OnStartup en su clase de aplicación para realizar la lógica:

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();
}
Matt Hamilton
fuente
¿Puede interactuar con la consola (Console.ReadLine / WriteLine) en ese momento?
Kieran Benton
Ciertamente, puede llamar a Console.WriteLine, pero la salida no aparecerá en la consola desde la que inició la aplicación. No estoy seguro de qué es "Consola" en el contexto de una aplicación WPF.
Matt Hamilton
38
Para escribir en la consola en la que se inició la aplicación, debe llamar a AttachConsole (-1), Console.Writeline (mensaje) y luego a FreeConsole () cuando haya terminado.
oltman
7
CUIDADO: En Windows1.xaml, no podemos utilizar los recursos de la aplicación. Todavía no están cargados: se cargan en System.Windows.Application.DoStartup (método interno) y DoStartup se llama justo después de OnStartup.
MuiBienCarlota
26

Para verificar la existencia de su argumento, en la solución de Matt, use esto para su prueba:

e.Args.Contains ("MyTriggerArg")

GeekyMonkey
fuente
4

Una combinación de las soluciones anteriores, para .NET 4.0+ con salida a la consola:

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

Modifique el constructor en su MainWindow para aceptar argumentos:

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

Y no olvide eliminar:

StartupUri="MainWindow.xaml"
Kurt Van den Branden
fuente
1

Puede utilizar lo siguiente en el app.xaml.csarchivo:

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
    }
}
Satish Tatikonda
fuente