的一般问题
该应用程序是C#WinForms.Net 4.0。
我有一个SplitContainer
,它占据了表单的大部分,它被设置为在所有方向上锚定,因此它会随着表单一起重新调整大小。左侧面板(Panel1)有一个简单的菜单,这里没有问题。右侧面板(Panel2)更为复杂,包含许多嵌套的选项卡控件(有很多控件)——它非常复杂,但不会改变。
问题是重新调整表单的大小效果不太好。事实上,如果你通过缓慢拖动边来调整大小,那么它可以正常工作,但快速拖动或使用"恢复"按钮(表单的右上角),那么问题就会出现。
我的控制层次
以下是我的控件层次结构的一个简单示例,它绝对是一个精简版,但确实突出了嵌套的选项卡控件,这可能有助于复制:
- 表单
- 拆分容器(锚点:顶部、左侧、底部、右侧)
- SC面板1(最小宽度:300)
- TreeViewControl(忘记它的名称)
- SC面板2
- 面板(锚:顶部、左侧、底部、右侧)
- 选项卡控件(锚点:顶部、左侧、底部、右侧)
- 选项卡控件有很多页面溢出屏幕,需要导航按钮显示在右上角(锚点:上、左、下、右)
- 选项卡控件(锚点:顶部、左侧、底部、右侧)
- 面板(锚:顶部、左侧、底部、右侧)
- SC面板1(最小宽度:300)
- 拆分容器(锚点:顶部、左侧、底部、右侧)
调试详细信息
经过一些调试后,看起来实际上是Panel2
(拆分容器的子容器)没有正确调整大小,而实际的SplitContainer
本身的大小调整得很好。
以下是显示这一点的调试值。。。
全宽表单,调整大小前:
splitContainerMain.Width: 1479
splitContainerMain.Panel2.Width: 1206
panelCenter.Width: 1203
tabControlMain.Width: 1215
不出所料,splitContainerMain.Panel2.Width
小于splitContainerMain.Width
。
调整发生问题的位置后:
splitContainerMain.Width: 815
splitContainerMain.Panel2.Width: 1206
panelCenter.Width: 1203
tabControlMain.Width: 1215
可以看出,splitContainerMain.Width
已经根据需要调整了大小,但splitContainerMain.Panel2.Width
及其子级没有。
注意:请记住,如果我手动缓慢调整表单大小,宽度会正确更新-这不是我没有正确设置任何锚点的问题。
我迄今为止的努力
我尝试过使用各种Form调整大小事件,并尝试手动设置宽度,但都无济于事。我想我想尝试的是从某种事件中设置Panel2.Width
值
我在寻找什么
- 当
splitContainerMain
的大小发生变化时,是否有强制splitContainerMain.Panel2.Width
正确调整大小的方法 - 或者,我如何计算
Panel2.Width
应该是什么?如何从Form.Resize
事件中设置该值?(还是其他活动?)
虽然这个问题已经6岁了,但我选择回答这个问题是因为我和开场白的情况一样。遗憾的是,没有指定方向。所以,我的答案是解决那些水平方向的问题。
请翻译成C#,因为此代码在VB.中
Private Sub splitContainerMain_Resize(sender As Object, e As EventArgs) Handles splitContainerMain.Resize
'/* This is a work around about panels being left out when SplitContainer is resized */
Dim pnl1Height As Single = splitContainerMain.SplitterDistance '/* Get upper panel height */
Dim pnl2Height As Single = splitContainerMain.Height - splitContainerMain.SplitterDistance '/* Get lower panel height */
splitContainerMain.Panel1.SetBounds(0, 0, splitContainerMain.Width, pnl1Height) '/* Set Upper panel bounds */
'/* Set lower panel bounds, with a top of upper panel height plus splitter width */
splitContainerMain.Panel2.SetBounds(0, pnl1Height + splitContainerMain.SplitterWidth, splitContainerMain.Width, pnl2Height)
End Sub
根据我所看到的,对于正在产生问题的控件(包括splitcontainer面板),u应该将anchor设置为none。
此外,我建议使用码头填充属性来最好地使用拆分容器。
如果需要进一步的帮助,请提供设计器文件,以便有更好的外观。
因此,在每个Change事件中,您都要创建一个新线程,然后该线程将等待100毫秒,然后进行背诵???那太愚蠢了。您可以在构造函数中创建一个线程,然后在您的线程上调用Start(),该线程可能具有以下内容:
private void resizeMe()
{
this.BeginInvoke((Action)() => {
splitContainer.Height = tableBorder.Height;
splitContainer.Width = tableBorder.Width;
}
}
完全相同的问题,下面的代码对我有效:
- 在面板"tableBorder"中环绕splitContainer
表上边界
Dock = DockStyle.Fill;
在拆分集装箱上,(无锚定)
Dock = DockStyle.None;
表上Border SizeChanged事件
private void tableBorder_SizeChanged(object sender, EventArgs e) { new Thread(() => { resizeMe(); }).Start(); } private void resizeMe() { Thread.Sleep(100); this.BeginInvoke((Action)(() => { doIt(); })); } private void doIt() { splitContainer.Height = tableBorder.Height; splitContainer.Width = tableBorder.Width; }
有一个小的滞后,但工作