Wiersz poleceń WPF

99

Próbuję utworzyć aplikację WPF, która przyjmuje argumenty wiersza polecenia. Jeśli nie podano żadnych argumentów, powinno pojawić się główne okno. W przypadku niektórych konkretnych argumentów wiersza poleceń kod powinien być uruchamiany bez GUI i kończyć po zakończeniu. Wszelkie sugestie dotyczące tego, jak należy to właściwie zrobić, będą mile widziane.

bingles
źródło

Odpowiedzi:

159

Najpierw znajdź ten atrybut u góry pliku App.xaml i usuń go:

StartupUri="Window1.xaml"

Oznacza to, że aplikacja nie utworzy automatycznie wystąpienia głównego okna i nie pokaże go.

Następnie przesłoń metodę OnStartup w klasie App, aby wykonać logikę:

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();
}
Matt Hamilton
źródło
Czy w tym momencie możesz współdziałać z konsolą (Console.ReadLine / WriteLine)?
Kieran Benton
Z pewnością możesz wywołać Console.WriteLine, ale dane wyjściowe nie pojawią się na konsoli, z której uruchomiłeś aplikację. Nie jestem pewien, czym jest „Konsola” w kontekście aplikacji WPF.
Matt Hamilton,
38
Aby napisać do konsoli, w której aplikacja została uruchomiona, po zakończeniu należy wywołać AttachConsole (-1), Console.Writeline (komunikat), a następnie FreeConsole ().
oltman
7
UWAGA: w Windows1.xaml nie możemy korzystać z zasobów aplikacji. Nie są jeszcze załadowane: są ładowane w System.Windows.Application.DoStartup (metoda wewnętrzna), a DoStartup jest wywoływana tuż po OnStartup.
MuiBienCarlota
26

Aby sprawdzić istnienie argumentu - w rozwiązaniu Matta użyj tego do testu:

e.Args.Contains („MyTriggerArg”)

GeekyMonkey
źródło
4

Połączenie powyższych rozwiązań dla .NET 4.0+ z wyjściem na konsolę:

[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);
}

Zmień konstruktor w swoim MainWindow, aby akceptował argumenty:

public partial class MainWindow : Window
{
    public MainWindow(StartupEventArgs e)
    {
        InitializeComponent();
    }
}

I nie zapomnij usunąć:

StartupUri="MainWindow.xaml"
Kurt Van den Branden
źródło
1

Możesz użyć poniższego w app.xaml.cspliku:

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
    }
}
Satish Tatikonda
źródło