WPF命令行

103

我正在尝试创建一个接受命令行参数的WPF应用程序。如果没有传入参数,主窗口应该弹出。对于一些特定的命令行参数,代码应该在没有GUI的情况下运行,并在完成后退出。希望有人可以提供如何正确处理这个问题的建议。

4个回答

162

首先,在您的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)? - Kieran Benton
当然你可以调用Console.WriteLine,但输出不会出现在启动应用程序的控制台上。在WPF应用程序的上下文中,我不确定“Console”是什么。 - Matt Hamilton
39
为了在应用程序启动的控制台中写入内容,您需要调用AttachConsole(-1)、Console.Writeline(message),然后在完成后调用FreeConsole()。 - oltman
7
注意:在Windows1.xaml中,我们不能使用应用资源。它们尚未加载:它们在System.Windows.Application.DoStartup(内部方法)中加载,并且DoStartup在OnStartup之后立即调用。 - MuiBienCarlota

26

要检查您的参数是否存在-在Matt的解决方案中,请使用以下内容进行测试:

e.Args.Contains("MyTriggerArg")


6

将上述解决方案结合起来,针对.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
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接