Bagaimana cara keluar dari aplikasi WPF secara terprogram?

478

Dalam beberapa tahun saya telah menggunakan C # (Windows Forms), saya tidak pernah menggunakan WPF. Tapi, sekarang saya suka WPF, tapi saya tidak tahu bagaimana saya harus keluar dari aplikasi saya ketika pengguna mengklik item menu Keluar dari menu File.

Saya telah mencoba:

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

Di antara banyak lainnya. Tidak ada yang berhasil.

Peter Mortensen
sumber

Jawaban:

781

Untuk keluar dari aplikasi Anda, Anda dapat menelepon

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

Seperti yang dijelaskan dalam dokumentasi untuk Application.Shutdownmetode ini, Anda juga dapat memodifikasi perilaku mematikan aplikasi Anda dengan menetapkan ShutdownMode :

Shutdown secara implisit dipanggil oleh Windows Presentation Foundation (WPF) dalam situasi berikut:

  • Ketika ShutdownMode diatur ke OnLastWindowClose.
  • Ketika ShutdownMode diatur ke OnMainWindowClose.
  • Saat pengguna mengakhiri sesi dan acara SessionEnding tidak ditangani, atau ditangani tanpa pembatalan.

Harap perhatikan juga bahwa Application.Current.Shutdown();hanya dapat dipanggil dari utas yang membuat Applicationobjek, yaitu biasanya utas utama.

Dirk Vollmar
sumber
8
Seperti yang saya tunjukkan, itu tidak aneh. Dalam WPF Aplikasi adalah kelas statis. Application.Current adalah referensi ke Aplikasi Anda yang sedang berjalan.
TimothyP
4
Menurut pendapat saya, ini sedikit aneh dalam arti bahwa ini tidak jelas pada pandangan pertama, dan itu hanya cukup menyimpang dari model masa lalu untuk mengusir orang. Masuk akal kalau itu bekerja tentu saja.
Brian MacKay
20
Jika Anda menelepon Application.Current.Shutdown();fonction Anda tidak akan segera kembali. Anda perlu menelepon return;juga untuk ini.
Erwin Mayer
2
Saya telah menggunakan ini di mana dari satu jendela muncul jendela lain dan, dalam acara window_closed jendela itu saya menambahkan kode ini. semua jendela hilang, tetapi program masih berjalan di luar tempat setelah pop up dibuat.
diyoda_
7
@TimothyP ApplicationTIDAK BUKAN kelas statis. Memiliki anggota Application.Currentstatis tidak berarti itu statis. Sebaliknya, ini adalah kelas normal yang bisa diturunkan.
Earth Engine
156

Jika Anda benar - benar membutuhkannya untuk menutup, Anda juga dapat menggunakan Environment.Exit () , tetapi tidak anggun sama sekali (lebih seperti mengakhiri proses).

Gunakan sebagai berikut:

Environment.Exit(0)
John
sumber
4
Environment.Exit()membutuhkan setidaknya satu parameter, kode keluar. Gunakan Environment.Exit(0)jika Anda tidak khawatir tentang kode keluar.
gbmhunter
24
Metode ini sebenarnya menutup semuanya. Aplikasi saya meninggalkan sesuatu yang sedang berjalan (formulir ditutup, tetapi suatu proses masih berjalan) denganApplication.Current.Shutdown();
gbmhunter
4
Lingkungan. Keluar jelas merupakan cara yang tepat untuk memastikan penutupan suatu aplikasi. Dengan Application.Current.Shutdown Anda dapat dengan mudah berakhir dengan aplikasi berjalan tanpa batas waktu jika Anda memiliki kode yang mendorong dirinya kembali ke operator.
Marcus Andrén
Sama dengan Application.exit (0);
Sayka
Dengan acara Application.Current.Shutdown();saya Closingdipanggil, ketika saya hanya ingin mematikan aplikasi saya segera. Jadi Environment.Exit(0);itu pilihan yang lebih baik.
FredM
64

Seperti yang dikatakan wuminqi , Application.Current.Shutdown();tidak dapat dipulihkan, dan saya percaya ini biasanya digunakan untuk memaksa aplikasi untuk menutup pada saat-saat seperti ketika pengguna keluar atau mematikan Windows.

Sebaliknya, panggil this.close()di jendela utama Anda. Ini sama dengan menekan Alt+ F4atau tombol tutup [x] pada jendela. Ini akan menyebabkan semua jendela yang dimiliki lainnya ditutup dan akan berakhir memanggil Application.Current.Shutdown();selama tindakan penutupan tidak dibatalkan. Silakan lihat dokumentasi MSDN tentang Menutup Jendela .

Selain itu, karena this.close()dapat dibatalkan Anda dapat memasukkan dialog konfirmasi perubahan simpan di penangan peristiwa penutup. Cukup buat event handler untuk <Window Closing="...">dan ubah e.Cancelsesuai. (Lihat dokumentasi MSDN untuk detail lebih lanjut tentang cara melakukan ini.)

Allen Pestaluky
sumber
2
+1 Saya memutuskan untuk menggunakan yang ini, terutama karena saya perlu menyimpan file yang terbuka sebelum benar-benar berhenti dari aplikasi.
AgentKnopf
2
Satu hal penting yang perlu diperhatikan di sini adalah fakta bahwa Allen menunjukkan fakta yang sangat penting: semua jendela milik lainnya akan dimatikan. Anda harus memastikan bahwa Anda menyatakan kepemilikan. Jika Anda memiliki jendela yang sedang berjalan dan kemudian Anda membuka jendela lain tetapi belum menunjukkannya, setelah Anda menutup jendela yang aktif, jendela yang tersembunyi akan memaksa aplikasi untuk tetap berjalan. Anda akan memiliki potensi kebocoran memori kecuali Anda menutup jendela itu melalui cara lain (task manager, dll). Saya sudah menguji ini.
BK
35

Gunakan salah satu dari yang berikut ini sesuai kebutuhan:

1.

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

2.

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

Di atas semua metode akan memanggil closing eventdari Windowkelas dan eksekusi mungkin berhenti di beberapa titik (penyebab biasanya aplikasi menempatkan dialog seperti 'apakah Anda yakin?' Atau ' bahasa Apakah Anda ingin menyimpan data sebelum penutupan? ', Sebelum jendela ditutup sepenuhnya)

3. Tetapi jika Anda ingin menghentikan aplikasi tanpa peringatan segera. Gunakan di bawah ini

   Environment.Exit(0);
Kylo Ren
sumber
18

Inilah cara saya melakukan milik saya:

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

Saya hanya menelepon Application.Current.ShutDown()dari jendela aplikasi utama, semua jendela lain gunakan this.Close(). Di jendela utama saya, Window_Closing(...)menangani xtombol kanan atas . Jika ada metode yang meminta jendela lebih dekat, Window_Closing(...)ambil acara untuk dimatikan jika pengguna mengonfirmasi.

Alasan saya sebenarnya menggunakan Application.Current.Shutdown()di jendela utama saya adalah bahwa saya telah memperhatikan bahwa jika kesalahan desain dibuat dan saya belum menyatakan orangtua dari salah satu jendela saya dalam suatu aplikasi, jika jendela itu dibuka tanpa ditunjukkan sebelumnya ke penutupan jendela aktif terakhir, saya pergi dengan jendela tersembunyi yang berjalan di latar belakang. Aplikasi tidak akan dimatikan. Satu-satunya cara untuk mencegah kebocoran memori yang lengkap adalah bagi saya untuk masuk ke Task Manager untuk mematikan aplikasi. Application.Current.Shutdown()melindungi saya dari kekurangan desain yang tidak diinginkan.

Itu dari pengalaman pribadi saya. Pada akhirnya, gunakan yang terbaik untuk skenario Anda. Ini hanyalah sepotong informasi.

BK
sumber
16

Seharusnya tidak ada pesan Application.ShutDown();atau .Exit()pesan.

Applicationadalah kelas statis. Itu tidak merujuk ke aplikasi saat ini. Anda perlu membuka aplikasi saat ini dan kemudian mematikannya seperti ini:

Application.Current.Shutdown();
TimothyP
sumber
8

Cara lain Anda bisa melakukan ini:

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

Ini akan memaksa mematikan aplikasi Anda. Selalu berfungsi, bahkan dalam aplikasi multi-utas.

Catatan: Berhati-hatilah untuk tidak kehilangan data yang belum disimpan di utas lainnya.

