一般问题
该应用程序是C#WinForms .Net 4.0。
我有一个占据大部分表单的SplitContainer
,它会在所有方向上设置为Anchor,因此它会与表单一起重新调整大小。左侧面板(Panel1)有一个简单的菜单,这里没有问题。右侧面板(Panel2)更复杂,包含许多嵌套的选项卡控件(包含大量控件) - 它非常复杂,但并没有改变。
问题在于重新调整表单大小并不是很好。事实上,如果你通过缓慢拖动边缘来调整大小然后它可以正常工作,但是快速拖动或使用“恢复”按钮(表单的右上角)然后问题发生。
我的控件层次结构
以下是我的控件层次结构的一个简单示例,它绝对是一个缩减版本,但突出显示了可能有助于复制的嵌套选项卡控件:
调试详情
经过一些调试后,看来实际上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 resize事件并尝试手动设置宽度,但无济于事。我想我想尝试的是在某种事件中设置Panel2.Width
值。
我在寻找什么
splitContainerMain.Panel2.Width
尺寸发生变化时,是否还要强制splitContainerMain
正确调整大小?Panel2.Width
应该是什么?如何从Form.Resize
事件中设置该值? (或其他事件?)答案 0 :(得分:0)
从我看到的情况来看,对于创建问题的控件(包括splitcontainer pannels),应该将anchor设置为none。
另外我建议使用dock fill属性来最好地使用splitcontainers。
如果需要进一步帮助,请提供设计师档案,以便更好看。
答案 1 :(得分:0)
尽管这个问题大约有6岁,但我选择回答这个问题是因为我处于与空缺职位相同的情况。不幸的是,没有指定方向。因此,我的答案将解决水平方向的问题。
由于此代码在VB中,请转换为C#。
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
答案 2 :(得分:-1)
因此,在每个Change事件上,您都在创建一个新线程,该线程将等待100毫秒,然后执行记录?多数民众赞成在愚蠢。您可以在构造函数中创建一个线程,然后在该线程上调用Start(),该线程可能具有以下内容:
private void resizeMe()
{
this.BeginInvoke((Action)() => {
splitContainer.Height = tableBorder.Height;
splitContainer.Width = tableBorder.Width;
}
}
答案 3 :(得分:-3)
完全相同的问题,下面的代码对我有用:
on tableBorder
Dock = DockStyle.Fill;
在拆分容器上,(无锚定)
Dock = DockStyle.None;
在tableBorder 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;
}
有一个小的滞后,但有效