ain*_*ood 2 c# charts exception system-tray
我有一个表单,我通过挂钩到form_resize事件最小化到系统托盘.一切运作良好,直到我在表格中添加了图表.当图表在表单上时,我会得到以下异常:
宽度必须大于0px.
突出显示的行是:
this.ShowInTaskbar = false;
Run Code Online (Sandbox Code Playgroud)
我花了一些时间来解决问题所在(包括它添加导致它的图表),但设法从非常长的堆栈跟踪消息中推断出它.无论如何,我设法通过在隐藏表单之前将图表可见性设置为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;
}
}
Run Code Online (Sandbox Code Playgroud)
现在......这似乎解决了这个问题,但在我看来,这更像是一个解决方法,而不是一个可靠的解决方案.有谁知道更优雅的方法来解决这个问题?(我想一开始我可以动态查找所有图表,所以如果我添加更多,我就不必将其硬编码到例行程序中!)
更改ShowInTaskbar属性有许多副作用.它是一个"困难"属性,它强制重新创建本机窗口,因为该属性会影响使用CreateWindowEx()创建窗口时指定的窗口样式标志.底层样式标志是WS_EX_APPWINDOW,必须关闭它以摆脱任务栏按钮.这迫使Winforms破坏并重新创建窗口.
这有引起麻烦的诀窍,特别是对于未经过充分调试的控件.当窗口最小化且没有有意义的大小时,您正在最糟糕的时间进行此操作.可以肯定的是,这样的图表控件很可能反对被重新托管到具有0x0大小的新窗口.
试图保持那个笨拙的控制感到快乐,更简单的解决方法是不改变ShowInTaskbar属性.没有意义,当你调用Hide()时,任务栏按钮无论如何都是不可见的.
删除ShowInTaskbar属性分配以解决您的问题.