WPF命令行参数,一种聪明的方式?

San*_*sal 42 c# wpf command-line-arguments

我正在寻找一种方法,我可以将命令行参数解析到我的WPF应用程序中,只需一种方法来读取用户传递的参数的值.

举个例子

application.exe /setTime 5
Run Code Online (Sandbox Code Playgroud)

有没有办法让我有一些代码我可以说:

MessageBox.Show(arg("setTime"));
Run Code Online (Sandbox Code Playgroud)

哪个会输出 5

工作方案

如何创建智能WPF命令行参数

Chr*_*isF 95

解析命令行时,将参数/值对放在a中Dictionary,并将参数作为键.然后你的arg("SetTime")意志将成为:

myprogram.exe -arg1 value1 -arg2 value2
Run Code Online (Sandbox Code Playgroud)

(显然你不希望实际的字典公开.)

要获得参数,您可以使用:

MessageBox.Show(dictionary["SetTime"]);
Run Code Online (Sandbox Code Playgroud)

这将返回所有参数,因此您需要以两步为单位解析数组(在首先检查长度是2 + 1的倍数之后):

数组的第一个元素是执行程序的名称 - MSDN页面 - 所以你的循环需要从一个开始:

string[] args = Environment.GetCommandLineArgs();
Run Code Online (Sandbox Code Playgroud)

当你定义每个参数是一对值时,它以两步为循环:标识符和实际值本身,例如

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

然后你可以通过查看键-arg1是否在字典中然后读取它的值来查看是否指定了参数:

my.exe -arg1 value1 -arg2 value2
Run Code Online (Sandbox Code Playgroud)

这意味着您可以按任何顺序获取参数,并省略您不想指定的任何参数.

  • 没有Mono.Options http://nuget.org/packages/Mono.Options,我永远不会离开家 (7认同)
  • 如果给出的参数数量不均匀怎么办?为了避免异常使用(int index = 1; index <args.Length - 1; index + = 2) (3认同)
  • @ChrisF--这是你的设计决定,这个答案表明这是系统工作的唯一方式,这是错误的.例如你可以简单地做这个my.exe -dothis -dhathat而不需要值甚至使用 - 在参数之前是你的设计决定.参数没有成对指定,因此任何开发人员都可以随意做.答案另有说法.或者你也可以使用my.exe -dothis:haha -dothat:hehe它就是你想要如何设计你的软件.你毫无疑问地回答了这个问题.我的评论是为了帮助扩大可能性. (3认同)
  • 我不相信每个论点都是一对价值观.这是您的软件,因此您可以决定各种参数的含义.它们是由空格分隔的值.请参阅MDSN页面.要看到它们,只需使用它:Console.WriteLine("{0}",String.Join(",",Environment.GetCommandLineArgs())); (2认同)

Pau*_*ram 5

在 WPF 中还有另一种方法可以做到这一点。这是一篇关于它的文章,这里是要采取的步骤:

首先,您打开App.xaml并在Startup="Application_Startup"之后添加StartupUri="Window1.xaml",因此您App.xaml将如下所示:

<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>
Run Code Online (Sandbox Code Playgroud)

然后函数Application_Startup将自动添加到您的App.xaml.cs文件中:

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

    }
}
Run Code Online (Sandbox Code Playgroud)

现在在此函数中,您可以检查args发送到应用程序的内容。这样做的一个例子是:

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

如果您需要它们,Dictionary那么您可以轻松地在函数内实现ChrisF 的答案Application_Startup