Dòng lệnh WPF


99

Tôi đang cố gắng tạo một ứng dụng WPF nhận đối số dòng lệnh. Nếu không có đối số nào được đưa ra, cửa sổ chính sẽ bật lên. Trong trường hợp của một số đối số dòng lệnh cụ thể, mã sẽ được chạy mà không có GUI và thoát khi hoàn tất. Bất kỳ đề xuất nào về cách thực hiện đúng cách sẽ được đánh giá cao.

Câu trả lời:


159

Trước tiên, hãy tìm thuộc tính này ở đầu tệp App.xaml của bạn và xóa nó:

StartupUri="Window1.xaml"

Điều đó có nghĩa là ứng dụng sẽ không tự động khởi tạo và hiển thị cửa sổ chính của bạn.

Tiếp theo, ghi đè phương thức OnStartup trong lớp Ứng dụng của bạn để thực hiện logic:

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

Bạn có thể tương tác với bảng điều khiển (Console.ReadLine / WriteLine) tại thời điểm đó không?
Kieran Benton

Chắc chắn bạn có thể gọi Console.WriteLine, nhưng đầu ra sẽ không xuất hiện trên bảng điều khiển mà bạn đã khởi chạy ứng dụng từ đó. Tôi không chắc "Bảng điều khiển" là gì trong ngữ cảnh của ứng dụng WPF.
Matt Hamilton

38
Để ghi vào bảng điều khiển mà ứng dụng đã được khởi chạy, bạn cần gọi AttachConsole (-1), Console.Writeline (tin nhắn) và sau đó là FreeConsole () khi bạn hoàn tất.
oltman

7
LƯU Ý: Trong Windows1.xaml, chúng tôi không thể sử dụng tài nguyên Ứng dụng. Chúng chưa được tải: chúng được tải trong System.Windows.Application.DoStartup (phương thức nội bộ) và DoStartup được gọi ngay sau OnStartup.
MuiBienCarlota

26

Để kiểm tra sự tồn tại của đối số của bạn - trong giải pháp của Matt, hãy sử dụng điều này cho bài kiểm tra của bạn:

e.Args.Contains ("MyTriggerArg")


4

Sự kết hợp của các giải pháp trên, cho .NET 4.0+ với đầu ra cho bảng điều khiển:

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

Thay đổi hàm tạo trong MainWindow của bạn để chấp nhận các đối số:

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

Và đừng quên xóa:

StartupUri="MainWindow.xaml"

1

Bạn có thể sử dụng thông tin bên dưới trong app.xaml.cstệp:

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
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.