web-dev-qa-db-fra.com

Arguments de ligne de commande WPF, un moyen intelligent?

Je cherche un moyen d'analyser les arguments de ligne de commande dans mon application WPF avec juste un moyen de lire la valeur de l'argument transmis par l'utilisateur.

Par exemple

application.exe /setTime 5

existe-t-il un moyen pour moi d'avoir un code où je peux simplement dire:

MessageBox.Show(arg("setTime"));

Qui affichera 5

Solution de travail

Comment créer des arguments de ligne de commande WPF intelligents

42
Sandeep Bansal

La façon dont je le fais toujours est de spécifier les arguments comme une paire "nom"/"valeur" par ex.

myprogram.exe -arg1 value1 -arg2 value2

Cela signifie que lorsque vous analysez la ligne de commande, vous pouvez placer les paires argument/valeur dans un Dictionary avec l'argument comme clé. Votre arg("SetTime") deviendra alors:

MessageBox.Show(dictionary["SetTime"]);

(Évidemment, vous ne voulez pas que le dictionnaire réel soit public.)

Pour obtenir les arguments en premier lieu, vous pouvez utiliser:

string[] args = Environment.GetCommandLineArgs();

Cela renverra tous les arguments, vous devrez donc analyser le tableau par étapes de deux (après avoir d'abord vérifié que la longueur est un multiple de deux + 1):

Le premier élément du tableau est le nom du programme en cours d'exécution - Page MSDN - donc votre boucle doit commencer par un:

for (int index = 1; index < args.Length; index += 2)
{
     dictionary.Add(args[index], args[index+1]);
}

Cela boucle par étapes de deux lorsque vous définissez chaque argument est une paire de valeurs: l'identifiant et la valeur réelle elle-même, par exemple.

my.exe -arg1 value1 -arg2 value2

Ensuite, vous pouvez simplement voir si l'argument est spécifié en voyant si la clé -arg1 Est dans le dictionnaire, puis lire sa valeur:

string value;
if (dictionary.TryGetValue(arg, out value))
{
    // Do what ever with the value
}

Cela signifie que vous pouvez avoir les arguments dans n'importe quel ordre et omettre tous les arguments que vous ne souhaitez pas spécifier.

91
ChrisF

Il existe une autre façon de procéder dans WPF. Voici un article à ce sujet, et voici les étapes à suivre:

Tout d'abord, vous ouvrez App.xaml et vous ajoutez Startup="Application_Startup" après le StartupUri="Window1.xaml", donc votre App.xaml ressemblera à ceci:

<Application x:Class="ParametersForWPF.App"
    xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
    StartupUri="Window1.xaml"
    Startup="Application_Startup">
    <Application.Resources>
    </Application.Resources>
</Application>

Puis fonction Application_Startup sera automatiquement ajouté à votre App.xaml.cs fichier:

public partial class App : Application
{
    private void Application_Startup(object sender, StartupEventArgs e)
    {

    }
}

Maintenant, à l'intérieur de cette fonction, vous pouvez vérifier le args envoyé à l'application. Un exemple pour ce faire est:

private void Application_Startup(object sender, StartupEventArgs e)
{
    foreach(string s in e.Args)
    {
        MessageBox.Show(s);
    }
}

Si vous en avez besoin en tant que Dictionary, vous pouvez facilement implémenter réponse de ChrisF à l'intérieur du Application_Startup une fonction.

0
Paul Karam