2013-08-06 163 views
6

一般问题SplitContainer的面板调整大小问题

的应用程序是C#的WinForms .NET 4.0。

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

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


我的控制层次

以下是我的控制层级,它绝对是一个削减版的一个简单的例子,但确实凸显了嵌套的标签控制的,可与复制帮助:

  • 形式
    • 拆分集装箱(主播:上,左,下,右)
      • SC Panel1的(最小宽度:300)
        • TreeViewControl(忘记它叫什么)
      • SC是Panel2
        • 面板(锚:顶部,左边,底部,右侧)
          • 选项卡控件(锚点:顶部,左侧,底部,右侧)
            • 选项卡控件包含大量溢出屏幕并需要导航按钮才能显示的页面p右下角(主播:上,左,下,右)

调试详细

一些调试后,它看起来实际上是Panel2(拆分容器的孩子)没有正确调整大小,而实际的SplitContainer本身调整正常。

这里是调试值,显示此...

全宽形式,调整大小前:

splitContainerMain.Width: 1479 
splitContainerMain.Panel2.Width: 1206 
panelCenter.Width: 1203 
tabControlMain.Width: 1215 

所有预期,splitContainerMain.Panel2.WidthsplitContainerMain.Width小。

调整大小后在那里出现问题:

splitContainerMain.Width: 815 
splitContainerMain.Panel2.Width: 1206 
panelCenter.Width: 1203 
tabControlMain.Width: 1215 

可以看出,在splitContainerMain.Width已调整为所需,但splitContainerMain.Panel2.Width,随后其子都没有。

注意:请记住,宽度更新正确,如果我手动调整的形式慢慢地 - 这是不是我没有正确设置任何锚的问题。


我的努力到目前为止

我想知道如果这个问题是related to this problem here,但我不准备建立一个新的“MySplitContainer”,试图解决这个问题。

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


我所寻找的

  • 反正是有强制splitContainerMain.Panel2.Width正确调整splitContainerMain大小变化时?
  • 或者,我该如何计算Panel2.Width应该是什么?我怎样才能从Form.Resize事件中设置这个值? (或另一个事件?)
+0

我试图把一个形式进行测试,但我还没有看到你描述的不良行为。如果你可以提供更多的布局细节,这将有所帮助。但除此之外,我没有太多运气来重现你的结果。 – DonBoitnott

+0

@DonBoitnott:我已经添加了一些关于我的布局的细节,我知道这不是很容易复制,但也许它会做一些事情。我会看看我是否可以在一个新的Winforms应用程序中复制 – musefan

+0

什么是'panelCenter'?而且你如何在代码中调整大小... ...只需拖动窗体边缘? – DonBoitnott

回答

0

从我看到你应该设置锚为none为控件创建包括splitcontainer pannels的问题。

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

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

-2

完全相同的问题,下面的代码为我工作:在面板中的 “tableBorder”

在tableBorder

Dock = DockStyle.Fill; 

在拆分集装箱,(

  1. 环绕SplitContainer的无锚定)

    Dock = DockStyle.None; 
    
  2. 在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; 
    } 
    

有一个小的滞后,但工程