Linha de Comando WPF

99

Estou tentando criar um aplicativo WPF que usa argumentos de linha de comando. Se nenhum argumento for fornecido, a janela principal deve aparecer. Em casos de alguns argumentos de linha de comando específicos, o código deve ser executado sem GUI e sair quando concluído. Agradecemos quaisquer sugestões sobre como isso deve ser feito corretamente.

bingles
fonte

Respostas:

159

Primeiro, encontre este atributo na parte superior do seu arquivo App.xaml e remova-o:

StartupUri="Window1.xaml"

Isso significa que o aplicativo não irá instanciar automaticamente sua janela principal e mostrá-la.

Em seguida, substitua o método OnStartup em sua classe App para realizar a 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
fonte
Você pode interagir com o console (Console.ReadLine / WriteLine) nesse ponto?
Kieran Benton
Certamente você pode chamar Console.WriteLine, mas a saída não aparecerá no console a partir do qual você iniciou o aplicativo. Não tenho certeza do que é "Console" no contexto de um aplicativo WPF.
Matt Hamilton
38
Para gravar no console em que o aplicativo foi iniciado, você precisa chamar AttachConsole (-1), Console.Writeline (mensagem) e, em seguida, FreeConsole () quando terminar.
oltman,
7
CUIDADO: No Windows1.xaml, não podemos usar recursos do aplicativo. Eles ainda não foram carregados: eles são carregados em System.Windows.Application.DoStartup (método interno) e DoStartup é chamado logo após OnStartup.
MuiBienCarlota
26

Para verificar a existência de seu argumento - na solução de Matt, use isso para seu teste:

e.Args.Contains ("MyTriggerArg")

GeekyMonkey
fonte
4

Uma combinação das soluções acima, para .NET 4.0+ com saída para o 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);
}

Altere o construtor em sua MainWindow para aceitar argumentos:

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

E não se esqueça de remover:

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

Você pode usar o seguinte no app.xaml.csarquivo:

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
fonte