我正在尝试更新从控制台应用程序启动的 Windows 窗体中标签内的文本,作为示例,我创建了此代码。
static void Main(string[] args)
{
Form form = new Form();
Label label = new Label();
label.Text = "hi";
form.Controls.Add(label);
form.ShowDialog();
Thread.Sleep(2000);
label.Text = "bye";
label.Invalidate();
label.Update();
//Refresh Doesn't work either
//_BuyLabel.Refresh();
Application.DoEvents();
}
我已经完成了我的研究,但我对 Windows 窗体的了解非常有限,为此的库已经包含在内并且不是问题。
我还需要做什么来更新文本或任何其他控制功能?
试试这个:
class Program
{
private static Form form = new Form();
private static Label label = new Label();
static void Main(string[] args)
{
label.Text = "hi";
form.Controls.Add(label);
form.Load += Form_Load; // Add handle to load event of form
form.ShowDialog();
Application.DoEvents();
}
private async static void Form_Load(object sender, EventArgs e)
{
await Task.Run(() => // Run async Task for change label.Text
{
Thread.Sleep(2000);
if (label.InvokeRequired)
{
label.Invoke(new Action(() =>
{
label.Text = "bye";
label.Invalidate();
label.Update();
}));
}
});
}
}
我在我的电脑上运行它并工作。
只需添加公共函数即可更改表单中现有的标签:
public void changeLabelText(string text)
{
this.label1.Text=text; // label1 is the label that you want to change the text
}
在主函数中,您在创建表单对象后调用此函数
form.changeLabelText("text");
为此,您需要创建新表单示例 MainForm
如果您只想在启动时进行自定义,这实际上非常简单;就像您想要自定义的任何其他对象一样,为其提供一个构造函数,该构造函数接受您想要用于自定义类行为的任何参数。就像您的情况一样,标签文本。
这里不需要线程或通信。从外部源设置该标签是完全没有必要的。只需提前设计表单类,并为其添加标签,然后为其提供一个自定义构造函数,该构造函数接受要放在该标签上的字符串。
static void Main(string[] args)
{
MyForm form = new MyForm("hi");
form.ShowDialog();
}
在
MyForm
类本身中:
public MyForm(string labelText)
{
// Generated code.
InitializeComponent();
// Set label text
this.lblInfo.Text = labelText;
}
顺便说一句...我不确定您是否清楚“控制台应用程序”到底是什么。
任何程序都可以从命令提示符启动,并且完全可以为Windows应用程序提供static void Main(String[] args)
构造函数以使其接受命令行参数,事实上,也像任何其他应用程序一样,您可以更改
Main
函数的返回类型为
int
,使其在运行完成后返回退出代码。不过,控制台应用程序通常很少用处来显示表单;这通常违背了控制台应用程序的目的。
更新您的代码以遵循以下类似示例。主要要点是线程创建和 DoWork() 方法。您必须在其自己的线程中运行表单,否则它将被阻止。创建继承自 :Form 的 MyForm 类,并添加一个 updateLabel 函数,您可以在创建线程后在 DoWork 方法中调用该函数。
您收到的错误来自 Application.SetCompatibleTextRenderingDefault(false); 。你可以把这个拿出来。
static void Main(string[] args)
{
Console.WriteLine("Press return to launch the form.");
Console.ReadLine();
Application.EnableVisualStyles();
MyForm testForm = new MyForm();
System.Threading.Thread worker = new System.Threading.Thread(DoWork);
worker.Start(testForm);
Application.Run(testForm);
}
private static void DoWork(object formObject)
{
MyForm form = formObject as MyForm;
for (int i=0; i<=30; ++i)
{
form.UpdateLabel(i.ToString());
System.Threading.Thread.Sleep(1000);
}
}
label1.Invoke((MethodInvoker)(() => label1.Text = "YOUR_NEW_TEXT"));