SplitContainer面板调整大小问题

时间:2013-08-06 11:31:07

标签: c# winforms splitcontainer

一般问题

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

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

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


我的控件层次结构

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

    • 拆分容器(锚点:顶部,左侧,底部,右侧)
      • SC Panel1(最小宽度:300)
        • TreeViewControl(忘记它叫什么)
      • SC Panel2
        • 面板(锚点:顶部,左侧,底部,右侧)
          • Tab Control(锚点:顶部,左侧,底部,右侧)
            • 选项卡控制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及其后的孩子没有调整大小。

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


我的努力到目前为止

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


我在寻找什么

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

4 个答案:

答案 0 :(得分:0)

从我看到的情况来看,对于创建问题的控件(包括splitcontainer pannels),应该将anchor设置为none。

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

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

答案 1 :(得分:0)

尽管这个问题大约有6岁,但我选择回答这个问题是因为我处于与空缺职位相同的情况。不幸的是,没有指定方向。因此,我的答案将解决水平方向的问题。

由于此代码在VB中,请转换为C#。

 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 :(得分:-1)

因此,在每个Change事件上,您都在创建一个新线程,该线程将等待100毫秒,然后执行记录?多数民众赞成在愚蠢。您可以在构造函数中创建一个线程,然后在该线程上调用Start(),该线程可能具有以下内容:

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

答案 3 :(得分:-3)

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

  1. 面板中的Surround splitContainer" tableBorder"
  2. on tableBorder

    Dock = DockStyle.Fill;
    

    在拆分容器上,(无锚定)

    Dock = DockStyle.None;
    
    1. 在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;
      }
      
    2. 有一个小的滞后,但有效