WPF命令行


99

我正在尝试创建一个采用命令行参数的WPF应用程序。如果未提供任何参数,则应弹出主窗口。对于某些特定的命令行参数,代码应在没有GUI的情况下运行,并在完成时退出。任何有关如何适当地做到这一点的建议将不胜感激。

Answers:


159

首先,在您的App.xaml文件顶部找到此属性并将其删除:

StartupUri="Window1.xaml"

这意味着该应用程序不会自动实例化您的主窗口并显示它。

接下来,在您的App类中重写OnStartup方法以执行逻辑:

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

那时您可以与控制台(Console.ReadLine / WriteLine)进行交互吗?
基兰·本顿

当然,您可以调用Console.WriteLine,但输出不会出现在启动应用程序的控制台上。我不确定WPF应用程序的上下文中是什么“控制台”。
马特·汉密尔顿

38
为了写入启动应用程序所在的控制台,完成后,您需要调用AttachConsole(-1),Console.Writeline(message),然后调用FreeConsole()。
oltman'4

7
注意:在Windows1.xaml中,我们无法使用App资源。它们尚未加载:它们已加载到System.Windows.Application.DoStartup(内部方法)中,并在OnStartup之后立即调用DoStartup。
MuiBienCarlota 2012年

26

要检查您的论点是否存在-在Matt的解决方案中,将其用于测试:

e.Args.Contains(“ MyTriggerArg”)


4

.NET 4.0+的上述解决方案的组合,并输出到控制台:

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

在MainWindow中更改构造函数以接受参数:

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

并且不要忘记删除:

StartupUri="MainWindow.xaml"

1

您可以在app.xaml.cs文件中使用以下内容:

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
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.