Командний рядок WPF


99

Я намагаюся створити додаток WPF, який бере аргументи командного рядка. Якщо аргументів не наводиться, головне вікно повинно з’являтися. У випадках деяких конкретних аргументів командного рядка код повинен бути запущений без графічного інтерфейсу та вихід після завершення. Будемо вдячні будь-які пропозиції щодо того, як це правильно зробити.

Відповіді:


159

Спочатку знайдіть цей атрибут у верхній частині файлу App.xaml та видаліть його:

StartupUri="Window1.xaml"

Це означає, що програма не автоматично інстанціює ваше головне вікно і не показує його.

Далі замініть метод OnStartup у вашому класі App для виконання логіки:

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.
Метт Гамільтон

38
Для того, щоб записатись на консоль, на якій запущено додаток, вам потрібно зателефонувати AttachConsole (-1), Console.Writeline (повідомлення), а потім FreeConsole (), коли закінчите.
oltman

7
ПОПЕРЕДЖЕННЯ. У Windows1.xaml ми не можемо використовувати ресурси додатків. Вони ще не завантажені: вони завантажуються в System.Windows.Application.DoStartup (внутрішній метод), а DoStartup викликається відразу після OnStartup.
MuiBienCarlota

26

Щоб перевірити наявність вашого аргументу - у розчині Метта використовуйте це для свого тесту:

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
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.