0

我有一些袖珍电脑应用程序,我遇到了一个严重的问题,描述如下:https ://stackoverflow.com/questions/472598 。在寻找解决方案时,我在 Main() 中尝试了一些实际上非常愚蠢的代码:

[MTAThread]
        static void Main()
        {
            Application.Run(new Tasks());
            Application.Exit();
        }

并在退出时设置断点。如果我只是运行应用程序然后关闭窗口,就会到达断点。如果我运行应用程序然后打开另一个窗口:

private void questButton_Click(object sender, EventArgs e)
        {
            QuestionnairesWindow questWindow = new QuestionnairesWindow();
            questWindow.Show();
            this.Hide();
}

然后从它返回到初始窗口:

private void backButton_Click(object sender, EventArgs e)
        {
            Tasks tasksWindow = new Tasks();
            tasksWindow.Show();
            this.Close();
        }

并以与第一次相同的方式关闭第一个, Apllication.exit() 代码永远不会到达,我的印象是应用程序并没有真正关闭(我无法再次打开它)。对不起,如果描述很复杂

编辑:问题是 - 任何想法为什么它的行为不同?

4

3 回答 3

2

new Tasks()inMain()不是同一个对象Tasks tasksWindow = new Tasks();

你有 2 个任务对象,所以关闭第二个,第一个仍然存在并且永远不会消失。您需要传递给QuestionnairesWindow current 的引用Tasks

您可以使用其他QuestionnairesWindow构造函数来做到这一点:

private Tasks tasks;

public QuestionnairesWindow(Tasks t)
{
  this.tasks = t;
}

使用:

new QuestionnairesWindow(this).Show(); // where this = current `Tasks` created in `Main`
于 2009-01-26T10:41:21.700 回答
0

这条线似乎是问题所在:

Tasks tasksWindow = new Tasks();

如果我正确理解了您的代码,那么在您的 backButton_Click 中,您正在创建任务表单的一个实例,而不是显示您最初隐藏的那个。这意味着应用程序永远不会终止,因为仍然有一个窗口打开,但被隐藏了。

您可能想要做的是将 Tasks 表单引用传递给 QuestionnairesWindow 表单。

于 2009-01-26T10:40:57.283 回答
0

您遇到的问题是,在 backButton_Click 中,您正在创建任务窗口的实例。原来的“任务”窗口仍在运行,只是被隐藏了。我怀疑您需要将对原始任务表单的引用传递到 QuestionnairesWindow 以便它可以选择再次显示它。

您需要在 QuestionnairesWindow 上添加一个公共/内部方法,您可以在其中设置哪些 Tasks 表单导致 QuestionnairesWindow 打开。在调用 this.Hide() 之前,您可以使用this引用在 questButton_Click 中调用此方法。此引用将存储在 QuestionnairesWindow 内的私有变量中。

然后在 backButton_Click 中,您使用这个私有变量来调用 .Show() 方法来显示父窗体。

于 2009-01-26T10:42:03.710 回答