ToolStripStatusLabel显示为黑框

时间:2014-06-24 05:54:34

标签: c# .net statusstrip toolstripstatuslabel

我使用包含ToolStripStatusLabel的StatusStrip。操作系统 - Windows 7,框架2.0。 通常所有显示正常,但有时ToolStripStatusLabel看起来像黑盒子:

enter image description here

我读过那个windows bug,但是我怎么解决它?

2 个答案:

答案 0 :(得分:4)

这是一个模糊的错误,当您使用Windows工具栏重叠StatusStrip显示表单时会触发该错误。将窗口移离工具栏并不能使状态条上的ToolStripItem正确重新绘制。您会在this forum post中找到一些背景信息。对于它的未来修复有一个微弱的承诺,不知道是否曾经发生过。如果你在Win7上运行它可能不会。

您需要更加注意窗口的位置,确保窗口的某些部分不会消失在工具栏下方。一般来说,只要这个错误没有得到修复,你总是认为是非常重要的事情。如果你不想确定启动位置(你应该,用户倾向于喜欢在上次移动它的位置重新显示窗口),那么只需将表单的StartPosition属性更改为" CenterScreen& #34;

答案 1 :(得分:0)

此错误从未修复过。它在框架2中,仍然在框架4中。

汉斯的回答是social.msdn.microsoft.com的答案副本。

但它对我没有帮助,因为" CenterScreen"没有解决问题。

问题的原因不是Windows任务栏。原因是在绘制StatusStrip的第一时刻主窗体位于 ANY 其他窗口后面时,不会绘制StatusStrip的错误。但是当您从另一个进程使用Process.Start()启动新进程并且新进程在另一个进程的窗口后面打开时,也会发生这种情况。

我找到了比微软提出的更好的解决方案。

首先我尝试了

statusStrip.Invalidate();

但它不起作用。所以我们需要一种更强大的方法来强制Windows重绘StatusStrip。重要说明:当具有StatusStrip的表单在前台已经是ALREADY时,必须重新绘制!这很容易,我不明白为什么微软不建议这种方法。

Timer mi_StatusTimer = new Timer();

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);

    mi_StatusTimer.Interval = 500;
    mi_StatusTimer.Tick += new EventHandler(OnTimerBugFix);
}

protected override void OnActivated(EventArgs e)
{
    base.OnActivated(e);

    mi_StatusTimer.Start();
}

void OnTimerBugFix(object sender, EventArgs e)
{
    mi_StatusTimer.Stop();

    statusStrip.Hide();
    Application.DoEvents();
    statusStrip.Show();
}