프로그래밍 방식으로 WPF 응용 프로그램을 종료하려면 어떻게합니까?


478

몇 년 동안 C # (Windows Forms)을 사용해 왔지만 WPF를 사용한 적이 없습니다. 그러나 이제 WPF가 마음에 들지만 사용자가 파일 메뉴에서 종료 메뉴 항목을 클릭 할 때 응용 프로그램을 종료하는 방법을 모르겠습니다.

나는 시도했다 :

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

많은 사람들 중에서. 아무것도 작동하지 않습니다.

답변:


781

응용 프로그램을 종료하려면 전화하십시오

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

Application.Shutdown메소드 의 문서에서 설명한대로 ShutdownMode 를 지정하여 애플리케이션의 종료 동작을 수정할 수도 있습니다 .

다음과 같은 상황에서는 WPF (Windows Presentation Foundation)에서 시스템 종료를 암시 적으로 호출합니다.

  • ShutdownMode가 OnLastWindowClose로 설정된 경우.
  • ShutdownMode가 OnMainWindowClose로 설정된 경우.
  • 사용자가 세션을 종료하고 SessionEnding 이벤트가 처리되지 않거나 취소되지 않고 처리되는 경우

또한 객체 Application.Current.Shutdown();를 생성 한 스레드 Application, 즉 일반적으로 메인 스레드 에서만 호출 될 수 있습니다 .


8
내가 지적했듯이 이상하지 않습니다. WPF에서 응용 프로그램은 정적 클래스입니다. Application.Current는 현재 실행중인 응용 프로그램에 대한 참조입니다.
TimothyP

4
제 생각에는 이것이 언뜻보기에는 분명하지 않으며, 과거 모델에서 사람들을 버릴 정도로 충분히 벗어납니다. 물론 작동한다는 것은 완벽합니다.
Brian MacKay

20
당신이 전화하면 당신 Application.Current.Shutdown();의 기능은 즉시 반환되지 않습니다. return;이것도 전화해야합니다 .
Erwin Mayer

2
한 창에서 다른 창을 팝업하는 곳에서 이것을 사용했으며 해당 창의 window_closed 이벤트 에서이 코드를 추가했습니다. 모든 창이 사라지지만 팝업이 생성 된 후 프로그램은 계속 실행됩니다.
diyoda_

7
@TimothyP No 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();비가 역적이며, 나는 일반적으로 사용자가 로그 오프 또는 Windows 아래로 종료되는 때와 같이 시간에 가까운 응용 프로그램을 강제하는 데 사용됩니다 믿습니다.

대신 this.close()기본 창에서 전화 하십시오. 이것은 창에서 Alt+ F4또는 닫기 [x] 버튼을 누르는 것과 같습니다 . 이렇게하면 소유 한 다른 모든 창이 Application.Current.Shutdown();닫히고 닫기 작업이 취소되지 않는 한 전화가 종료됩니다 . 창 닫기 에 대한 MSDN 설명서를 참조하십시오 .

또한 this.close()취소 할 수 있으므로 닫기 이벤트 핸들러에 변경 사항 저장 확인 대화 상자를 넣을 수 있습니다. 이벤트 핸들러를 <Window Closing="...">만들고 e.Cancel그에 따라 변경하면 됩니다. 이 작업을 수행하는 방법에 대한 자세한 내용 은 MSDN 설명서 를 참조하십시오.


2
+1 나는 실제로 응용 프로그램을 종료하기 전에 열린 파일을 저장해야하기 때문에 이것과 함께하기로 결정했습니다.
Agent Knopf

2
여기서 주목해야 할 한 가지는 Allen이 매우 중요한 사실을 지적했다는 것입니다. 다른 모든 소유 한 창은 종료됩니다. 소유권을 선언해야합니다. 실행중인 창이 있고 다른 창을 열었지만 아직 표시하지 않은 경우 활성 창을 닫은 후 숨겨진 창은 응용 프로그램이 계속 실행되도록합니다. 다른 방법 (작업 관리자 등)을 통해 창을 닫지 않으면 메모리 누수가 발생할 수 있습니다. 나는 이것을 테스트했다.
BK

