Làm cách nào để thoát khỏi ứng dụng WPF theo chương trình?


478

Trong vài năm tôi đã sử dụng C # (Windows Forms), tôi chưa bao giờ sử dụng WPF. Nhưng, bây giờ tôi yêu WPF, nhưng tôi không biết làm cách nào để thoát khỏi ứng dụng của mình khi người dùng nhấp vào mục menu Thoát khỏi menu Tệp.

Tôi đã thử:

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

Trong số nhiều người khác. Không có gì hoạt động.

Câu trả lời:


781

Để thoát khỏi ứng dụng của bạn, bạn có thể gọi

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

Như được mô tả trong tài liệu về Application.Shutdownphương pháp, bạn cũng có thể sửa đổi hành vi tắt máy của ứng dụng bằng cách chỉ định ShutdownMode :

Tắt máy được Windows Presentation Foundation (WPF) gọi ngầm trong các tình huống sau:

  • Khi ShutdownMode được đặt thành OnLastWindowC Đóng.
  • Khi ShutdownMode được đặt thành OnMainWindowC Đóng.
  • Khi người dùng kết thúc một phiên và sự kiện Phiên làm việc sẽ được xử lý hoặc xử lý mà không hủy.

Cũng xin lưu ý rằng Application.Current.Shutdown();chỉ có thể được gọi từ luồng đã tạo Applicationđối tượng, tức là thông thường là luồng chính.


8
Như tôi đã chỉ ra nó không có gì lạ. Trong ứng dụng WPF là một lớp tĩnh. Application.C Hiện tại là một tham chiếu đến Ứng dụng hiện đang chạy của bạn.
TimothyP

4
Theo tôi, có một chút kỳ lạ theo nghĩa là điều này không rõ ràng ngay từ cái nhìn đầu tiên và nó đi chệch chỉ đủ từ các mô hình trong quá khứ để ném mọi người đi. Nó làm cho ý nghĩa hoàn hảo rằng nó hoạt động tất nhiên.
Brian MacKay

20
Nếu bạn gọi Application.Current.Shutdown();fonction của bạn sẽ không trở lại ngay lập tức. Bạn cần phải gọi return;là tốt cho việc này.
Erwin Mayer

2
Tôi đã sử dụng cái này trong đó từ một cửa sổ bật lên một cửa sổ khác và, trong sự kiện window_closes của cửa sổ đó, tôi đã thêm mã này. tất cả các cửa sổ biến mất, nhưng chương trình vẫn chạy vượt ra ngoài sau khi cửa sổ bật lên được tạo.
diyoda_

7
@TimothyP Không Applicationphải là một lớp tĩnh. Có một Application.Currentthành viên tĩnh không có nghĩa là nó tĩnh. Thay vào đó, nó là một lớp bình thường có thể được bắt nguồn.
Động cơ Trái đất

156

Nếu bạn thực sự cần nó để đóng, bạn cũng có thể sử dụng Môi trường.Exit () , nhưng nó không duyên dáng chút nào (giống như kết thúc quá trình).

Sử dụng nó như sau:

Environment.Exit(0)

4
Environment.Exit()cần ít nhất một tham số, mã thoát. Sử dụng Environment.Exit(0)nếu bạn không quan tâm đến mã thoát.
gbmhunter

24
Phương pháp này thực sự đóng tất cả mọi thứ. Ứng dụng của tôi đã để lại một cái gì đó đang chạy (biểu mẫu đã đóng, nhưng một quá trình vẫn đang chạy) vớiApplication.Current.Shutdown();
gbmhunter

4
Môi trường.Exit chắc chắn là cách đúng đắn để đảm bảo tắt ứng dụng. Với Application.Cản.Shutdown, bạn có thể dễ dàng kết thúc với ứng dụng chạy vô thời hạn nếu bạn có mã tự đẩy mình trở lại bộ điều phối.
Marcus Andrén

Bằng với Application.exit (0);
Sayka 17/2/2015

Với sự kiện Application.Current.Shutdown();của tôi Closingđã được gọi, khi tôi chỉ muốn tắt ứng dụng của mình ngay lập tức. Vì vậy, Environment.Exit(0);là sự lựa chọn tốt hơn.
FredM

64

Như wuminqi đã nói ,Application.Current.Shutdown(); là không thể đảo ngược và tôi tin rằng nó thường được sử dụng để buộc một ứng dụng đóng cửa vào những thời điểm như khi người dùng đăng xuất hoặc tắt Windows.

