簡體   English   中英

如何以編程方式退出 WPF 應用程序?

[英]How do I exit a WPF application programmatically?

應該如何退出應用程序,例如當用戶單擊“文件”菜單中的“退出”菜單項時?

我努力了:

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

在許多其他人中。 沒有任何效果。

要退出您的應用程序,您可以調用

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

Application.Shutdown方法的文檔中所述,您還可以通過指定ShutdownMode來修改應用程序的關閉行為:

在以下情況下,Windows Presentation Foundation (WPF) 會隱式調用關閉:

  • 當 ShutdownMode 設置為 OnLastWindowClose 時。
  • 當 ShutdownMode 設置為 OnMainWindowClose 時。
  • 當用戶結束會話並且 SessionEnding 事件未處理或未取消處理時。

另請注意Application.Current.Shutdown(); 只能從創建Application對象的線程調用,即通常是主線程。

如果您真的需要關閉它,您也可以使用Environment.Exit() ,但它根本不優雅(更像是結束過程)。

使用方法如下:

Environment.Exit(0)

正如wuminqi所說Application.Current.Shutdown(); 是不可逆的,我相信它通常用於在用戶注銷或關閉 Windows 時強制關閉應用程序。

相反,在主窗口中調用this.close() 這與按Alt + F4或窗口上的關閉 [x] 按鈕相同。 這將導致所有其他擁有的窗口關閉並最終調用Application.Current.Shutdown(); 只要關閉操作沒有被取消。 請參閱有關關閉窗口的 MSDN 文檔。

此外,由於this.close()是可取消的,因此您可以在關閉事件處理程序中放入保存更改確認對話框。 只需為<Window Closing="...">制作一個事件處理程序並相應地更改e.Cancel (有關如何執行此操作的更多詳細信息,請參閱MSDN 文檔。)

根據需要使用以下任何一項:

1.

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

2.

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

以上所有方法都會調用Window類的closing event ,並且執行可能會在某個時候停止(因為通常應用程序在窗口完全關閉之前放置諸如“你確定嗎?”或“你想在關閉之前保存數據嗎?”這樣對話)

3.但是如果您想立即終止應用程序而沒有任何警告 下面使用

 Environment.Exit(0);

這應該可以解決問題:

Application.Current.Shutdown();

如果您有興趣,這里有一些我認為有幫助的其他材料:

Application.Current 上的詳細信息

WPF 應用程序生命周期

這是我的做法:

// 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()保護我免受意外設計缺陷的影響。

那是我個人的經驗。 最后,使用最適合您的場景的方法。 這只是另一條信息。

不應該有Application.ShutDown(); .Exit()消息。

Application是一個靜態類。 它不是指當前的應用程序。 您需要進入當前應用程序,然后像這樣關閉它:

Application.Current.Shutdown();

另一種方法可以做到這一點:

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

這將強制終止您的應用程序。 它始終有效,即使在多線程應用程序中也是如此。

注意:請注意不要丟失另一個線程中未保存的數據。

總結一下,有幾種方法可以做到這一點。

1)殺死進程,跳過終結,錯誤處理等:

Process.GetCurrentProcess().Kill();

2)關閉當前應用程序,這可能是正確的方法,因為它會調用退出事件:

Application.Current.Shutdown();

或者

this.Shutdown();

(當在 App 類的實例中調用時)

3)關閉當前應用程序(所有表格必須提前關閉/完成):

this.Close(); 

(當在 App 類的實例中調用時)

4)退出環境,終止應用程序:

Environment.Exit(0);

此外,您可能想在此處閱讀有關退出狀態的信息

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

嘗試

App.Current.Shutdown();

為了我

Application.Current.Shutdown(); 

沒有用。

據我了解, Application.Current.Shutdown()也有它的缺點。

如果您想顯示一個確認窗口讓用戶確認是否退出, Application.Current.Shutdown()是不可逆的。

Caliburn 微味

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

如果要從未創建應用程序對象的另一個線程退出,請使用: System.Windows.Application.Current.Dispatcher.InvokeShutdown()

如果您使用Application.Current.Shutdown()退出應用程序,您可能會收到System.InvalidOperationException: 'The calling thread cannot access this object because a different thread owns it. 如果您從不同的線程調用它。 要解決這個問題,您可以像這樣包裝電話

Application.Current.Dispatcher.Invoke(() => Application.Current.Shutdown());

App.Current.Shutdown();<\/code>
把它寫在你需要的地方。

"

如果(System.Windows.Forms.Application.MessageLoop)

{

// WinForms 應用程序

System.Windows.Forms.Application.Exit();

system.Environment.Exit(1);

}

Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;

您可以從 xaml 代碼調用預定義的 SystemCommand:

Command="SystemCommands.MinimizeWindowCommand"

我認為這應該是首選方式...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM