【问题标题】:Issue when minimizing forms with Charts to System Tray,将带有图表的表单最小化到系统托盘时出现问题,
【发布时间】:2014-07-14 23:48:55
【问题描述】:

我有一个通过连接到 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;
        }
    }

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

【问题讨论】:

    标签: c# exception charts system-tray


    【解决方案1】:

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

    它有制造麻烦的诀窍,尤其是对于调试不够好的控件。而您正在在最糟糕的时间这样做,此时窗口已最小化并且没有有意义的大小。可以肯定的是,这样的图表控件很可能会反对将其重新托管到大小为 0x0 的新窗口。

    除了试图让那个笨拙的控制满意之外,更简单的解决方法是更改 ShowInTaskbar 属性。没有意义,当你调用 Hide() 时任务栏按钮是不可见的。

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

    【讨论】:

    • 太棒了!谢谢!更优雅,我也很欣赏对问题发生原因的解释。
    猜你喜欢
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    • 2012-11-17
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    相关资源
    最近更新 更多