C#:从控制台应用程序更新 Windows 窗体上的标签文本

问题描述 投票:0回答:5

我正在尝试更新从控制台应用程序启动的 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 窗体的了解非常有限,为此的库已经包含在内并且不是问题。

我还需要做什么来更新文本或任何其他控制功能?

c# winforms console label
5个回答
0
投票

试试这个:

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();
                }));
            }
        });
    }
}

我在我的电脑上运行它并工作。


0
投票

只需添加公共函数即可更改表单中现有的标签:

public void changeLabelText(string text)
{
   this.label1.Text=text; // label1 is the label that you want to change the text
}

在主函数中,您在创建表单对象后调用此函数

form.changeLabelText("text");

为此,您需要创建新表单示例 MainForm


0
投票

如果您只想在启动时进行自定义,这实际上非常简单;就像您想要自定义的任何其他对象一样,为其提供一个构造函数,该构造函数接受您想要用于自定义类行为的任何参数。就像您的情况一样,标签文本。

这里不需要线程或通信。从外部源设置该标签是完全没有必要的。只需提前设计表单类,并为其添加标签,然后为其提供一个自定义构造函数,该构造函数接受要放在该标签上的字符串。

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
,使其在运行完成后返回
退出代码。不过,控制台应用程序通常很少用处来显示表单;这通常违背了控制台应用程序的目的。


0
投票

更新:


您需要创建一个运行表单并允许更新标签或其他表单方法的线程。创建一个包含表单的类。

更新您的代码以遵循以下类似示例。主要要点是线程创建和 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); } }
    

0
投票
只需一行

label1.Invoke((MethodInvoker)(() => label1.Text = "YOUR_NEW_TEXT"));

© www.soinside.com 2019 - 2024. All rights reserved.