【问题标题】:WPF Command LineWPF 命令行
【发布时间】:2010-09-30 09:32:35
【问题描述】:

我正在尝试创建一个采用命令行参数的 WPF 应用程序。如果没有给出参数,主窗口应该弹出。在某些特定命令行参数的情况下,代码应该在没有 GUI 的情况下运行并在完成后退出。任何有关如何正确执行此操作的建议将不胜感激。

【问题讨论】:

    标签: wpf command-line exit


    【解决方案1】:

    上述解决方案的组合,用于 .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"
    

    【讨论】:

      【解决方案2】:

      您可以在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
          }
      }
      

      【讨论】:

        【解决方案3】:

        要检查您的论点是否存在 - 在 Matt 的解决方案中,请使用它进行测试:

        e.Args.Contains("MyTriggerArg")

        【讨论】:

          【解决方案4】:

          首先,在 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 应用程序上下文中的“控制台”是什么。
          • 为了写入启动应用程序的控制台,您需要在完成后调用 AttachConsole(-1)、Console.Writeline(message) 和 FreeConsole()。
          • 注意:在 Windows1.xaml 中,我们不能使用 App 资源。它们尚未加载:它们在 System.Windows.Application.DoStartup(内部方法)中加载,并且在 OnStartup 之后调用 DoStartup。
          猜你喜欢
          • 1970-01-01
          • 2011-04-19
          • 1970-01-01
          • 2013-12-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-01
          • 1970-01-01
          相关资源
          最近更新 更多