WPF Komut Satırı


99

Komut satırı bağımsız değişkenlerini alan bir WPF uygulaması oluşturmaya çalışıyorum. Herhangi bir argüman verilmemişse, ana pencere açılmalıdır. Bazı özel komut satırı argümanları durumunda, kod GUI olmadan çalıştırılmalı ve bittiğinde çıkılmalıdır. Bunun nasıl düzgün bir şekilde yapılması gerektiğine dair herhangi bir öneri takdir edilecektir.

Yanıtlar:


159

Öncelikle, bu özelliği App.xaml dosyanızın en üstünde bulun ve kaldırın:

StartupUri="Window1.xaml"

Bu, uygulamanın ana pencerenizi otomatik olarak başlatmayacağı ve göstermeyeceği anlamına gelir.

Ardından, mantığı gerçekleştirmek için App sınıfınızdaki OnStartup yöntemini geçersiz kılın:

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

Bu noktada konsol (Console.ReadLine / WriteLine) ile etkileşime girebilir misiniz?
Kieran Benton

Kesinlikle Console.WriteLine'ı çağırabilirsiniz, ancak çıktı, uygulamayı başlattığınız konsolda görünmez. Bir WPF uygulaması bağlamında "Konsol" un ne olduğundan emin değilim.
Matt Hamilton

38
Uygulamanın başlatıldığı konsola yazmak için, AttachConsole (-1), Console.Writeline (mesaj) ve işiniz bittiğinde FreeConsole () çağırmanız gerekir.
oltman

7
DİKKAT: Windows1.xaml'de, Uygulama kaynaklarını kullanamayız. Henüz yüklenmezler: System.Windows.Application.DoStartup'a (dahili yöntem) yüklenirler ve DoStartup, OnStartup'tan hemen sonra çağrılır.
MuiBienCarlota

26

Argümanınızın varlığını kontrol etmek için - Matt'in çözümünde bunu testiniz için kullanın:

e.Args.Contains ("MyTriggerArg")


4

Konsola çıkışla .NET 4.0+ için yukarıdaki çözümlerin bir kombinasyonu:

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

Argümanları kabul etmek için MainWindow'unuzdaki yapıcıyı değiştirin:

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

Ve kaldırmayı unutmayın:

StartupUri="MainWindow.xaml"

1

Aşağıdakileri app.xaml.csdosyada kullanabilirsiniz :

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
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.