9

一般问题

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

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

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


我的控制层次结构

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

  • 形式
    • 拆分容器(锚点:上、左、下、右)
      • SC Panel1(最小宽度: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随后其子代没有。

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


我迄今为止的努力

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


我在寻找什么

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

4 回答 4

1

虽然这个问题大约有 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
于 2019-03-20T10:31:28.533 回答
0

从我所看到的情况来看,对于产生问题的控件(包括拆分容器面板),您应该将 anchor 设置为 none。

另外我建议使用停靠填充属性来最好地使用拆分容器。

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

于 2014-11-28T07:15:30.137 回答
-1

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

private void resizeMe() 
{
    this.BeginInvoke((Action)() => {
        splitContainer.Height = tableBorder.Height;
        splitContainer.Width = tableBorder.Width;
    }
}
于 2019-01-19T19:21:11.757 回答
-2

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

  1. 在面板“tableBorder”中环绕 splitContainer

在桌边

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;
    }
    

有一个小的滞后,但工作

于 2015-09-23T17:31:09.387 回答