ฉันจะออกจากแอปพลิเคชัน WPF โดยทางโปรแกรมได้อย่างไร


478

ในไม่กี่ปีที่ฉันใช้ C # (แบบฟอร์ม Windows) ฉันไม่เคยใช้ WPF แต่ตอนนี้ฉันรัก WPF แต่ฉันไม่รู้ว่าฉันควรจะออกจากแอปพลิเคชันของฉันอย่างไรเมื่อผู้ใช้คลิกที่รายการออกจากเมนูจากเมนูไฟล์

ฉันเหนื่อย:

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

ท่ามกลางคนอื่น ๆ ไม่มีอะไรทำงาน

คำตอบ:


781

ในการออกจากแอปพลิเคชันของคุณคุณสามารถโทรได้

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

ตามที่อธิบายไว้ในเอกสารประกอบกับApplication.Shutdownวิธีการที่คุณสามารถปรับเปลี่ยนพฤติกรรมการปิดเครื่องของแอปพลิเคชันของคุณโดยการระบุShutdownMode :

การปิดระบบถูกเรียกโดยปริยายโดย Windows Presentation Foundation (WPF) ในสถานการณ์ต่อไปนี้:

  • เมื่อ ShutdownMode ถูกตั้งค่าเป็น OnLastWindowClose
  • เมื่อตั้งค่า ShutdownMode เป็น OnMainWindowClose
  • เมื่อผู้ใช้สิ้นสุดเซสชันและเหตุการณ์ SessionEnding นั้นไม่ถูกจัดการหรือจัดการโดยไม่มีการยกเลิก

โปรดทราบว่าApplication.Current.Shutdown();อาจเรียกได้จากเธรดที่สร้างApplicationวัตถุเท่านั้นโดยปกติคือเธรดหลัก


8
ขณะที่ฉันชี้ให้เห็นมันไม่แปลก ใน WPF Application เป็นคลาสสแตติก แอปพลิเคชันปัจจุบันอ้างอิงถึงแอปพลิเคชันที่คุณใช้งานอยู่
TimothyP

4
ในความคิดของฉันมันแปลกเล็กน้อยในแง่ที่ว่ามันไม่ชัดเจนในตอนแรกและมันเบี่ยงเบนไปจากรุ่นที่ผ่านมาพอที่จะทิ้งคน มันทำให้รู้สึกสมบูรณ์แบบว่าใช้งานได้แน่นอน
Brian MacKay

20
ถ้าคุณโทรหาApplication.Current.Shutdown();คุณจะไม่คืนเงินในทันที คุณต้องโทรreturn;เช่นนี้
Erwin Mayer

2
ฉันใช้สิ่งนี้จากหน้าต่างหนึ่งปรากฏขึ้นหน้าต่างอื่นและในกรณีที่ window_closed ของหน้าต่างนั้นฉันเพิ่มรหัสนี้ หน้าต่างทั้งหมดหายไป แต่โปรแกรมยังคงทำงานต่อไปหลังจากที่มีการสร้างป๊อปอัปขึ้นมา
diyoda_

7
@ TimothyP ไม่ใช่Applicationไม่ใช่คลาสแบบคงที่ การมีApplication.Currentสมาชิกแบบสแตติกไม่ได้หมายความว่ามันจะเป็นแบบสแตติก แต่เป็นคลาสปกติที่สามารถรับได้
Earth Engine

156

หากคุณต้องการปิดมันจริงๆคุณสามารถใช้Environment.Exit ()ได้ แต่มันก็ไม่ได้สง่างามเลย (เหมือนการสิ้นสุดกระบวนการ)

ใช้มันดังต่อไปนี้:

Environment.Exit(0)

4
Environment.Exit()ต้องการพารามิเตอร์อย่างน้อยหนึ่งตัวคือรหัสออก ใช้Environment.Exit(0)หากคุณไม่กังวลเกี่ยวกับรหัสออก
gbmhunter

24
วิธีนี้ปิดทุกอย่างจริงๆ แอปของฉันกำลังปล่อยให้บางสิ่งบางอย่างทำงานอยู่ (แบบฟอร์มกำลังปิดอยู่ แต่กระบวนการยังทำงานอยู่) ด้วยApplication.Current.Shutdown();
gbmhunter

