0

我有一个名为 的表单MyForm,我想在程序执行过程中从类本身的外部编辑它的属性。

这是我得到的:

static void Main()
{
    MyForm main = new MyForm();
    main.ShowDialog();
    main.Text = "Hello";
}

但是,它似乎ShowDialog()只是在我关闭表单之前冻结程序,所以main.Text = "Hello";在我关闭表单之前不会执行。

我也尝试过使用main.Show(),但它只是在我执行完Main()函数中的所有代码后关闭表单,所以文本"Hello"只会快速闪烁。

我需要它,以便我可以始终打开表单并在程序执行过程中从类本身外部更改它的控件。

我怎样才能做到这一点?我应该在不同的线程中运行表单还是什么?

4

2 回答 2

3

这里有多个问题,您应该尝试一次专注于一个,所以让我突出显示这些问题。

  1. 为什么我的程序在 Main 退出时关闭?
  2. 显示表单时如何避免“冻结”程序?
  3. 如何从其他地方访问表单的内容?

答案:

  1. 这就是程序生命周期的设计。当主线程(运行 Main 方法)终止时,程序关闭。在此过程中,任何打开的表格都会关闭。解决方案是不允许 Main 退出,通常Application.Run(main);在您的情况下使用,显示表单并等待它关闭。
  2. 您使用Showand not ShowDialog,但由于您没有其他形式保持程序打开,因此您的程序将关闭。Show 显示表单后返回,返回到程序正在执行的任何操作。在您的情况下,程序无事可做,因此终止。
  3. 您需要将对表单的引用存储在程序的其余部分可以访问它的地方,您可以在某处使用静态字段/属性,或者您可以将表单传递给需要它的各个部分。
于 2013-03-23T12:57:17.397 回答
1

首先,我不知道你的具体情况是什么。也许我的解决方案对您有好处,但如果不是,请尝试告诉我们您到底想要实现什么。

static void Main()
{
    var main = new MyForm();
    //Initialize a new thread with the `DoSomething()` method
    //and pass the form as a parameter
    var thread = new Thread(() => DoSomething(main)) {IsBackground = true};
    thread.Start();
    main.ShowDialog();
}

static void DoSomething(MyForm main) {
    //Update the form title
    main.Text = "Hello";
    //Wait one second
    Thread.Sleep(1000);
    //Update the form title again
    main.Text = "World";
}
于 2013-03-23T13:10:44.693 回答