मैं प्रोग्रामिक रूप से WPF एप्लिकेशन से कैसे बाहर निकल सकता हूं?


477

कुछ वर्षों में मैं C # (Windows प्रपत्र) का उपयोग कर रहा हूं, मैंने कभी भी WPF का उपयोग नहीं किया है। लेकिन, अब मुझे WPF से प्यार है, लेकिन मुझे नहीं पता कि मैं अपने एप्लिकेशन से कैसे बाहर निकलने वाला हूं, जब उपयोगकर्ता फ़ाइल मेनू से एक्जिट मेनू आइटम पर क्लिक करता है।

मैंने कोशिश की है:

this.Dispose();
this.Exit();
Application.ShutDown();
Application.Exit();
Application.Dispose();

कई अन्य के बीच। कुछ भी काम नहीं करता है।

जवाबों:


780

अपने आवेदन से बाहर निकलने के लिए आप कॉल कर सकते हैं

System.Windows.Application.Current.Shutdown();

दस्तावेज़ में वर्णित Application.Shutdownविधि के अनुसार आप अपने आवेदन के शटडाउन व्यवहार को शट डाउन मोड निर्दिष्ट करके भी संशोधित कर सकते हैं :

निम्नलिखित स्थितियों में शटडाउन को विंडोज प्रेजेंटेशन फाउंडेशन (WPF) द्वारा कहा जाता है:

  • जब ShutdownMode OnLastWindowClose पर सेट है।
  • जब ShutdownMode OnMainWindowClose पर सेट है।
  • जब कोई उपयोगकर्ता एक सत्र समाप्त होता है और सत्र आयोजन को या तो बिना रद्द किया जाता है, या रद्द किए बिना नियंत्रित किया जाता है।

कृपया ध्यान दें कि Application.Current.Shutdown();केवल उस थ्रेड से कॉल किया जा सकता है जिसने Applicationऑब्जेक्ट बनाया है , अर्थात सामान्य रूप से मुख्य थ्रेड।


8
जैसा कि मैंने बताया कि यह अजीब नहीं है। WPF में अनुप्रयोग एक स्थिर वर्ग है। Application.Current आपके वर्तमान में चल रहे एप्लिकेशन का संदर्भ है।
तीमुथियुस

4
मेरी राय में, यह इस अर्थ में थोड़ा अजीब है कि यह पहली नज़र में स्पष्ट नहीं है, और यह लोगों को फेंकने के लिए पिछले मॉडल से बस पर्याप्त है। यह बिल्कुल सही समझ में आता है कि यह निश्चित रूप से काम करता है।
ब्रायन मैकके

20
यदि आप फोन Application.Current.Shutdown();करते हैं तो आपका फोंशन तुरंत वापस नहीं आएगा। इसके लिए आपको कॉल return;करना होगा।
इरविन मेयर

2
मैंने इसका उपयोग किया है जहाँ एक विंडो से दूसरी विंडो पॉप अप होती है और उस विंडो के window_closed इवेंट में मैंने यह कोड जोड़ा है। सभी विंडो गायब हो जाती हैं, लेकिन पॉप अप के बनने के बाद भी यह कार्यक्रम चलता रहता है।
दि‍योदा_

7
@TimothyP Applicationनहीं एक स्थिर वर्ग नहीं है। Application.Currentस्थिर सदस्य होने का मतलब यह नहीं है कि यह स्थिर है। इसके बजाय, यह एक सामान्य वर्ग है जिसे व्युत्पन्न किया जा सकता है।
पृथ्वी इंजन

156

यदि आपको वास्तव में इसे बंद करने की आवश्यकता है तो आप पर्यावरण का उपयोग भी कर सकते हैं। बाहर () , लेकिन यह बिल्कुल भी सुंदर नहीं है (प्रक्रिया को समाप्त करने की तरह)।

इसे निम्नानुसार उपयोग करें:

Environment.Exit(0)

4
Environment.Exit()कम से कम एक पैरामीटर, एक निकास कोड की जरूरत है। Environment.Exit(0)यदि आप बाहर निकलने के कोड के बारे में चिंतित नहीं हैं तो उपयोग करें ।
gbmhunter

23
इस विधि ने वास्तव में सब कुछ बंद कर दिया। मेरा ऐप कुछ चालू छोड़ रहा था (फॉर्म बंद हो रहा था, लेकिन एक प्रक्रिया अभी भी चल रही थी)Application.Current.Shutdown();
gbmhunter

