[英]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.