4
Environment.Exit เป็นวิธีที่เหมาะสมในการปิดแอปพลิเคชันอย่างแน่นอน ด้วย Application.Current.Shutdown คุณสามารถจบลงด้วยแอปพลิเคชันที่ทำงานอยู่อย่างไม่มีกำหนดหากคุณมีรหัสที่ดันตัวเองกลับเข้าไปในดิสแพตเชอร์
Marcus Andrén

เท่ากับ Application.exit (0);
Sayka

ด้วยกิจกรรมApplication.Current.Shutdown();ของฉันClosingถูกเรียกเมื่อฉันเพียงต้องการปิดแอพของฉันทันที ดังนั้นEnvironment.Exit(0);เป็นทางเลือกที่ดีกว่า
FredM

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
สิ่งสำคัญที่ควรทราบที่นี่คือข้อเท็จจริงที่ว่าอัลเลนชี้ให้เห็นข้อเท็จจริงที่สำคัญมาก: หน้าต่างที่เป็นเจ้าของอื่น ๆ ทั้งหมดจะถูกปิด คุณต้องทำให้แน่ใจว่าคุณประกาศความเป็นเจ้าของ หากคุณมีหน้าต่างที่ใช้งานอยู่จากนั้นคุณเปิดอีกหน้าต่างหนึ่ง แต่ยังไม่แสดงหลังจากที่คุณปิดหน้าต่างที่ใช้งานอยู่หน้าต่างที่ซ่อนอยู่จะบังคับให้แอปพลิเคชันทำงานต่อไป คุณจะมีการรั่วไหลของหน่วยความจำที่มีศักยภาพเว้นแต่คุณจะปิดหน้าต่างนั้นผ่านวิธีการอื่น (ตัวจัดการงาน ฯลฯ ) ฉันเคยทดสอบสิ่งนี้
ก.ย.

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()ในหน้าต่างหลักของฉันก็คือฉันได้สังเกตเห็นว่าหากมีข้อผิดพลาดในการออกแบบและฉันยังไม่ได้ประกาศผู้ปกครองของหนึ่งใน windows ของฉันในแอปพลิเคชันถ้าเปิดหน้าต่างนั้นโดยไม่แสดงก่อน ในการปิดหน้าต่างที่ใช้งานล่าสุดฉันเหลือหน้าต่างที่ซ่อนอยู่ที่ทำงานในพื้นหลัง แอปพลิเคชันจะไม่ปิดตัวลง วิธีเดียวที่จะป้องกันการรั่วไหลของหน่วยความจำทั้งหมดสำหรับฉันคือไปที่ตัวจัดการงานเพื่อปิดแอปพลิเคชัน Application.Current.Shutdown()ปกป้องฉันจากข้อบกพร่องการออกแบบที่ไม่ได้ตั้งใจ

นั่นคือจากประสบการณ์ส่วนตัวของฉัน ในที่สุดใช้สิ่งที่ดีที่สุดสำหรับสถานการณ์ของคุณ นี่เป็นเพียงข้อมูลอีกส่วนหนึ่ง


16

ไม่ควรมีข้อความApplication.ShutDown();หรือ.Exit()

Applicationเป็นชั้นคงที่ ไม่ได้อ้างถึงแอปพลิเคชันปัจจุบัน คุณต้องไปที่แอปพลิเคชั่นปัจจุบันแล้วปิดลงเช่นนี้

Application.Current.Shutdown();

8

อีกวิธีที่คุณสามารถทำได้:

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

สิ่งนี้จะบังคับให้ฆ่าแอปพลิเคชันของคุณ ใช้ได้เสมอแม้ในแอปพลิเคชันแบบมัลติเธรด

หมายเหตุ: โปรดระวังอย่าให้ข้อมูลที่ไม่ได้บันทึกในเธรดอื่นสูญหาย


นี้ดูเหมือนว่าไม่สามารถเข้าใจได้: "ในขั้นตอนการทำงานอยู่เสมอ" คุณซ่อมได้หรือไม่? หรืออย่างน้อยก็อธิบายที่นี่ในความคิดเห็นคุณหมายถึงอะไร
Peter Mortensen

สิ่งนี้ไม่สามารถเข้าใจได้บางส่วน: เพียงแคร์แอปพลิเคชันที่มีการบันทึกข้อมูลในไฟล์จากเธรดอื่น คุณซ่อมได้หรือไม่? หรืออย่างน้อยก็อธิบายที่นี่ในความคิดเห็นคุณหมายถึงอะไร
Peter Mortensen

