web-dev-qa-db-fra.com

Ligne de commande WPF

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 manière de procéder correctement serait appréciée.

97
bingles

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 effectuer 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();
}
156
Matt Hamilton

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

e.Args.Contains ("MyTriggerArg")

26
GeekyMonkey

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"
4

Vous pouvez utiliser ce qui suit dans app.xaml.cs fichier :

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
    }
}
1
Satish Tatikonda