即时更新toolStripStatusLabel

4

我有一个WinForms程序,其中包含一个 button,一个 statusStrip 和一个在那个 statusStrip 中的 toolStripStatusLabel。如果我点击这个按钮并运行此代码:

private void button1_Click(object sender, EventArgs e)
{
    toolStripStatusLabel1.Text = "Test";

    System.Threading.Thread.Sleep(5000);
}

当线程在休眠期间,toolStripStatusLabel的文本内容不会立即更新。我该如何让它立即更新,然后再使线程休眠?


在睡眠之前使用 toolStripStatusLabel1.Update() - P. Kouvarakis
@P.Kouvarakis 我在 https://msdn.microsoft.com/zh-cn/library/system.windows.forms.toolstripstatuslabel(v=vs.110).aspx 中没有看到任何这样的方法。 - derekantrican
2
抱歉,你是对的。ToolStripStatusLabel不是一个Control。你必须在工具栏本身(statusStrip?)上调用Update() - P. Kouvarakis
啊,没错!那个可行!谢谢你! - derekantrican
1
或者您可以在void之前添加“async”,并使用“await Task.Delay(5000)”来替换“Thread.Sleep(5000)”。 - Anthony
5个回答

7

正如P. Kouvarakis所说,解决方案如下:

toolStripStatusLabel1.Text = "Test";
statusStrip1.Update();

0
  1. 你需要添加一个状态栏文本标签(作为子组件)(因为你不能操作父组件的文本),像这样:

child component

当您双击状态栏组件时,您将看到以下内容。

2ble click pic

请勿在此处添加文本更改代码,因为只有在单击后才会刷新(如您在图片中所见 - statusStrip1_ItemClicked)。 因此,任何statusStrip1.Update(); this.Update();等都无法帮助您。

  1. 如何快速完成。您可以在目标条件开始的位置添加if,就像在这张图片中一样。

example "if"


0

当状态栏的Spring设置为true时,我的状态标签更改在运行时没有显示。我将Spring设置为false,然后它开始显示。


-1
toolStripStatusLabel1.Text = "Test";
Application.DoEvents();

-1

使用Application.DoEvents()的最后一个解决方案是最好的。每次更改StatusStrip时都必须附加Application.DoEvents()

private void SetParseStatus(object sender, ParseStatusChangedEventArgs e)
{
    toolStripProgressBar1.Value = e.Percent;
    Application.DoEvents();
}

DoEvents具有潜在的副作用。在大多数情况下,您应该避免使用它。 - LarsTech
DoEvents()确实具有奇怪且可能严重的副作用。我正在与DoEvents()作斗争,因为它被大量使用导致应用程序冻结。解决这些问题将是困难的,已经过去一周了,我现在才接近问题所在。 - John Dyer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接