SplitContainer面板调整大小问题

本文关键字:问题 调整 SplitContainer | 更新日期: 2023-09-27 18:26:39

的一般问题

该应用程序是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及其子级没有。

注意:请记住,如果我手动缓慢调整表单大小,宽度会正确更新-这不是我没有正确设置任何锚点的问题。


我迄今为止的努力

我尝试过使用各种Form调整大小事件,并尝试手动设置宽度,但都无济于事。我想我想尝试的是从某种事件中设置Panel2.Width


我在寻找什么

  • splitContainerMain的大小发生变化时,是否有强制splitContainerMain.Panel2.Width正确调整大小的方法
  • 或者,我如何计算Panel2.Width应该是什么?如何从Form.Resize事件中设置该值?(还是其他活动?)

SplitContainer面板调整大小问题

虽然这个问题已经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;
    }
}

完全相同的问题,下面的代码对我有效:

  1. 在面板"tableBorder"中环绕splitContainer

表上边界

Dock = DockStyle.Fill;

在拆分集装箱上,(无锚定)

Dock = DockStyle.None;
  1. 表上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;
    }
    

有一个小的滞后,但工作