![](/img/trans.png)
[英]How do I programmatically add a statusbar to an WPF Window application using C#
[英]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
對象的線程調用,即通常是主線程。
正如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();
如果您有興趣,這里有一些我認為有幫助的其他材料:
這是我的做法:
// 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();
這將強制終止您的應用程序。 它始終有效,即使在多線程應用程序中也是如此。
注意:請注意不要丟失另一個線程中未保存的數據。
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.