代码之家  ›  专栏  ›  技术社区  ›  Mark

当窗口最小化时,如何将控件动态添加到Windows窗体拆分器控件中?

  •  0
  • Mark  · 技术社区  · 15 年前

    我在我们工作室的一个小的.NET应用程序中跟踪一个bug。该对话框基本上是一个状态报告对话框,根据当前记录的操作数,它尝试向现有对话框动态添加1个(或多个)进度条。

    我们有一个对话框,其中有一个包含拆分器容器的主对话框。拆分器的下部与显示状态spew的富edito控件绑定。拆分器区域的顶部是要动态添加1(或更多)进度条的位置。

    在操作过程中,将创建新的进度条,然后通过调整拆分容器面板1的大小将其附加到拆分容器中,以适应新控件,然后将新控件添加到拆分容器中(代码如下所示)。如果窗口未最小化,则此代码非常有效。当窗口最小化时,会在运行时引发异常,指示无法调整拆分容器的大小。具体来说,以下是错误消息:

    An exception of type 'System.InvalidOperationException' has occurred.
    Message: SplitterDistance must be between Panel1MinSize and Width - Panel2MinSize.
    

    问题(我认为)是因为窗口最小化,窗口的高度太小,无法调整拆分容器的大小。我怀疑.NET正在查看窗口最小化的大小,而不是它的正常状态大小。

    以下是代码(注意引发异常的行):

    // if we don't have any operations yet, add a small top margin
    if (splMain.SplitterDistance == 0) {
        splMain.SplitterDistance = 3;      // THE EXCEPTION IS THROWN HERE!!!!
    }
    
    ProgressDisplay display = new ProgressDisplay();
    display.OperationFinished += OperationFinished;
    display.Anchor    = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
    display.LabelText = label;
    display.Location  = new Point(6, splMain.SplitterDistance);
    display.Size      = new Size(splMain.Panel1.Width-12, display.Height);
    display.Start(steps);
    m_Operations.Push(display);
    
    // add the display to the top panel
    splMain.IsSplitterFixed = false;
    splMain.SplitterDistance += display.Height + 3;
    splMain.IsSplitterFixed = true;
    splMain.Panel1.Controls.Add(display);
    m_splitterAdjusted = true;
    

    根据调试器,panel1Minsize为0,panel2Minsize为2,width,父窗口的大小为(160,25)。因为拆分器是一个水平拆分器,所以我怀疑异常中的“宽度”实际上是高度,也就是25,使得异常为拆分器距离(3),必须介于0和0之间-因此是异常。

    现在,如果窗口最小化,我就不添加进度条,但是这样做的缺点是,当窗口恢复时,不显示进度条。我想另一个解决方案是在还原事件上添加进度条(如果还没有添加的话)。

    我很好奇是否有更好(或不同)的解决方案可用。谢谢!

    1 回复  |  直到 15 年前
        1
  •  0
  •   Cyril Gupta    15 年前

    我本来打算建议采用“不添加”的方法,但我看到你已经在这样做了。

    保留作业挂起,直到还原事件发生,然后添加它,然后将其保留在那里。最小化时,窗口没有大小,因此无法将控件添加到窗体中。