บรรทัดคำสั่ง WPF


99

ฉันกำลังพยายามสร้างแอปพลิเคชัน WPF ที่รับอาร์กิวเมนต์บรรทัดคำสั่ง หากไม่มีการโต้แย้งหน้าต่างหลักจะปรากฏขึ้น ในกรณีของอาร์กิวเมนต์บรรทัดคำสั่งที่เฉพาะเจาะจงโค้ดควรรันโดยไม่มี GUI และออกเมื่อเสร็จสิ้น ข้อเสนอแนะใด ๆ เกี่ยวกับวิธีการนี้จะได้รับการชื่นชมอย่างถูกต้อง

คำตอบ:


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
Matt Hamilton

38
ในการเขียนไปยังคอนโซลที่แอปเปิดตัวคุณต้องเรียก AttachConsole (-1), Console.Writeline (ข้อความ) แล้วกด FreeConsole () เมื่อคุณทำเสร็จแล้ว
oltman

7
ระวัง: ใน Windows1.xaml เราไม่สามารถใช้ทรัพยากรของแอพได้ พวกเขายังไม่โหลด: โหลดใน System.Windows.Application.DoStartup (วิธีการภายใน) และ DoStartup ถูกเรียกหลังจาก OnStartup
MuiBienCarlota

26

เพื่อตรวจสอบการมีอยู่ของข้อโต้แย้งของคุณ - ในโซลูชันของ Matt ให้ใช้สิ่งนี้สำหรับการทดสอบ

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
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.