35

필요에 따라 다음 중 하나를 사용하십시오.

1.

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

2.

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

모든 메소드 호출됩니다 위 closing eventWindow클래스와 실행이 어떤 시점에서 중지 할 수 있습니다 (원인은 일반적으로 응용 프로그램과 같은 대화를 넣어 '는? 확실히 당신입니다' '또는 겠습니까 당신이 마감되기 전에 데이터를 저장 하시겠습니까? ', 윈도우가 완전히 닫히기 전에)

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

이로 인해 응용 프로그램이 강제 종료됩니다. 멀티 스레드 응용 프로그램에서도 항상 작동합니다.

참고 : 다른 스레드에서 저장되지 않은 데이터가 손실되지 않도록주의하십시오.


이해할 수없는 것처럼 보인다 : "항상 진행 중" . 고칠 수 있습니까? 아니면 적어도 여기에 무슨 의미인지 설명하십시오.
Peter Mortensen

이것은 또한 부분적으로 이해할 수없는 것입니다 : 다른 스레드의 파일에 데이터를 저장 한 응용 프로그램 만주의하십시오. 고칠 수 있습니까? 아니면 적어도 여기에 무슨 의미인지 설명하십시오.
피터 Mortensen

구글 번역기를 사용하고 있니?
Peter Mortensen

아니요, 내 말은 응용 프로그램이 다중 스레드로 실행 중이고 Process.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()그러나 전화하기 전에 사용자 확인을받을 수 있습니다 .
Amsakanna

2
왜 확인해야하는지 모르겠습니다. 너무 많은 확인은 매우 나쁜 것입니다. 누군가가 클릭하여 파일 메뉴를 열고 파일 메뉴의 맨 아래로 내려간 다음 종료를 클릭하려고 노력했다는 사실은 더 이상 응용 프로그램을 사용하지 않으려는 것입니다.

Veer : 제 경우에는 확인 창이 나타나지만 확인에서 "취소"를 선택하더라도 기본 APP가 종료됩니다.
wuminqi

7
JTS : 사례별로 디자인하는 것이 좋습니다. 우리의 응용 프로그램, 실행중인 작업이있는 경우 강제 종료는 손상을 일으킬 것입니다, 그래서 우리는 확인 대화 상자에 알리는 것이 좋습니다
wuminqi

3

요약하면 몇 가지 방법이 있습니다.

1) 마무리, 오류 처리 등을 건너 뛰는 프로세스 종료 :

Process.GetCurrentProcess().Kill();

2) 현재 응용 프로그램을 종료하십시오. 종료 이벤트를 호출하기 때문에 올바른 방법 일 것입니다.

Application.Current.Shutdown();

또는

this.Shutdown();

(App 클래스의 인스턴스에 집착했을 때)

3) 현재 앱 닫기 (모든 양식을 먼저 닫거나 종료해야 함) :

this.Close(); 

(App 클래스의 인스턴스에 집착했을 때)

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 마이크로가 맛" 평균?
피터 Mortensen

Caliburn Micro를 사용하여 달성하는 방법
Anders

0

응용 프로그램 객체를 만들지 않은 다른 스레드를 종료하려면 다음을 사용하십시오.

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

-2

Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;


2
알파 리온에 오신 것을 환영합니다! 코드 전용 답변은 문제 해결 방법에 대한 통찰력을 제공하지 않으므로 권장하지 않습니다. 코드가 OP의 문제를 해결하는 방법에 대한 설명으로 솔루션을 업데이트하십시오. :)
Joel

-3

xaml 코드에서 사전 정의 된 SystemCommand를 호출 할 수 있습니다.

Command="SystemCommands.MinimizeWindowCommand"

나는 이것이 선호되는 방법이어야한다고 생각합니다 ...


! = 응용 프로그램을 종료하십시오. 해당 목록에 앱 종료 옵션이 표시되지 않습니다. 더 많은 창 관리 및 창 닫기가 반드시 앱 닫기를 의미하지는 않습니다. msdn.microsoft.com/ko-kr/library/…
kenny
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.