簡體   English   中英

C#:從控制台應用程序更新Windows窗體上的標簽文本

[英]C#: Update Label Text On Windows Forms From Console Application

我正在嘗試從控制台應用程序啟動的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 Forms的了解非常有限,已經包含了有關此庫的內容,這不是問題。

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

嘗試這個:

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

我在我的電腦上運行它,然后工作。

更新:


您需要創建一個運行表單的線程,並允許更新標簽或其他表單方法。 創建一個帶有窗體的類。

更新您的代碼,以遵循以下類似示例。 主要要點是線程創建和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);
        }
    }

如果您只想在啟動時進行自定義,這實際上非常簡單; 與要自定義的任何其他對象一樣,為它提供一個構造函數,該構造函數接受要用於自定義類行為的任何參數。 就像您的情況一樣,標簽文字。

這里不需要線程或通信。 完全不需要從外部設置該標簽。 只需預先設計表單類,並在其上已經有標簽,然后為其提供一個自定義構造函數即可接受要放置在該標簽上的字符串。

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以使其在完成運行后返回退出代碼 但是,控制台應用程序通常很少顯示表單。 通常會破壞控制台應用程序的目的。

只需添加公共功能即可更改以下形式的現有標簽:

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

在創建表單對象后,從主函數調用此函數

form.changeLabelText("text");

為此,您需要創建一個新表單Example MainForm

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM