c# wpf教學c# - 如何以編程方式退出WPF應用程序?




wpf安裝 wpf介面設計 (13)

這應該可以做到這一點:

Application.Current.Shutdown();

如果你有興趣,這裡有一些我覺得有用的附加材料:

Application.Current的詳細信息

WPF應用程序生命週期

在我使用C#(WinForms)的幾年中,我從未使用過WPF。 但是,現在我喜歡WPF,但是我不知道當用戶從File菜單中單擊Exit菜單項時我該如何退出我的應用程序。

我努力了:

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

等等。 什麼都沒有


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

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

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

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

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

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


據我了解, Application.Current.Shutdown()也有其缺點,

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


以下是我的做法:

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

這是我個人的經歷。 最後,使用最適合你的方案。 這只是另一條信息。


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

1。

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

2。

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

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

但是,如果您想立即終止應用程序而不會立即發出警告 。 在下面使用

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

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

正如wuminqi所說, Application.Current.Shutdown(); 是不可逆的,我相信它通常用於在用戶註銷或關閉Windows時強制關閉應用程序。 相反,請在您的主窗口中調用this.close() 。 這與在窗口上按下“ALT-F4”或關閉[x]按鈕相同。 這將導致所有其他擁有的窗口關閉並最終調用Application.Current.Shutdown(); 只要關閉行動沒有取消。 請參閱關閉窗口的MSDN文檔。

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


非常簡單,使用下面的代碼

Application.Current.Shutdown();

嘗試

App.Current.Shutdown();

為了我

Application.Current.Shutdown(); 

沒有工作。


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

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

這將迫使您的應用程序在進程中始終在多線程應用程序中工作。

注意:只關心將數據保存在另一個線程的文件中的應用程序。


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

使用方法如下:

Environment.Exit(0)

Two ways:

public static byte[] StrToByteArray(this string s)
{
    List<byte> value = new List<byte>();
    foreach (char c in s.ToCharArray())
        value.Add(c.ToByte());
    return value.ToArray();
}

And,

public static byte[] StrToByteArray(this string s)
{
    s = s.Replace(" ", string.Empty);
    byte[] buffer = new byte[s.Length / 2];
    for (int i = 0; i < s.Length; i += 2)
        buffer[i / 2] = (byte)Convert.ToByte(s.Substring(i, 2), 16);
    return buffer;
}

I tend to use the bottom one more often than the top, haven't benchmarked them for speed.





c# .net wpf shutdown