使用图表到系统托盘最小化表单时出现问题,

时间:2014-07-14 23:48:55

标签: c# exception charts system-tray

我有一个表单,通过挂钩到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;
        }
    }

现在......这似乎可以解决问题,但在我看来,这更像是一种解决方法,而不是一个可靠的解决方案。有谁知道解决这个问题的更优雅方式? (我想一开始我可以动态地查找所有图表,所以如果我添加更多图表,我就不必将其硬编码到例行程序中!)

1 个答案:

答案 0 :(得分:6)

更改ShowInTaskbar属性有许多副作用。它是一个“困难”属性,它强制重新创建本机窗口,因为该属性会影响使用CreateWindowEx()创建窗口时指定的窗口样式标志。底层样式标志是WS_EX_APPWINDOW,必须关闭它以摆脱任务栏按钮。这迫使Winforms破坏并重新创建窗口。

它具有引发麻烦的诀窍,特别是对于尚未充分调试的控件。并且当最小化并且没有有意义的大小时, 在最糟糕的时间执行此操作。可以肯定的是,这样的图表控件很可能反对被重新托管到具有0x0大小的新窗口。

试图保持那个令人愉快的控制感到满意,更简单的解决方法是更改ShowInTaskbar属性。没有意义,当你调用Hide()时,任务栏按钮都是不可见的。

删除ShowInTaskbar属性分配以解决问题。