Thay vào đó, hãy gọi this.close()trong cửa sổ chính của bạn. Điều này giống như nhấn Alt+ F4hoặc nút đóng [x] trên cửa sổ. Điều này sẽ khiến tất cả các cửa sổ thuộc sở hữu khác đóng và sẽ kết thúc cuộc gọi Application.Current.Shutdown();miễn là hành động đóng không bị hủy. Vui lòng xem tài liệu MSDN về Đóng cửa sổ .

Ngoài ra, vì this.close()có thể hủy, bạn có thể đặt hộp thoại xác nhận thay đổi lưu trong trình xử lý sự kiện kết thúc. Đơn giản chỉ cần làm một xử lý sự kiện cho <Window Closing="...">và thay đổi cho e.Cancelphù hợp. (Xem tài liệu MSDN để biết thêm chi tiết về cách thực hiện việc này.)


2
+1 Tôi đã quyết định sử dụng ứng dụng này, đặc biệt là vì tôi cần lưu các tệp đang mở trước khi thực sự thoát khỏi ứng dụng.
Đặc vụKnopf

2
Một điều quan trọng cần lưu ý ở đây là thực tế là Allen đã chỉ ra một thực tế rất quan trọng: tất cả các cửa sổ thuộc sở hữu khác sẽ bị đóng cửa. Bạn phải chắc chắn rằng bạn tuyên bố quyền sở hữu. Nếu bạn có một cửa sổ đang chạy và sau đó bạn mở một cửa sổ khác nhưng chưa hiển thị, sau khi bạn đóng cửa sổ đang hoạt động, cửa sổ ẩn sẽ buộc ứng dụng tiếp tục chạy. Bạn sẽ bị rò rỉ bộ nhớ tiềm năng trừ khi bạn đóng cửa sổ đó thông qua các phương tiện khác (trình quản lý tác vụ, v.v.). Tôi đã thử nghiệm điều này.
BK

35

Sử dụng bất kỳ điều nào sau đây khi cần thiết:

1.

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

2.

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

Trên tất cả các phương pháp sẽ gọi closing eventcủa Windowlớp và thực hiện có thể dừng lại ở một số điểm (nguyên nhân thường các ứng dụng đưa cuộc đối thoại như 'bạn có chắc?' Hoặc ' Bạn muốn lưu dữ liệu trước khi đóng cửa? ', Trước khi một cửa sổ được đóng hoàn toàn)

3. Nhưng nếu bạn muốn chấm dứt ứng dụng mà không có bất kỳ cảnh báo nào ngay lập tức. Sử dụng dưới đây

   Environment.Exit(0);


18

Đây là cách tôi làm:

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

Tôi chỉ gọi Application.Current.ShutDown()từ cửa sổ ứng dụng chính, tất cả các cửa sổ khác sử dụng this.Close(). Trong cửa sổ chính của tôi, Window_Closing(...)xử lý nút trên cùng bên phải x. Nếu bất kỳ phương thức nào gọi cửa sổ gần hơn, hãy Window_Closing(...)lấy sự kiện để tắt nếu người dùng xác nhận.

Lý do tôi thực sự sử dụng Application.Current.Shutdown()trong cửa sổ chính của mình là vì tôi nhận thấy rằng nếu xảy ra lỗi thiết kế và tôi đã không khai báo cha mẹ của một trong các cửa sổ của mình trong một ứng dụng, nếu cửa sổ đó được mở mà không được hiển thị trước đến lần đóng cửa sổ hoạt động cuối cùng, tôi còn lại một cửa sổ ẩn đang chạy ở chế độ nền. Ứng dụng sẽ không tắt. Cách duy nhất để ngăn chặn rò rỉ bộ nhớ hoàn chỉnh là tôi vào Trình quản lý tác vụ để tắt ứng dụng. Application.Current.Shutdown()bảo vệ tôi khỏi những sai sót thiết kế ngoài ý muốn.

Đó là từ kinh nghiệm cá nhân của tôi. Cuối cùng, sử dụng những gì là tốt nhất cho kịch bản của bạn. Đây chỉ là một phần thông tin.


16

Không nên có một Application.ShutDown();hoặc .Exit()tin nhắn.

Applicationlà một lớp tĩnh. Nó không đề cập đến các ứng dụng hiện tại. Bạn cần vào ứng dụng hiện tại và sau đó tắt nó như thế này:

Application.Current.Shutdown();

8

Một cách khác bạn có thể làm điều này:

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

Điều này sẽ buộc giết ứng dụng của bạn. Nó luôn hoạt động, ngay cả trong một ứng dụng đa luồng.

Lưu ý: Chỉ cần cẩn thận để không mất dữ liệu chưa được lưu trong một luồng khác.


