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.

bingles
la source

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

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