คุณใช้ Google Translate หรือเปล่า
Peter Mortensen

ไม่ฉันไม่ได้ค่าเฉลี่ยของฉันคือเมื่อแอปพลิเคชันทำงานเป็นมัลติเธรดและคุณใช้กระบวนการจะทำงานได้ แต่วิธีอื่นเช่นนี้ปิดไม่ทำงานในแอปพลิเคชันแบบมัลติเธรดเมื่อเธรดอื่นกำลังทำงาน
Ali 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()อย่างไรก็ตาม
Amsakanna

2
ฉันไม่เห็นว่าทำไมคุณควรยืนยัน การยืนยันมากเกินไปเป็นสิ่งที่เลวร้ายมาก ความจริงที่ว่ามีคนพยายามคลิกเพื่อเปิดเมนูไฟล์ย้ายไปจนสุดด้านล่างของเมนูไฟล์แล้วคลิกออกถือว่าเป็นการยืนยันว่าพวกเขาไม่ต้องการใช้แอปพลิเคชันอีกต่อไป

Veer: ในกรณีของฉันหน้าต่างยืนยันจะปรากฏขึ้น แต่แม้ว่าคุณจะเลือก "ยกเลิก" ในการยืนยันแอปหลักก็จะออก
wuminqi

7
JTS: สิ่งนี้ดีกว่าที่จะออกแบบเป็นกรณี ๆ ไป แอปของเราหากมีงานที่กำลังทำงานการออกจากแรงจะทำให้เกิดความเสียหายดังนั้นเราจึงควรแจ้งให้พวกเขาทราบในกล่องโต้ตอบการยืนยัน
wuminqi

3

การสรุปมีวิธีการไม่กี่วิธี

1) การฆ่ากระบวนการซึ่งข้ามขั้นตอนสุดท้ายการจัดการข้อผิดพลาด ฯลฯ :

Process.GetCurrentProcess().Kill();

2) การปิดแอปพลิเคชันปัจจุบันซึ่งอาจเป็นวิธีที่เหมาะสมเพราะเรียกว่าเหตุการณ์การออก:

Application.Current.Shutdown();

หรือ

this.Shutdown();

(เมื่อ clled ในอินสแตนซ์ของ App-class)

3) การปิดแอปปัจจุบัน (ทุกรูปแบบต้องปิด / เสร็จก่อนหน้า):

this.Close(); 

(เมื่อ clled ในอินสแตนซ์ของ App-class)

4)ออกจากสภาพแวดล้อมซึ่งยุติแอป:

Environment.Exit(0);

นอกจากนี้คุณอาจต้องการอ่านเกี่ยวกับ statusses ทางออกที่นี่


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 ไมโครรส"หมายถึง?
Peter Mortensen

คุณจะประสบความสำเร็จได้อย่างไรโดยใช้ Caliburn Micro
Anders

0

หากคุณต้องการออกจากเธรดอื่นที่ไม่ได้สร้างแอปพลิเคชันวัตถุใช้:

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

-2

Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;


2
ยินดีต้อนรับสู่ SO, Alpha-LIon! คำตอบที่ไม่ใช้รหัสเท่านั้นทำให้หมดกำลังใจที่นี่เนื่องจากพวกเขาไม่ได้ให้รายละเอียดว่าปัญหาได้รับการแก้ไขอย่างไร โปรดอัปเดตการแก้ปัญหาของคุณด้วยคำอธิบายวิธีรหัสของคุณแก้ปัญหาของ OP :)
โจเอล

-3

จากรหัส xaml คุณสามารถเรียก SystemCommand ที่กำหนดไว้ล่วงหน้า:

Command="SystemCommands.MinimizeWindowCommand"

ฉันคิดว่านี่ควรเป็นวิธีที่ต้องการ ...


ย่อเล็กสุด! = ออกจากแอปพลิเคชัน ฉันไม่เห็นตัวเลือกออกจากแอพในรายการนั้น ดูเหมือนว่าการจัดการหน้าต่างมากขึ้นและปิดหน้าต่างไม่ได้แปลว่าปิดแอพ msdn.microsoft.com/en-us/library/…
kenny
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.