Командная строка WPF

99

Я пытаюсь создать приложение WPF, которое принимает аргументы командной строки. Если аргументы не указаны, должно появиться главное окно. В случаях использования некоторых конкретных аргументов командной строки код следует запускать без графического интерфейса и завершать работу по завершении. Будем признательны за любые предложения о том, как это должно быть сделано должным образом.

запой
источник

Ответы:

159

Сначала найдите этот атрибут в верхней части файла App.xaml и удалите его:

StartupUri="Window1.xaml"

Это означает, что приложение не будет автоматически создавать экземпляр вашего главного окна и отображать его.

Затем переопределите метод 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 (сообщение), а затем FreeConsole (), когда вы закончите.
oltman 05
7
ВНИМАНИЕ: в Windows1.xaml мы не можем использовать ресурсы приложения. Они еще не загружены: они загружаются в System.Windows.Application.DoStartup (внутренний метод), а DoStartup вызывается сразу после OnStartup.
MuiBienCarlota
26

Чтобы проверить наличие вашего аргумента - в решении Мэтта используйте это для своего теста:

e.Args.Contains ("MyTriggerArg")

GeekyMonkey
источник
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
    }
}
Сатиш Татиконда
источник