【发布时间】:2010-09-30 09:32:35
【问题描述】:
我正在尝试创建一个采用命令行参数的 WPF 应用程序。如果没有给出参数,主窗口应该弹出。在某些特定命令行参数的情况下,代码应该在没有 GUI 的情况下运行并在完成后退出。任何有关如何正确执行此操作的建议将不胜感激。
【问题讨论】:
标签: wpf command-line exit
我正在尝试创建一个采用命令行参数的 WPF 应用程序。如果没有给出参数,主窗口应该弹出。在某些特定命令行参数的情况下,代码应该在没有 GUI 的情况下运行并在完成后退出。任何有关如何正确执行此操作的建议将不胜感激。
【问题讨论】:
标签: wpf command-line exit
上述解决方案的组合,用于 .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"
【讨论】:
您可以在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
}
}
【讨论】:
要检查您的论点是否存在 - 在 Matt 的解决方案中,请使用它进行测试:
e.Args.Contains("MyTriggerArg")
【讨论】:
首先,在 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();
}
【讨论】: