WPF कमांड लाइन


99

मैं एक WPF एप्लिकेशन बनाने की कोशिश कर रहा हूं जो कमांड लाइन आर्ग्युमेंट्स लेता है। यदि कोई तर्क नहीं दिया जाता है, तो मुख्य विंडो पॉप अप होनी चाहिए। कुछ विशिष्ट कमांड लाइन तर्कों के मामलों में, कोड को कोई GUI के साथ नहीं चलाया जाना चाहिए और समाप्त होने पर बाहर निकलना चाहिए। यह कैसे ठीक से किया जाना चाहिए पर किसी भी सुझाव की सराहना की जाएगी।

जवाबों:


159

सबसे पहले, अपने App.xaml फ़ाइल के शीर्ष पर इस विशेषता को ढूंढें और इसे हटा दें:

StartupUri="Window1.xaml"

इसका मतलब है कि एप्लिकेशन स्वचालित रूप से आपकी मुख्य विंडो को तुरंत नहीं दिखाएगा और इसे दिखाएगा।

अगला, लॉजिक करने के लिए अपने ऐप क्लास में ऑनस्टार्टअप विधि को ओवरराइड करें:

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) के साथ बातचीत कर सकते हैं?
कीरन बेंटन

निश्चित रूप से आप Console.WriteLine को कॉल कर सकते हैं, लेकिन आउटपुट उस कंसोल पर दिखाई नहीं देगा जिससे आपने ऐप लॉन्च किया था। मुझे यकीन नहीं है कि WPF एप्लिकेशन के संदर्भ में "कंसोल" क्या है।
मैट हैमिल्टन

38
कंसोल में लिखने के लिए जिसमें ऐप लॉन्च किया गया था, आपको काम करते समय AttachConsole (-1), Console.Writeline (संदेश), और फिर FreeConsole () कॉल करने की आवश्यकता होती है।
ओल्टमन

7
BEWARE: Windows1.xaml में, हम ऐप संसाधनों का उपयोग नहीं कर सकते हैं। वे अभी तक लोड नहीं किए गए हैं: वे System.Windows.Application.DoStartup (आंतरिक विधि) में लोड किए गए हैं और DoStartup को OnStartup के ठीक बाद कहा जाता है।
मुईबिएन कर्लोटा

26

अपने तर्क के अस्तित्व की जांच करने के लिए - मैट के समाधान में अपने परीक्षण के लिए इसका उपयोग करें:

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

अपने मेनवॉन्डर में कंस्ट्रक्टर को तर्क स्वीकार करने के लिए अलर्ट करें:

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
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.