Điều này dường như không thể hiểu được: "trong quá trình luôn hoạt động" . Bạn có thể sửa nó không? Hoặc ít nhất là giải thích ở đây trong ý kiến ​​những gì bạn có ý nghĩa?
Peter Mortensen

Điều này cũng không thể hiểu được một phần: Chỉ cần quan tâm đến một ứng dụng lưu dữ liệu trong các tệp từ một luồng khác. Bạn có thể sửa nó không? Hoặc ít nhất là giải thích ở đây trong ý kiến ​​những gì bạn có ý nghĩa?
Peter Mortensen

Bạn có đang sử dụng Google dịch không?
Peter Mortensen

không tôi không có ý tôi là khi ứng dụng đang chạy dưới dạng đa luồng và bạn sử dụng Process. Nó sẽ hoạt động, nhưng một cách khác như thế này. Đóng không hoạt động trong các ứng dụng đa luồng khi một luồng khác đang chạy.
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);
}

Đây không phải là câu trả lời mà anh ta chỉ muốn biết làm thế nào để thoát khỏi ứng dụng wpf.
mehdi

6

Thử

App.Current.Shutdown();

Cho tôi

Application.Current.Shutdown(); 

đã không làm việc.


6

Theo hiểu biết của tôi, Application.Current.Shutdown()cũng có nhược điểm của nó.

Nếu bạn muốn hiển thị một cửa sổ xác nhận để cho phép người dùng xác nhận thoát hay không, Application.Current.Shutdown()thì không thể đảo ngược.


7
Tôi không hiểu điều này. Application.Current.Shutdown()Tuy nhiên, chúng tôi có thể nhận được xác nhận của người dùng trước khi gọi .
Amsakanna

2
Tôi không thấy lý do tại sao bạn nên xác nhận. Quá nhiều xác nhận là một điều rất xấu. Thực tế là ai đó đã nỗ lực nhấp để mở menu Tệp, di chuyển xuống dưới cùng của menu Tệp và sau đó nhấp Thoát, được xác nhận khá nhiều rằng họ không còn muốn sử dụng ứng dụng.

Veer: Trong trường hợp của tôi, cửa sổ xác nhận sẽ xuất hiện, nhưng ngay cả khi bạn chọn "hủy" trong xác nhận, APP chính vẫn thoát.
wuminqi

7
JTS: Điều này tốt hơn để được thiết kế theo từng trường hợp. Ứng dụng của chúng tôi, nếu có các công việc đang chạy, lối ra lực lượng sẽ gây ra thiệt hại, vì vậy chúng tôi tốt hơn là để chúng được thông báo trong hộp thoại xác nhận
wuminqi

3

Tóm tắt, có một vài cách để làm điều đó.

1) Giết quá trình, bỏ qua quyết toán, xử lý lỗi, v.v.:

Process.GetCurrentProcess().Kill();

2) Tắt ứng dụng hiện tại, đây có thể là cách thích hợp vì nó gọi các sự kiện thoát:

Application.Current.Shutdown();

hoặc là

this.Shutdown();

(khi được sử dụng trong một phiên bản của lớp Ứng dụng)

3) Đóng ứng dụng hiện tại (tất cả các hình thức phải được đóng / kết thúc trước đó):

this.Close(); 

(khi được sử dụng trong một phiên bản của lớp Ứng dụng)

4) Thoát khỏi môi trường, chấm dứt ứng dụng:

Environment.Exit(0);

Ngoài ra, bạn có thể muốn đọc về các lối ra ở đây


2

Caliburn vi hương

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

Những gì hiện "Caliburn vi hương" nghĩa là gì?
Peter Mortensen

Làm thế nào bạn sẽ đạt được nó bằng Caliburn Micro
Anders

0

Nếu bạn muốn thoát khỏi một luồng khác không tạo đối tượng ứng dụng, hãy sử dụng:

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

-2

Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;


2
Chào mừng đến với SO, Alpha-LIon! Các câu trả lời chỉ có mã không được khuyến khích ở đây, vì chúng không cung cấp cái nhìn sâu sắc về cách giải quyết vấn đề. Vui lòng cập nhật giải pháp của bạn với lời giải thích về cách mã của bạn giải quyết vấn đề của OP :)
Joel

-3

Từ mã xaml, bạn có thể gọi SystemCommand được xác định trước:

Command="SystemCommands.MinimizeWindowCommand"

Tôi nghĩ rằng đây nên là cách ưa thích ...


Giảm thiểu! = Thoát ứng dụng. Tôi không thấy tùy chọn ứng dụng thoát trong danh sách đó. Có vẻ như quản lý cửa sổ nhiều hơn và đóng cửa sổ không nhất thiết là ứng dụng đóng. msdn.microsoft.com/en-us/l Library / từ
kenny
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.