SplitContainer面板调整大小问题

一般问题

该应用程序是C#WinForms .Net 4.0。

我有一个SplitContainer占用了大部分表单,它被设置为全方位锚定,因此它随着表单一起重新调整大小。 左面板(Panel1)有一个简单的菜单,这里没有问题。 右侧面板(Panel2)更加复杂,并且包含许多嵌套的选项卡控件(包含许多控件) - 它非常复杂,但不会改变。

问题在于重新调整表格的效果并不理想。 事实上,如果通过缓慢拖动边缘来调整大小,那么它可以正常工作,但可以快速拖动或使用“恢复”按钮(表单右上角),然后就会出现问题。


我的控制层次结构

以下是我的控制层次结构的一个简单示例,它绝对是一个减少版本,但突出显示嵌套的选项卡控件可能有助于复制:

  • 形成
  • 拆分容器(锚点:顶部,左侧,底部,右侧)
  • SC Panel1(最小宽度:300)
  • TreeViewControl(忘记它被称为)
  • SC Panel2
  • 面板(锚点:顶部,左侧,底部,右侧)
  • 选项卡控制(锚点:顶部,左侧,底部,右侧)
  • 选项卡控制w /很多页面溢出屏幕,并要求导航按钮显示在右上角(锚点:顶部,左侧,底部,右侧)

  • 调试细节

    经过一些调试后,它看起来实际上是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及其子splitContainerMain.Panel2.Width没有。

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


    我的努力到目前为止

    我想知道这个问题是否与这个问题有关,但我不准备创建一个新的“MySplitContainer”来尝试解决这个问题。

    我试图做的是使用各种Form resize事件,并尝试手动设置宽度,但无济于事。 我想我想尝试的是从某种事件中设置Panel2.Width值。


    我在寻找什么

  • 无论如何强迫splitContainerMain.Panel2.WidthsplitContainerMain大小更改时正确调整大小?
  • 或者,我怎样才能计算Panel2.Width应该是什么? 我怎样才能从Form.Resize事件中设置该值? (或其他事件?)

  • 从我看到的你应该设置锚点到没有包括splitcontainer pannels在内的创建问题的控件。

    此外,我会建议使用码头填充属性,以最好地使用splitcontainers。

    如果需要进一步帮助,请提供设计文件,以便更好看。


    完全相同的问题,下面的代码为我工作:

  • 环绕splitContainer在面板“tableBorder”
  • 在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;
    }
    
  • 有一个小滞后,但工程

    链接地址: http://www.djcxy.com/p/62001.html

    上一篇: SplitContainer Panel Resize Issue

    下一篇: Emulating TrackBar Resizing Behavior in a UserControl