2011-08-26 14 views
5

मैं सोच रहा हूँ कि क्या यह स्वचालित रूप से लोड करने से मेरी मुख्य विंडो 'बंद कर देते हैं' के लिए संभव है जब मेरे कार्यक्रम एक कमांड लाइन तर्क के साथ शुरू होता बिना कार्यक्रम (अर्थात जब एक फ़ाइल नाम पारित हो जाता है)। मेरी समस्या यह है कि मेरा प्रोग्राम तब लोड होता है जब इसके साथ जुड़ी फाइल क्लिक की जाती है, लेकिन ऐसा करने के लिए एक और मुख्य विंडो खोलकर और इसका उपयोग करके ऐसा होता है। मेरी समस्या यह है कि कार्यक्रम अभी भी मेनविंडो को बाद में लॉन्च करता है, इस प्रकार दो विंडोज़ खोलता है, एक फाइल सामग्री के साथ और एक खाली है।सी # - एक खिड़की

मैं कैसे खाली विंडो रोक सकता हूं? जैसा कि मैंने इसे देखा है, मैं या तो इसे मुख्य विंडो खोलने से रोकता हूं, मुख्य विंडो बंद करता हूं या प्रोग्राम को मुख्य विंडो में फ़ाइल पास करता हूं। मेरी समस्या यह है कि मुझे नहीं पता कि इनमें से कौन सा सर्वश्रेष्ठ होगा या इसे कैसे करना है।

protected override void OnStartup(StartupEventArgs e) 
    { 
     if (e.Args != null && e.Args.Count() > 0) 
     { 
      this.Properties["ArbitraryArgName"] = e.Args[0]; 
     } 
     base.OnStartup(e); 

     if (Application.Current.Properties["ArbitraryArgName"] != null) 
     { 

      string fname = Application.Current.Properties["ArbitraryArgName"].ToString(); 
      MainWindow mw = new MainWindow(); 
      mw.Show(); 
      mw.readVcard(fname); 
      Application.Current.Windows. 
     } 
    } 

संपादित करें:

मेरे समाधान नीचे स्थित है

इस कोड है।

+0

कमांड लाइन तर्क पढ़ने का क्या हिस्सा है और यदि यह कुछ मूल्य है, तो मुख्य विंडो नहीं दिखाती है? –

उत्तर

5

मैं तुम्हें WPF का उपयोग मान? आप प्रविष्टि बिंदु (मुख्य) को प्रतिस्थापित करना चाहते हैं जो आपके लिए डब्ल्यूपीएफ आपूर्ति करता है। फिर, आप कमांड लाइन तर्कों के आधार पर WPF प्रारंभ कर सकते हैं या नहीं। अधिक जानकारी के लिए इस सवाल का देखें:

Replacing the WPF entry point

6

मैं तुम्हें अपनी ही Main विधि के साथ एक अलग वर्ग जोड़ सकते हैं और सेट है कि अपने निष्पादन के प्रवेश बिंदु हो सकता है विश्वास करते हैं। फिर आप विधि तर्कों को पार्स कर सकते हैं और या तो मुख्य विंडो ला सकते हैं या नहीं।

(मैं यह सोचते कर रहा हूँ कि यह एक WPF अनुप्रयोग है - यह एक WinForms अनुप्रयोग में सरल आप मूल मुख्य विधि सीधे संशोधित कर सकते हैं के रूप में है।)

+0

धन्यवाद। हाँ, यह डब्ल्यूपीएफ है। मुझे लगता है कि मैं पीछा करता हूं, जांच करूँगा और सुबह वापस आऊंगा। – user646265

+0

डब्ल्यूडब्ल्यूएफ जेनरेट की गई 'मुख्य' विधि को प्रतिस्थापित करने के तरीके के बारे में क्वर्टी का जवाब देखें। –

+1

@Merlyn: नहीं कि संदर्भित प्रश्न के लिए स्वीकृत उत्तर कहता है कि जब आप ऐसा कर सकते हैं, तो उत्तरदाता अभी भी एक अलग वर्ग बनाने की सिफारिश करता है :) –

1

इस प्रकार मैं अपने कोड को फिर से लिखने चाहते हैं:

protected override void OnStartup(StartupEventArgs e) 
{ 
    // start application window 
    MainWindow mw = new MainWindow(); 
    mw.Show(); 
    // store argument and read card info 
    if (e.Args != null && e.Args.Count() > 0) 
    { 
     this.Properties["ArbitraryArgName"] = e.Args[0]; 
     string fname = Application.Current.Properties["ArbitraryArgName"].ToString(); 
     mw.readVcard(fname); 
    } 
} 

मतलब यह है कि विधि MainWindow.readVcard(string) केवल वर्तमान उदाहरण में डेटा लोड करता है।

1

हाय सब लोग और धन्यवाद मेरे पास वापस प्राप्त करने के लिए, माफ करना मैं नहीं वापस जल्दी ही आए हैं। नाट ने जो कहा वह हिस्सा सही था कि मुझे पहले और फिर मेरी विंडो को कॉल करने की आवश्यकता थी, यदि कमांड लाइन तर्क था, तो फ़ाइल नाम को पार्स करें। जैसा कि मैंने देखा था, यह मुद्दा था कि यह अभी भी एक मुख्य विंडो शुरू कर दिया गया था क्योंकि इसे मेरे स्टार्टअप के रूप में सेट किया गया था, इसलिए मैंने अपने ऐप.एक्सएमएल को बदलने के लिए क्वर्टी द्वारा सुझाई गई जानकारी का उपयोग किया, जिसका मतलब था कि यह एक अलग स्टार्टअप की ओर इशारा करता था, बदले में मतलब था कि खिड़की अनावश्यक रूप से खोला नहीं गया था।

'ऐप्स: आवेदन' में App.xaml.cs में वर्ग:

private void OnStartUp(object sender, StartupEventArgs e) 
    { 
     OnStartup(e); 
    } 

    protected override void OnStartup(StartupEventArgs e) 
    { 
     MainWindow mw = new MainWindow(); 

     if (e.Args != null && e.Args.Count() > 0) 
     { 
      this.Properties["ArbitraryArgName"] = e.Args[0]; 
     } 
     //base.OnStartup(e); 

     if (Application.Current.Properties["ArbitraryArgName"] != null) 
     {    
      string fname = Application.Current.Properties["ArbitraryArgName"].ToString(); 

      mw.Show(); 
      mw.readVcard(fname); 
      //Application curApp = Application.Current; 
      //curApp.Shutdown(); 
     } 

     else if (e.Args.Count() == 0) 
     { 
      mw.Show(); 
     } 
    } 

App.xaml में:

<Application x:Class="Vcardviewer.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    
      Startup="OnStartUp" 
      > 
    <Application.Resources> 

    </Application.Resources> 
</Application> 
<!--StartupUri="MainWindow.xaml"--> 

उनके जवाब के लिए हर किसी के लिए एक बार फिर धन्यवाद। आप सभी के लिए धन्यवाद।

0

मैं प्रारंभ URL को हटाने के लिए app.xmal संपादित करता हूं। मैं फिर app.xaml.cs संपादित करता हूं और ऐप के लिए एक कन्स्ट्रक्टर जोड़ता हूं और वहां अपना प्रोसेसिंग करता हूं - मैं एप्लिकेशन को बंद करने के लिए "शटडाउन()" का उपयोग करता हूं।

आप आवश्यकतानुसार खिड़कियां खोल सकते हैं। जब मैं अन्य विंडो लॉन्च करता हूं, तो मैं इसे करने के लिए ऑनस्टार्टअप ईवेंट का उपयोग करता हूं ...