我的项目的目录结构:
First_GUI
|_ First_GUI.sln
|_ First_GUI (Directory of same name)
|_ Form1.cs
|_ Insider (a directory inside First_GUI)
|_ TestInnerClass.cs
我上周开始了 C#,我正在尝试制作一个 GUI 应用程序。 Form1
是主要形式,有TextBox
、Button
和Label
。
用户在此文本框中输入一个值,当单击按钮时,该字符串的值将发送到驻留在Insider
目录中的类。接收此值的类命名为 TestInnerClass
。
此TestInnerClass
执行一些操作,例如在收到的字符串末尾添加一些额外的字符。现在,我需要它来更新我们在Form1
中的Label
并将新的字符串值放入其中。
TestInnerClass
有更多的指令要做,所以它应该实时进行和更新Form1
。
我已经尝试了过去 2 个小时,但我仍然没有找到完成此操作的方法。
我试图使Form1
Label
Public
可以从任何地方访问,然后在TestInnerClass
中执行此操作:
string newString = "Should update!";
Form1 frm1 = new Form1();
frm1.Label.Text = newString;
这行不通。
要访问另一个线程属性(在您的情况下是 Form1 的 GUI 线程(,您需要像这样调用线程:
frm1.Invoke( new Action(() =>
{
frm1.label.Text = "Test";
} ));
调用是必需的,因为 .net 中窗口的 GUI(无论窗体还是 WPF(在其自己的线程中运行。线程并行执行代码,因此无论后台发生什么计算,GUI 始终响应用户。
长话短说:
-> Entrypoint of your program
|
| -> Thread 1 (testInnerClass)
|
| -> Thread 2 (frm1.Show())
|
| -> Invoke Thread 2
| -> set Property
|
| -> resume thread 2
调用Show()
时,您的表单位于另一个线程中。调用会暂停线程,您可以更改属性。完成后,它将恢复。
这有效,但是在重新阅读您的问题后,它可能不是最佳解决方案,因此这是另一种可能更好的解决方案:
编辑 Form1 的构造函数以:
public Form1 (string textForMyLabel) {
Initialize();
label1.Text = textForMyLabel;
}
然后使用Form1 frm = new Form1(newString);
创建表单然后,在调用 Show()
-Method 之前,将填充您的标签。但这只适用于 Form1 的每个实例一次。