Baris Perintah WPF


99

Saya mencoba membuat aplikasi WPF yang membutuhkan argumen baris perintah. Jika tidak ada argumen yang diberikan, jendela utama akan muncul. Dalam kasus beberapa argumen baris perintah tertentu, kode harus dijalankan tanpa GUI dan keluar setelah selesai. Setiap saran tentang bagaimana ini harus dilakukan dengan benar akan dihargai.

Jawaban:


159

Pertama, temukan atribut ini di bagian atas file App.xaml Anda dan hapus:

StartupUri="Window1.xaml"

Artinya, aplikasi tidak akan secara otomatis membuat instance jendela utama Anda dan menampilkannya.

Selanjutnya, ganti metode OnStartup di kelas App Anda untuk menjalankan logika:

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

Dapatkah Anda berinteraksi dengan konsol (Console.ReadLine / WriteLine) pada saat itu?
Kieran Benton

Tentu saja Anda bisa memanggil Console.WriteLine, tetapi hasilnya tidak akan muncul di konsol tempat Anda meluncurkan aplikasi. Saya tidak yakin apa itu "Konsol" dalam konteks aplikasi WPF.
Matt Hamilton

38
Untuk menulis ke konsol tempat aplikasi diluncurkan, Anda perlu memanggil AttachConsole (-1), Console.Writeline (pesan), lalu FreeConsole () setelah selesai.
oltman

7
WASPADALAH: Di Windows1.xaml, kami tidak dapat menggunakan sumber daya App. Mereka belum dimuat: mereka dimuat di System.Windows.Application.DoStartup (metode internal) dan DoStartup dipanggil tepat setelah OnStartup.
MuiBienCarlota

26

Untuk memeriksa keberadaan argumen Anda - dalam solusi Matt gunakan ini untuk pengujian Anda:

e.Args.Contains ("MyTriggerArg")


4

Kombinasi dari solusi di atas, untuk .NET 4.0+ dengan keluaran ke 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);
}

Ubah konstruktor di MainWindow Anda untuk menerima argumen:

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

Dan jangan lupa untuk menghapus:

StartupUri="MainWindow.xaml"

1

Anda dapat menggunakan app.xaml.csfile di bawah ini :

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
    }
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.