我已经设置了WPF应用程序,以使其不会通过如下所示修改app.xaml.cs并将构建操作设置为Page来自动加载窗口。我还从app.xaml中删除了starturl。我已经介绍了一个控制器类,从该类中可以启动应用程序,如下面的代码以及在控制器的构造函数中所见,我已经创建并打开了一个新窗口。我删除了打开应用程序时自动生成的原始MainWindow。
无论如何,问题是打开打开我在控制器中添加的新窗口后,我随后关闭了窗口,应用程序终止了吗?为什么?我不希望该应用程序终止,并且我不明白为什么它在关闭窗口时终止。或者换一种说法,我如何引入一个不会导致应用程序在关闭窗口时终止的窗口?任何帮助表示赞赏。
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
namespace UserTraining
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
App()
{
InitializeComponent();
}
[STAThread]
static void Main()
{
App app = new App();
UserTrainingController control = new UserTrainingController();
app.Run();
}
}
}
UserTrainingController
类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
namespace UserTraining
{
class UserTrainingController
{
public UserTrainingController()
{
IntroductionWindow w = new IntroductionWindow();
w.Show();
}
}
}
答案 0 :(得分:1)
调用UserTrainingController
后,您将在屏幕上显示带有w.Show();
的窗口。关闭窗口时,w.Show();
终止并返回到调用者,这是Main
方法。这是堆栈上的最后一个方法。
但是随后您运行另一个方法app.Run()
,但是它立即终止,返回到Main
方法,该方法在app.Run()
之后不再需要执行,因此也终止了。 / p>
由于它是堆栈上的最后一个方法,所以堆栈为空,这意味着您的应用程序已完成。
您需要具有一些父窗口,从中可以打开您的自定义窗口。
通常,您必须防止堆栈清空:)
答案 1 :(得分:1)
WPF应用程序具有ShutdownMode属性,其值为ShutdownMode enumeration的成员之一。它具有三个可能的值:OnExplicitShutdown,OnLastWindowClose和OnMainWindowClose。
默认设置为OnLastWindowClose,这意味着当最后一个窗口关闭或调用httpClient.ws(host = "echo.websocket.org") {
send(Frame.Text("Hello World"))
for (message in incoming.map { it as? Frame.Text }.filterNotNull()) {
println(message.readText())
}
}
httpClient.wss(host = "echo.websocket.org") {
send(Frame.Text("Hello World"))
for (message in incoming.map { it as? Frame.Text }.filterNotNull()) {
println(message.readText())
}
}
时,应用程序将关闭。我怀疑这就是为什么您的应用程序在关闭IntroductionWindow时终止的原因。
您需要做的是将ShutdownMode设置为OnExplicitShutdown。这样,您的应用程序只会在您明确调用Application.Shutdown()
时终止。
您可以在代码中或在App.xaml文件中设置ShutdownMode属性。