我在我们工作室的一个小的.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之间-因此是异常。
现在,如果窗口最小化,我就不添加进度条,但是这样做的缺点是,当窗口恢复时,不显示进度条。我想另一个解决方案是在还原事件上添加进度条(如果还没有添加的话)。
我很好奇是否有更好(或不同)的解决方案可用。谢谢!