繁体   English   中英

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

[英]How do I dynamically add controls into windows form splitter control while window is minimized?

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

我们有一个对话框,其中包含一个包含拆分器容器的主对话框。 拆分器的下部与一个丰富的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,使得例外是SplitterDistance(3),必须在0到0之间-因此是例外。

现在,如果窗口最小化,我只是不添加进度条,但是这样做的缺点当然是在恢复窗口时不显示进度条。 我猜另一种解决方案是在还原事件上添加进度条(如果尚未添加)。

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

我本来建议使用“不添加”方法,但是我看到您已经这样做了。

将作业保持待处理状态,直到发生还原事件为止,然后将其添加,然后将其保留在该位置。 最小化时,窗口没有大小,因此您根本无法将控件添加到窗体中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM