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.

bingles
quelle

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();
}
Matt Hamilton
quelle
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")

GeekyMonkey
quelle
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"
Kurt Van den Branden
quelle
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
    }
}
Satish Tatikonda
quelle