ToolStripStatusLabel отображается как черный ящик

Я использую StatusStrip, который содержит ToolStripStatusLabel. ОС - Windows 7, фреймворк 2.0. Обычно все отображается нормально, но иногда ToolStripStatusLabel выглядит как черный ящик:

Я прочитал эту ошибку Windows, но как я могу это исправить?

2 ответа

Решение

Это неясная ошибка, возникающая при отображении формы с панелью инструментов Windows, перекрывающей вашу StatusStrip. Перемещение окна от панели инструментов не приводит к тому, что ToolStripItems в строке состояния перекрашиваются должным образом. Вы найдете немного фона в этом сообщении на форуме. Было слабое обещание будущего исправления, даже не подозревая, случится ли это когда-нибудь. Вероятно, нет, если вы используете это на Win7.

Вам нужно будет уделять больше внимания положению окна, следя за тем, чтобы его части не исчезали под панелью инструментов. В общем, то, что вы всегда учитываете, особенно важно, если эта ошибка не устранена. Если вы не хотите закреплять начальную позицию (вам, как правило, нравится, когда окно перерисовывается там, где они его в последний раз перемещали), просто измените свойство формы StartPosition на "CenterScreen".

Эта ошибка никогда не была исправлена. Это было в рамках 2 и все еще в рамках 4.

Ответ от Ганса является копией ответа в social.msdn.microsoft.com.

Но это не полезно для меня, потому что "CenterScreen" не решает проблему.

Причиной проблемы является не панель задач Windows. Причиной является ошибка, которая не рисует StatusStrip, когда основная форма находится позади ЛЮБОГО другого окна в первый момент рисования StatusStrip. Но это также произойдет, когда вы начнете новый процесс с Process.Start() из другого процесса, и новый процесс открывается за окном другого процесса.

Я нашел гораздо лучшее решение, чем предложенное Microsoft.

Сначала я попробовал с

statusStrip.Invalidate();

Но это не работает. Поэтому нам нужен более сильный способ заставить Windows перерисовать StatusStrip. Важно: перерисовка должна произойти, когда Форма с StatusStrip уже на переднем плане! Это так просто, что я не понимаю, почему Microsoft не предлагает этот метод.

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();
}
Другие вопросы по тегам