Riga di comando WPF


99

Sto cercando di creare un'applicazione WPF che accetta gli argomenti della riga di comando. Se non vengono forniti argomenti, dovrebbe apparire la finestra principale. In caso di alcuni argomenti della riga di comando specifici, il codice dovrebbe essere eseguito senza GUI ed uscire al termine. Sarebbe apprezzato qualsiasi suggerimento su come farlo correttamente.

Risposte:


159

Innanzitutto, trova questo attributo nella parte superiore del tuo file App.xaml e rimuovilo:

StartupUri="Window1.xaml"

Ciò significa che l'applicazione non creerà automaticamente un'istanza della finestra principale e la mostrerà.

Successivamente, sovrascrivi il metodo OnStartup nella tua classe App per eseguire la logica:

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

Puoi interagire con la console (Console.ReadLine / WriteLine) a quel punto?
Kieran Benton

Sicuramente puoi chiamare Console.WriteLine, ma l'output non apparirà sulla console da cui hai lanciato l'app. Non sono sicuro di cosa sia "Console" nel contesto di un'applicazione WPF.
Matt Hamilton

38
Per scrivere sulla console in cui è stata avviata l'app, è necessario chiamare AttachConsole (-1), Console.Writeline (messaggio) e quindi FreeConsole () quando hai finito.
oltman

7
ATTENZIONE: in Windows1.xaml, non possiamo utilizzare le risorse dell'app. Non sono ancora caricati: vengono caricati in System.Windows.Application.DoStartup (metodo interno) e DoStartup viene chiamato subito dopo OnStartup.
MuiBienCarlota

26

Per verificare l'esistenza del tuo argomento, nella soluzione di Matt usa questo per il tuo test:

e.Args.Contains ("MyTriggerArg")


4

Una combinazione delle soluzioni precedenti, per .NET 4.0+ con output sulla 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);
}

Modifica il costruttore nella tua MainWindow per accettare argomenti:

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

E non dimenticare di rimuovere:

StartupUri="MainWindow.xaml"

1

È possibile utilizzare quanto segue nel app.xaml.csfile:

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
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.