SplitContainer 面板调整大小问题
Posted
技术标签:
【中文标题】SplitContainer 面板调整大小问题【英文标题】:SplitContainer Panel Resize Issue 【发布时间】:2013-08-07 09:22:08 【问题描述】:一般问题
应用程序是 C# WinForms .Net 4.0。
我有一个SplitContainer
,它占据了表单的大部分,它被设置为各个方向的锚点,因此它会随着表单重新调整大小。左侧面板(Panel1)有一个简单的菜单,这里没有问题。右侧面板 (Panel2) 更复杂,包含许多嵌套的选项卡控件(有很多控件)——它非常复杂,但并没有改变。
问题是重新调整表单的大小并不能很好地工作。事实上,如果您通过缓慢拖动边缘来调整大小,那么它可以正常工作,但快速拖动或使用“恢复”按钮(表单右上角)就会出现问题。
我的控制层次结构
以下是我的控件层次结构的一个简单示例,它绝对是一个精简版,但确实突出显示了可能有助于复制的嵌套选项卡控件:
表格 拆分容器(锚点:上、左、下、右) SC 面板 1(最小宽度:300) TreeViewControl(忘记叫什么了) SC 面板2 面板(锚点:上、左、下、右) 选项卡控件(锚点:上、左、下、右) 带有大量页面的选项卡控件溢出屏幕并需要导航按钮显示在右上角(锚点:上、左、下、右)调试详情
经过一些调试,实际上是 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
及其子代没有。
注意:请记住,如果我手动缓慢调整表单大小,宽度会正确更新 - 这不是我没有正确设置任何锚点的问题。
我目前的努力
我尝试做的是使用各种表单调整大小事件并尝试手动设置宽度,但无济于事。我想我想尝试的是从某种事件中设置Panel2.Width
值。
我在寻找什么
当splitContainerMain
大小发生变化时,是否强制splitContainerMain.Panel2.Width
正确调整大小?
另外,我如何计算Panel2.Width
应该是什么?我如何从Form.Resize
事件中设置该值? (或其他活动?)
【问题讨论】:
我试图整理一个表格进行测试,但我还没有看到你描述的不良行为。如果您可以提供更多布局细节,那将有所帮助。但除此之外,我无法重现您的结果。 @DonBoitnott:我添加了一些关于我的布局的细节,我知道这不会很容易复制,但也许它会有所作为。我会看看我是否也可以在新的 winforms 应用中复制 什么是panelCenter
?你是如何调整大小的......在代码中?......只需拖动表单边缘?
@musefan 我认为Panel2
总是有Dock = DockStyle.Fill
(Dock
是隐藏的`)所以你的问题很奇怪,我认为你应该发布一些屏幕截图而不是很多文字.
微软的问题链接(在“到目前为止我的努力”部分已损坏
【参考方案1】:
虽然这个问题大约有 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
【讨论】:
【参考方案2】:据我所知,对于产生问题的控件(包括拆分容器面板),您应该将 anchor 设置为 none。
我还建议使用停靠填充属性来最好地使用拆分容器。
如果需要进一步帮助,请提供设计器文件,以便更好地查看。
【讨论】:
【参考方案3】:因此,在每个 Change 事件中,您正在创建一个新线程,该线程将等待 100 毫秒,然后执行重新调整???那是愚蠢的。您可以在构造函数中创建一个线程,然后在您的线程上调用 Start(),它可能具有以下内容:
private void resizeMe()
this.BeginInvoke((Action)() =>
splitContainer.Height = tableBorder.Height;
splitContainer.Width = tableBorder.Width;
【讨论】:
【参考方案4】:完全相同的问题,下面的代码对我有用:
-
在面板“tableBorder”中环绕 splitContainer
在桌边
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;
有一点延迟,但可以工作
【讨论】:
以上是关于SplitContainer 面板调整大小问题的主要内容,如果未能解决你的问题,请参考以下文章