4

这是最简单的事情,但我无法更新状态栏上的文本......我刚开始在 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();
    }

截图1

4

2 回答 2

6

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

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();    
}
于 2013-08-27T16:46:52.553 回答
3

此答案与 WPF 有关,因为此问题最初标记为WPF.

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

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);
}
于 2013-08-27T15:28:48.050 回答