eig*_*tx2 68 c# wpf window visual-studio-2010
我习惯于Visual Studio中的WinForms编程,但我想尝试一下WPF.
我为我的项目添加了一个名为Window01的窗口.主窗口称为MainWindow.在public MainWindow()
构造函数之前,我声明了Window01:
Window01 w1;
Run Code Online (Sandbox Code Playgroud)
现在我将实例化此窗口:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
w1 = new Window01();
}
Run Code Online (Sandbox Code Playgroud)
我有一个按钮,显示窗口:w1.ShowDialog();
.
这里的"有趣"事实是,如果我启动应用程序(使用调试)并在几秒钟之后退出它(我在应用程序中没有做任何事情),Visual Studio不会停止调试,就好像应用程序是仍在运行.
如果我将行移动w1 = new Window01();
到按钮单击方法,意思就在上面ShowDialog()
,Visual Studio的行为正常 - 也就是说,当我退出应用程序时调试停止.
为何这种奇怪的行为?
Bob*_*orn 119
在你的MainWindow.xaml.cs
,尝试这样做:
protected override void OnClosed(EventArgs e)
{
base.OnClosed(e);
Application.Current.Shutdown();
}
Run Code Online (Sandbox Code Playgroud)
根据此链接,您还可以ShutdownMode
在XAML中设置:
http://msdn.microsoft.com/en-us/library/system.windows.application.shutdownmode.aspx
<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml"
ShutdownMode="OnExplicitShutdown"
>
</Application>
Run Code Online (Sandbox Code Playgroud)
应用程序仅在调用Shutdown
方法时停止运行Application
.关闭可以隐式或显式发生,由ShutdownMode
属性的值指定.
如果设置ShutdownMode
为OnLastWindowClose
,则当应用程序中的最后一个窗口关闭时,Windows Presentation Foundation(WPF)会隐式调用Shutdown,即使当前实例化的任何窗口都设置为主窗口(请参阅MainWindow).
一ShutdownMode
的OnMainWindowClose
原因WPF隐式调用shutdown当主窗口关闭,即使其他窗口是当前打开的.
某些应用程序的生命周期可能不依赖于主窗口或最后一个窗口何时关闭,或者根本不依赖于窗口.对于这些场景,您需要将ShutdownMode
属性设置为OnExplicitShutdown
,这需要显式Shutdown
方法调用来停止应用程序.否则,应用程序将继续在后台运行.
ShutdownMode
可以从XAML以声明方式配置,也可以从代码以编程方式配置.
此属性仅可从创建该Application
对象的线程中获得.
在您的情况下,应用程序没有关闭,因为您可能使用默认值OnLastWindowClose
:
如果设置ShutdownMode
为OnLastWindowClose
,则当应用程序中的最后一个窗口关闭时,WPF会隐式调用Shutdown,即使当前实例化的任何窗口都设置为主窗口(请参阅参考资料MainWindow
).
由于您打开一个新窗口而不关闭它,因此不会调用shutdown.
Mas*_*tic 26
我很高兴你得到了答案,但为了别人的缘故,我会回答你的问题,以便添加一些信息.
首先,如果您希望程序在主窗口关闭时退出,则需要指定,因为这不是WinForms,此行为是默认的.
(WPF中的默认值是最后一个窗口关闭时)
在代码中
转到您的应用程序实例在入口点(在VS 2012的WPF程序默认是内部嵌套的App.xaml
,所以去里面并导航到App.xaml.cs
与创建一个构造函数).
在构造函数中指定您Application
的ShutdownMode
应该是ShutdownMode
.OnLastWindowClose
.
public App()
{
ShutdownMode = ShutdownMode.OnLastWindowClose;
}
Run Code Online (Sandbox Code Playgroud)
在XAML中
转到您App.xaml
的是VS 2012默认情况下创建的文件(或自己创建)的根是Application
,里面指定你Application
的ShutdownMode
应该是ShutdownMode
.OnLastWindowClose
.
<Application x:Class="WpfApplication27.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml"
ShutdownMode="OnMainWindowClose">
Run Code Online (Sandbox Code Playgroud)
如果它有效,你就完成了; 你可以停止阅读
如果以上不起作用(我猜你是从头开始编写WPF应用程序),主窗口可能不知道应用程序作为主窗口.所以尽可能指定.
在代码中
像在步骤1中一样转到应用程序的构造函数,并指定它Application
.MainWindow
价值是你的Window
:
MainWindow = mainWindow;
Run Code Online (Sandbox Code Playgroud)
在XAML中
Application
像在步骤1中一样转到XAML,并指定它Application
.MainWindow
价值是你的Window
:
MainWindow = "mainWindow";
Run Code Online (Sandbox Code Playgroud)
我不认为这是最好的办法,只是因为WPF不希望你这样做(所以它Application
的ShutdownMode
),但你可以只使用一个事件/重写的事件方法(OnEventHappened).
转到MainWindow的代码隐藏文件并添加:
protected override void OnClosed(EventArgs e)
{
base.OnClosed(e);
App.Current.Shutdown();
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
62556 次 |
最近记录: |