4
पर्यावरण। निश्चित रूप से एक आवेदन के बंद सुनिश्चित करने के लिए सही तरीका है। Application.Current.Shutdown के साथ आप आसानी से अनिश्चित काल तक चलने वाले एप्लिकेशन के साथ समाप्त हो सकते हैं यदि आपके पास कोड है जो स्वयं को डिस्पैचर में वापस धकेलता है।
मार्कस एंड्रन

Application.exit (0) के बराबर;
सायका

साथ Application.Current.Shutdown();मेरी Closingघटना बुलाया गया था, जब मैं बस बंद करने के लिए तुरंत अपने एप्लिकेशन चाहता था। तो Environment.Exit(0);बेहतर विकल्प था।
फ्रेडएम

64

जैसा कि wuminqi ने कहा , Application.Current.Shutdown();अपरिवर्तनीय है, और मेरा मानना ​​है कि यह आमतौर पर किसी एप्लिकेशन को बंद करने के लिए मजबूर करने के लिए उपयोग किया जाता है जैसे कि जब कोई उपयोगकर्ता लॉग ऑफ कर रहा हो या विंडोज को बंद कर रहा हो।

इसके बजाय, this.close()अपनी मुख्य विंडो में कॉल करें । यह विंडो पर Alt+ F4या करीब [x] बटन दबाने जैसा ही है । यह अन्य सभी स्वामित्व वाली खिड़कियों को बंद करने का कारण बनेगा और कॉलिंग समाप्त होने तक बंद रहेगा Application.Current.Shutdown();जब तक कि करीबी कार्रवाई रद्द नहीं हुई। कृपया विंडो बंद करने पर MSDN प्रलेखन देखें ।

इसके अलावा, क्योंकि this.close()रद्द करने योग्य आप समापन ईवेंट हैंडलर में एक परिवर्तन परिवर्तन पुष्टि संवाद में डाल सकते हैं। बस एक घटना के लिए हैंडलर बनाते हैं <Window Closing="...">और e.Cancelतदनुसार बदलते हैं । (यह कैसे करें के बारे में अधिक जानकारी के लिए MSDN प्रलेखन देखें ।)


2
+1 मैंने इस एक के साथ जाने का फैसला किया, खासकर जब से मुझे वास्तव में आवेदन छोड़ने से पहले खुली फ़ाइलों को सहेजने की आवश्यकता है।
AgentKnopf

2
यहां ध्यान देने वाली एक महत्वपूर्ण बात यह है कि एलन ने एक बहुत महत्वपूर्ण तथ्य बताया: अन्य सभी स्वामित्व वाली खिड़कियां बंद हो जाएंगी। आपको यह सुनिश्चित करना होगा कि आप स्वामित्व की घोषणा करें। यदि आपके पास एक विंडो है जो चल रही है और फिर आप दूसरी विंडो खोलते हैं, लेकिन इसे अभी तक नहीं दिखाते हैं, तो सक्रिय विंडो को बंद करने के बाद, छिपी हुई विंडो एप्लिकेशन को चालू रखने के लिए मजबूर कर देगी। जब तक आप उस विंडो को अन्य माध्यमों (कार्य प्रबंधक, आदि) के माध्यम से बंद नहीं करेंगे, आपके पास एक संभावित मेमोरी लीक होगा। मैंने इसका परीक्षण किया है।
BK

35

आवश्यकतानुसार निम्नलिखित में से किसी का उपयोग करें:

1।

 App.Current.Shutdown();
OR
 Application.Current.Shutdown();

2।

 App.Current.MainWindow.Close();
OR
 Application.Current.MainWindow.Close();

ऊपर से सभी तरीके बुलाएंगे closing event के Windowवर्ग और निष्पादन कुछ बिंदु पर बंद कर सकता है (कारण आमतौर पर अनुप्रयोगों संवादों डाल की तरह 'आप सुनिश्चित हैं?' या ' चाहेंगे आप बंद करने से पहले डेटा को बचाने के लिए पसंद है? ', इससे पहले कि एक खिड़की पूरी तरह से बंद कर दिया है)

3. लेकिन अगर आप आवेदन को बिना किसी चेतावनी के तुरंत समाप्त करना चाहते हैं । नीचे उपयोग करें

   Environment.Exit(0);


18

यहाँ मेरा कैसे काम है:

// Any control that causes the Window.Closing even to trigger.
private void MenuItemExit_Click(object sender, RoutedEventArgs e)
{
    this.Close();
}

// Method to handle the Window.Closing event.
private void Window_Closing(object sender, CancelEventArgs e)
{
    var response = MessageBox.Show("Do you really want to exit?", "Exiting...",
                                   MessageBoxButton.YesNo, MessageBoxImage.Exclamation);
    if (response == MessageBoxResult.No)
    {
        e.Cancel = true;
    }
    else
    {
        Application.Current.Shutdown();
    }
}

मैं केवल Application.Current.ShutDown()मुख्य एप्लिकेशन विंडो से कॉल करता हूं , अन्य सभी विंडो उपयोग करते हैं this.Close()। मेरी मुख्य विंडो में, Window_Closing(...)ऊपर दाहिने xबटन को हैंडल करता है । यदि कोई विधि विंडो के करीब बुलाती है, Window_Closing(...)तो उपयोगकर्ता की पुष्टि होने पर घटना को बंद कर देता है।

Application.Current.Shutdown()मेरे मुख्य विंडो में वास्तव में उपयोग करने का कारण यह है कि मैंने देखा है कि यदि कोई डिजाइन गलती की गई थी और मैंने एक आवेदन में अपनी विंडो में से एक के माता-पिता को घोषित नहीं किया है, अगर उस विंडो को पूर्व में दिखाए बिना खोला गया है अंतिम सक्रिय विंडो बंद होने के बाद, मैं पृष्ठभूमि में चल रही एक छिपी खिड़की के साथ छोड़ दिया जाता हूं। आवेदन बंद नहीं होगा। पूर्ण मेमोरी रिसाव को रोकने का एकमात्र तरीका मेरे लिए आवेदन बंद करने के लिए कार्य प्रबंधक में जाना है । Application.Current.Shutdown()मुझे अनजाने डिज़ाइन दोषों से बचाता है।

वह मेरे निजी अनुभव से है। अंत में, अपने परिदृश्य के लिए सबसे अच्छा उपयोग करें। यह सिर्फ जानकारी का एक और टुकड़ा है।


16

वहाँ एक नहीं होना चाहिए Application.ShutDown();या .Exit()संदेश।

Applicationएक स्थिर वर्ग है। यह वर्तमान एप्लिकेशन का संदर्भ नहीं देता है। आपको वर्तमान एप्लिकेशन पर जाना होगा और फिर इसे इस तरह से बंद करना होगा:

Application.Current.Shutdown();

8

एक और तरीका आप यह कर सकते हैं:

System.Diagnostics.Process.GetCurrentProcess().Kill();

यह आपके आवेदन को मार देगा। यह हमेशा काम करता है, यहां तक ​​कि एक बहु-थ्रेडेड एप्लिकेशन में भी।

नोट: बस किसी अन्य थ्रेड में बिना सहेजे गए डेटा को न खोएं, इसके लिए सावधान रहें।


यह समझ से बाहर है: "प्रक्रिया हमेशा काम करती है" । क्या आप इसे ठीक कर सकते हैं? या कम से कम यहाँ टिप्पणियों में समझाएं कि आपका क्या मतलब है?
पीटर मोर्टेंसन

यह भी आंशिक रूप से समझ से बाहर है: बस एक ऐसे अनुप्रयोग के बारे में ध्यान रखें जो डेटा को दूसरे थ्रेड से फ़ाइलों में सहेजता है। क्या आप इसे ठीक कर सकते हैं? या कम से कम यहाँ टिप्पणियों में समझाएं कि आपका क्या मतलब है?
पीटर मोर्टेंसन

क्या आप गूगल अनुवाद का उपयोग कर रहे हैं?
पीटर मोर्टेंसन

नहीं, मेरा मतलब यह नहीं है कि जब आवेदन मल्टी थ्रेड के रूप में चल रहा है और आप प्रोसेस का उपयोग कर रहे हैं। तो यह काम करेगा, लेकिन इस तरह से एक और तरीका। एक अन्य थ्रेड चल रहा है जब मल्टीथ्रेड एप्लिकेशन में काम नहीं कर रहा है।
अली Yousefi

6
private void _MenuExit_Click(object sender, RoutedEventArgs e)
{
   System.Windows.Application.Current.MainWindow.Close();
}

//Override the onClose method in the Application Main window

protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
    MessageBoxResult result =   MessageBox.Show("Do you really want to close", "",
                                          MessageBoxButton.OKCancel);
    if (result == MessageBoxResult.Cancel)
    {
       e.Cancel = true;
    }
    base.OnClosing(e);
}

यह सवाल का जवाब नहीं है, वह केवल जानना चाहता है कि wpf एप्लिकेशन से कैसे बाहर निकलें।
mehdi


6

मेरी समझ के अनुसार, Application.Current.Shutdown()इसकी कमियां भी हैं।

यदि आप उपयोगकर्ताओं को छोड़ने या नहीं की पुष्टि करने के लिए एक पुष्टि विंडो दिखाना चाहते हैं, Application.Current.Shutdown()तो अपरिवर्तनीय है।


7
मुझे यह समझ में नहीं आता है। Application.Current.Shutdown()हालांकि कॉल करने से पहले हम उपयोगकर्ता की पुष्टि प्राप्त कर सकते हैं ।
अनमस्कन्ना

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

वीर: मेरे मामले में, पुष्टि विंडो दिखाई देती है, लेकिन यहां तक ​​कि जब आप पुष्टि में "रद्द करें" चुनते हैं, तो मुख्य एपीपी बाहर निकलता है।
वुमंकी

7
JTS: यह केस के हिसाब से डिजाइन किया जाना बेहतर है। हमारा ऐप, अगर कोई काम चल रहा है, तो बाहर निकलने पर नुकसान होगा, इसलिए हमने पुष्टि संवाद में उन्हें सूचित करने के लिए बेहतर है
wuminqi

3

संक्षेप में, ऐसा करने के कुछ तरीके हैं।

1) प्रक्रिया को मारना, जो अंतिम रूप को छोड़ते हैं, त्रुटि से निपटने आदि।:

Process.GetCurrentProcess().Kill();

2) वर्तमान एप्लिकेशन को बंद करना, जो शायद उचित तरीका है क्योंकि यह निकास घटनाओं को कॉल करता है:

Application.Current.Shutdown();

या

this.Shutdown();

(जब ऐप-क्लास के एक उदाहरण में उलझ गया)

3) वर्तमान ऐप बंद करना (सभी फॉर्म को पहले बंद / समाप्त करना होगा):

this.Close(); 

(जब ऐप-क्लास के एक उदाहरण में उलझ गया)

4) पर्यावरण से बाहर निकलना, जो एप्लिकेशन को समाप्त करता है:

Environment.Exit(0);

इसके अलावा, आप यहां निकलने वाले स्टैचू के बारे में पढ़ना चाह सकते हैं


2

कैलीबर्न सूक्ष्म स्वाद वाला

public class CloseAppResult : CancelResult
{
    public override void Execute(CoroutineExecutionContext context)
    {
        Application.Current.Shutdown();
        base.Execute(context);
    }
}

public class CancelResult : Result
{
    public override void Execute(CoroutineExecutionContext context)
    {
        OnCompleted(this, new ResultCompletionEventArgs { WasCancelled = true });
    }
}

क्या करता है "Caliburn सूक्ष्म स्वाद वाले" मतलब?
पीटर मोर्टेंसन

कैसे आप इसे Caliburn Micro
Anders

0

यदि आप किसी अन्य थ्रेड से बाहर निकलना चाहते हैं जो एप्लिकेशन ऑब्जेक्ट का उपयोग नहीं करता है:

System.Windows.Application.Current.Dispatcher.InvokeShutdown();

-2

Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;


2
एसओ, अल्फा-लियोन में आपका स्वागत है! कोड-केवल उत्तर यहां हतोत्साहित किए जाते हैं, क्योंकि वे इस बात की कोई जानकारी नहीं देते हैं कि समस्या कैसे हल की गई। कृपया अपने समाधान को इस स्पष्टीकरण के साथ अपडेट करें कि आपका कोड ओपी की समस्या का हल कैसे करता है :)
जोएल

-3

Xaml कोड से आप एक पूर्वनिर्धारित SystemCommand कह सकते हैं:

Command="SystemCommands.MinimizeWindowCommand"

मुझे लगता है कि यह पसंदीदा तरीका होना चाहिए ...


कम से कम! = बाहर निकलें आवेदन। मुझे उस सूची में एक एग्ज़िट ऐप का विकल्प नहीं दिखता है। अधिक खिड़की प्रबंधन लगता है और करीब खिड़की जरूरी एप्लिकेशन मतलब नहीं है। msdn.microsoft.com/en-us/library/…
केनी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.