更新状态栏文本

这是最简单的事情,但我无法更新状态栏上的文字…我刚开始在c#中工作但找不到解决方案..在所有答案中,接受的答案是statusBar1.Text = "text"; 我做了简单的菜单,并在菜单中添加了LOAD项目。 图片已加载,一切正常,只是状态文本不更新…顺便说一下,MessageBox还会在状态栏中显示我需要的正确文本。 这是我的代码,它只是不起作用:

  private void menuLoad_Click(object sender, EventArgs e) { OpenFileDialog dlg = new OpenFileDialog(); dlg.Title = "Load Photo"; dlg.Filter = "jpg files (*.jpg)" + "|*.jpg|All files (*.*)|*.*"; if (dlg.ShowDialog() == DialogResult.OK) { try { statusBar1.Text = "Loading " + dlg.FileName; pbxPhoto.Image = new Bitmap(dlg.OpenFile()); statusBar1.Text = "Loaded " + dlg.FileName; MessageBox.Show("Text = " + dlg.FileName); } catch (Exception ex) { statusBar1.Text = "Unable to load file " + dlg.FileName; MessageBox.Show("Unable to load file: " + ex.Message); } } dlg.Dispose(); } 

screenshot1

也许文本被设置但是没有被绘制,因为你的线程忙于加载图片? 您可以尝试强制状态栏使自身无效并重新绘制:

 statusBar1.Text = "Loading " + dlg.FileName; statusBar1.Invalidate(); statusBar1.Refresh(); pbxPhoto.Image = new Bitmap(dlg.OpenFile()); statusBar1.Text = "Loaded " + dlg.FileName; statusBar1.Invalidate(); statusBar1.Refresh(); MessageBox.Show("Text = " + dlg.FileName); 

实际上我想我会把它封装成一个方法,如下所示:

 private void UpdateStatusBarText(string text) { statusBar1.Text = text; statusBar1.Invalidate(); statusBar1.Refresh(); } 

这样你的try块看起来像这样:

 UpdateStatusBarText("Loading " + dlg.FileName); pbxPhoto.Image = new Bitmap(dlg.OpenFile()); UpdateStatusBarText("Loaded " + dlg.FileName); MessageBox.Show("Text = " + dlg.FileName); 

编辑

StatusStrip控件是一个容器控件。 向其中添加ToolStripStatusLabel项,并更改该控件的文本而不是statusBar1的文本:

 private void UpdateStatusBarText(string text) { toolStripStatusLabel1.Text = text; statusBar1.Invalidate(); statusBar1.Refresh(); } 

这个答案与WPF有关,因为这个问题最初被标记为WPF

正如@MattBurland所提到的,UI更新不会与执行同时发生。 这意味着为UI属性设置不同的值是没有意义的,因为实际上只会更新最后一个。 相反,您需要使用Dispatcher在UI线程上安排消息。 尝试这样的事情:

 private void UpdateStatus(string message) { Application.Current.Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => { statusBar1.Text = message; })); } 

然后在你的方法中:

 try { UpdateStatus("Loading " + dlg.FileName); pbxPhoto.Image = new Bitmap(dlg.OpenFile()); UpdateStatus("Loaded " + dlg.FileName); MessageBox.Show("Text = " + dlg.FileName); } catch (Exception ex) { UpdateStatus("Unable to load file " + dlg.FileName); MessageBox.Show("Unable to load file: " + ex.Message); }