Ligne de commande WPF


99

J'essaie de créer une application WPF qui prend des arguments de ligne de commande. Si aucun argument n'est donné, la fenêtre principale devrait apparaître. Dans le cas de certains arguments de ligne de commande spécifiques, le code doit être exécuté sans interface graphique et quitter une fois terminé. Toute suggestion sur la façon dont cela devrait être fait correctement serait appréciée.

Réponses:


159

Tout d'abord, recherchez cet attribut en haut de votre fichier App.xaml et supprimez-le:

StartupUri="Window1.xaml"

Cela signifie que l'application n'instanciera pas automatiquement votre fenêtre principale et ne l'affichera pas.

Ensuite, remplacez la méthode OnStartup dans votre classe App pour exécuter la logique:

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

Pouvez-vous interagir avec la console (Console.ReadLine / WriteLine) à ce stade?
Kieran Benton

Vous pouvez certainement appeler Console.WriteLine, mais la sortie n'apparaîtra pas sur la console à partir de laquelle vous avez lancé l'application. Je ne suis pas sûr de ce qu'est la "console" dans le contexte d'une application WPF.
Matt Hamilton

38
Pour écrire dans la console dans laquelle l'application a été lancée, vous devez appeler AttachConsole (-1), Console.Writeline (message), puis FreeConsole () lorsque vous avez terminé.
oltman

7
ATTENTION: dans Windows1.xaml, nous ne pouvons pas utiliser les ressources de l'application. Ils ne sont pas encore chargés: ils sont chargés dans System.Windows.Application.DoStartup (méthode interne) et DoStartup est appelé juste après OnStartup.
MuiBienCarlota

26

Pour vérifier l'existence de votre argument - dans la solution de Matt, utilisez ceci pour votre test:

e.Args.Contains ("MyTriggerArg")


4

Une combinaison des solutions ci-dessus, pour .NET 4.0+ avec sortie vers la 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);
}

Modifiez le constructeur de votre MainWindow pour accepter les arguments:

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

Et n'oubliez pas de supprimer:

StartupUri="MainWindow.xaml"

1

Vous pouvez utiliser ce qui suit dans le app.xaml.csfichier:

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
    }
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.