WPF-Befehlszeile


99

Ich versuche, eine WPF-Anwendung zu erstellen, die Befehlszeilenargumente akzeptiert. Wenn keine Argumente angegeben werden, sollte das Hauptfenster angezeigt werden. In Fällen bestimmter Befehlszeilenargumente sollte Code ohne GUI ausgeführt und nach Abschluss beendet werden. Vorschläge, wie dies richtig gemacht werden sollte, wären willkommen.

Antworten:


159

Suchen Sie zuerst dieses Attribut oben in Ihrer App.xaml-Datei und entfernen Sie es:

StartupUri="Window1.xaml"

Das bedeutet, dass die Anwendung Ihr Hauptfenster nicht automatisch instanziiert und anzeigt.

Überschreiben Sie als Nächstes die OnStartup-Methode in Ihrer App-Klasse, um die Logik auszuführen:

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

Können Sie zu diesem Zeitpunkt mit der Konsole (Console.ReadLine / WriteLine) interagieren?
Kieran Benton

Natürlich können Sie Console.WriteLine aufrufen, aber die Ausgabe wird nicht auf der Konsole angezeigt, von der aus Sie die App gestartet haben. Ich bin nicht sicher, was "Konsole" im Kontext einer WPF-Anwendung ist.
Matt Hamilton

38
Um in die Konsole zu schreiben, in der die App gestartet wurde, müssen Sie AttachConsole (-1), Console.Writeline (Nachricht) und dann FreeConsole () aufrufen, wenn Sie fertig sind.
Oltman

7
ACHTUNG: In Windows1.xaml können wir keine App-Ressourcen verwenden. Sie sind noch nicht geladen: Sie werden in System.Windows.Application.DoStartup (interne Methode) geladen und DoStartup wird direkt nach OnStartup aufgerufen.
MuiBienCarlota

26

Um die Existenz Ihres Arguments zu überprüfen, verwenden Sie dies in Matts Lösung für Ihren Test:

e.Args.Contains ("MyTriggerArg")


4

Eine Kombination der oben genannten Lösungen für .NET 4.0+ mit Ausgabe an die Konsole:

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

Ändern Sie den Konstruktor in Ihrem MainWindow, um Argumente zu akzeptieren:

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

Und vergessen Sie nicht zu entfernen:

StartupUri="MainWindow.xaml"

1

Sie können das Folgende in der app.xaml.csDatei verwenden:

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
    }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.