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.

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

¿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")


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"

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
    }
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.