Ali Yousefi
sumber
Ini sepertinya tidak bisa dipahami: "dalam proses selalu bekerja" . Bisakah kamu memperbaikinya? Atau setidaknya jelaskan di sini, di komentar, apa maksud Anda?
Peter Mortensen
Ini juga sebagian tidak bisa dimengerti: Hanya peduli dengan aplikasi yang menyimpan data dalam file dari utas lainnya. Bisakah kamu memperbaikinya? Atau setidaknya jelaskan di sini, di komentar, apa maksud Anda?
Peter Mortensen
Apakah Anda menggunakan Google Terjemahan?
Peter Mortensen
tidak saya tidak, maksud saya adalah ketika aplikasi berjalan sebagai multi-utas dan Anda menggunakan Process. Tetap akan bekerja, tetapi cara lain seperti ini.
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);
}
Ravi
sumber
ini bukan jawaban pertanyaan dia hanya ingin tahu cara keluar dari aplikasi WPF.
mehdi
6

Mencoba

App.Current.Shutdown();

Untuk saya

Application.Current.Shutdown(); 

tidak bekerja

Iwona Kubowicz
sumber
6

Menurut pemahaman saya, Application.Current.Shutdown()juga ada kekurangannya.

Jika Anda ingin menampilkan jendela konfirmasi untuk membiarkan pengguna mengonfirmasi saat keluar atau tidak, tidak Application.Current.Shutdown()dapat dibatalkan.

wuminqi
sumber
7
Saya tidak mengerti ini. Kami bisa mendapatkan konfirmasi pengguna sebelum menelepon Application.Current.Shutdown().
Amsakanna
2
Saya tidak mengerti mengapa Anda harus mengonfirmasi. Terlalu banyak konfirmasi adalah hal yang sangat buruk. Fakta bahwa seseorang melakukan upaya untuk mengklik untuk membuka menu File, pindah ke bagian bawah menu File dan kemudian klik Exit, cukup banyak dikonfirmasi bahwa mereka tidak lagi ingin menggunakan aplikasi.
Veer: Dalam kasus saya, jendela konfirmasi memang muncul, tetapi bahkan ketika Anda memilih "membatalkan" di konfirmasi, aplikasi utama keluar.
wuminqi
7
JTS: Ini lebih baik dirancang kasus per kasus. Aplikasi kami, jika ada pekerjaan yang sedang berjalan, pasukan yang keluar akan menyebabkan kerusakan, jadi kami lebih baik memberi tahu mereka dalam dialog konfirmasi
wuminqi
3

Ringkasnya, ada beberapa cara untuk melakukan itu.

1) Membunuh proses, yang melewatkan finalisasi, penanganan kesalahan dll:

Process.GetCurrentProcess().Kill();

2) Mematikan aplikasi saat ini, yang mungkin merupakan cara yang tepat karena memanggil peristiwa keluar:

Application.Current.Shutdown();

atau

this.Shutdown();

(ketika diklik dalam instance App-class)

3) Menutup aplikasi saat ini (semua formulir harus ditutup / selesai sebelumnya):

this.Close(); 

(ketika diklik dalam instance App-class)

4) Keluar dari lingkungan, yang menghentikan aplikasi:

Environment.Exit(0);

Juga, Anda mungkin ingin membaca tentang status keluar di sini

pencuri
sumber
2

Caliburn beraroma mikro

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 });
    }
}
Anders
sumber
Apa arti "Caliburn micro flavoured" ?
Peter Mortensen
Bagaimana Anda akan mencapainya menggunakan Caliburn Micro
Anders
0

Jika Anda ingin keluar dari utas lain yang tidak membuat objek aplikasi gunakan:

System.Windows.Application.Current.Dispatcher.InvokeShutdown();
SoumyaMahunt
sumber
-2

Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;

Alpha-LIon
sumber
2
Selamat datang di SO, Alpha-LIon! Jawaban khusus kode tidak disarankan di sini, karena tidak memberikan wawasan tentang bagaimana masalah diselesaikan. Harap perbarui solusi Anda dengan penjelasan tentang bagaimana kode Anda memecahkan masalah OP :)
Joel
-3

Dari kode xaml Anda dapat memanggil SystemCommand yang telah ditentukan:

Command="SystemCommands.MinimizeWindowCommand"

Saya pikir ini harus menjadi cara yang disukai ...

Markus Sommerschnee
sumber
Minimalkan! = Keluar dari aplikasi. Saya tidak melihat opsi keluar aplikasi dalam daftar itu. Tampaknya lebih banyak manajemen jendela dan tutup jendela tidak berarti menutup aplikasi. msdn.microsoft.com/en-us/library/…
kenny