C# 拆分容器面板调整大小问题

C# 拆分容器面板调整大小问题,c#,winforms,splitcontainer,C#,Winforms,Splitcontainer,一般问题 应用程序是C#WinForms.net4.0 我有一个SplitContainer,它占据了表单的大部分,它被设置为在各个方向锚定,因此它会随着表单重新调整大小。左侧面板(Panel1)有一个简单的菜单,这里没有问题。右侧面板(Panel2)更为复杂,包含许多嵌套的选项卡控件(包含许多控件)——非常复杂,但没有改变 问题是重新调整表单的大小效果不太好。事实上,如果您通过缓慢拖动边缘来调整大小,则效果正常,但快速拖动或使用“还原”按钮(表单右上角)则会出现问题 我的控制层次结构 下面是

一般问题

应用程序是C#WinForms.net4.0

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

问题是重新调整表单的大小效果不太好。事实上,如果您通过缓慢拖动边缘来调整大小,则效果正常,但快速拖动或使用“还原”按钮(表单右上角)则会出现问题


我的控制层次结构

下面是我的控件层次结构的一个简单示例,它肯定是一个精简版本,但突出显示了嵌套选项卡控件,这可能有助于复制:

  • 形式
    • 拆分容器(锚定:顶部、左侧、底部、右侧)
      • SC面板1(最小宽度:300)
        • TreeView控件(忘记它的名称)
      • 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
    正确调整大小
  • 或者,如何计算
    面板2.宽度应为多少?如何从
    Form.Resize
    事件中设置该值?(或其他事件?)

据我所知,对于产生问题的控件(包括splitcontainer窗格),u应该将anchor设置为none

另外,我建议使用dock fill属性来最好地使用splitcontainers


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

完全相同的问题,以下代码适用于我:

  • 在面板“tableBorder”中环绕splitContainer
  • 在桌边

    Dock = DockStyle.Fill;
    
    分体式容器上(无锚固)

  • 关于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;
    }
    

  • 有一个小的延迟,但有效

    因此,在每次创建新线程的更改事件中,该线程将等待100毫秒,然后执行recize???那太愚蠢了。您可以在构造函数中创建一个线程,然后在线程上调用Start(),该线程可能具有以下内容:

    private void resizeMe() 
    {
        this.BeginInvoke((Action)() => {
            splitContainer.Height = tableBorder.Height;
            splitContainer.Width = tableBorder.Width;
        }
    }
    

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

    我试着整理一个表单进行测试,但我还没有看到您描述的不良行为。如果你能提供更多的布局细节,这会有所帮助。但除此之外,我复制您的结果的运气不太好。@DonBoitnott:我已经添加了一些关于布局的细节,我知道这不容易复制,但也许它会有所帮助。我将看看是否可以在新的winforms应用程序中复制什么是
    panelCenter
    ?你是如何调整大小的…在代码中?…简单地拖动表单边缘?@musefan我认为
    Panel2
    总是有
    Dock=DockStyle.Fill
    (Dock
    是隐藏的)所以你的问题很奇怪,我认为你应该发布一些屏幕截图,而不是大量的文字。问题链接到microsoft(在“迄今为止我的Effords”中)部分断开
     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