我有一个表单,通过挂钩到form_resize事件,我最小化到系统托盘。一切运作良好,直到我在表格中添加了图表。当图表在表单上时,我会得到以下异常:
宽度必须大于0px。
突出显示的行是:
this.ShowInTaskbar = false;
我花了一些时间来解决问题所在(包括它添加导致它的图表),但设法从非常长的堆栈跟踪消息中推断出它。无论如何,我设法通过在隐藏表单之前将图表可见性设置为false来解决它。
private void Form1_Resize(object sender, EventArgs e)
{
if (FormWindowState.Minimized == this.WindowState)
{
//Hide chart to prevent exception
chtCompliance.Visible = false;
chtHistory.Visible = false;
icoTrayIcon.Visible = true;
icoTrayIcon.ShowBalloonTip(500);
this.ShowInTaskbar = false;
this.Hide();
}
else if (FormWindowState.Normal == this.WindowState)
{
icoTrayIcon.Visible = false;
this.ShowInTaskbar = true;
//Restore chart visibility
chtCompliance.Visible = true;
chtHistory.Visible = true;
}
}
现在......这似乎可以解决问题,但在我看来,这更像是一种解决方法,而不是一个可靠的解决方案。有谁知道解决这个问题的更优雅方式? (我想一开始我可以动态地查找所有图表,所以如果我添加更多图表,我就不必将其硬编码到例行程序中!)
答案 0 :(得分:6)
更改ShowInTaskbar属性有许多副作用。它是一个“困难”属性,它强制重新创建本机窗口,因为该属性会影响使用CreateWindowEx()创建窗口时指定的窗口样式标志。底层样式标志是WS_EX_APPWINDOW,必须关闭它以摆脱任务栏按钮。这迫使Winforms破坏并重新创建窗口。
它具有引发麻烦的诀窍,特别是对于尚未充分调试的控件。并且当最小化并且没有有意义的大小时, 在最糟糕的时间执行此操作。可以肯定的是,这样的图表控件很可能反对被重新托管到具有0x0大小的新窗口。
试图保持那个令人愉快的控制感到满意,更简单的解决方法是不更改ShowInTaskbar属性。没有意义,当你调用Hide()时,任务栏按钮都是不可见的。
删除ShowInTaskbar属性分配以解决问题。