在我调整 window 大小之前,面板中的控件是隐藏的
Controls in panel are hidden until I resize the window
我一直在使用来自面板的 "cut-off" 控件时遇到问题。但是,当我手动开始调整表单大小时,每次调整大小时,丢失的控件都会重新出现。
我创建了一个测试应用程序来显示此问题。
该应用程序本身在主窗体上添加了一个面板。
在这个面板中,我添加了 10 个组框,每个组框有 100 个标签。
下面是创建测试应用程序和重现问题的步骤(到目前为止,我只在 .NET 4.6.1 和 visual studio 2017 上尝试过)
- 创建一个新的 windows 表单项目
更新默认表单的构造函数如下
public Form1()
{
InitializeComponent();
// My stuff
var panContents = new Panel();
panContents.AutoScroll = true;
panContents.AutoSize = true;
panContents.AutoSizeMode = AutoSizeMode.GrowAndShrink;
panContents.Dock = DockStyle.Fill;
for (int g = 10; g >= 0; g--)
{
var groupBox = new GroupBox();
groupBox.AutoSize = true;
groupBox.AutoSizeMode = AutoSizeMode.GrowOnly;
groupBox.Dock = DockStyle.Top;
groupBox.Text = "Group " + g;
var mainPanel = new Panel();
mainPanel.Dock = DockStyle.Fill;
mainPanel.AutoSize = true;
mainPanel.AutoSizeMode = AutoSizeMode.GrowOnly;
for (int i = 100; i >= 0; i--)
{
var con = new Label();
con.Text = "Label " + i;
con.Height = 100;
con.Dock = DockStyle.Top;
mainPanel.Controls.Add(con);
}
groupBox.Controls.Add(mainPanel);
panContents.Controls.Add(groupBox);
}
this.Controls.Add(panContents);
}
运行 项目(不调整表格大小)
- 滚动到表单底部附近,您会注意到并没有呈现所有 10 个组框
- 手动调整表单大小,您会注意到一些缺失的标签和组框开始出现
- 继续调整表单大小,直到显示所有控件
有人知道为什么会这样吗?我想这可能与面板尺寸的限制有关。但是,如果是这种情况,我不希望调整表单大小以开始显示这些丢失的控件。
PS 我知道我可以通过使用标签或分页来解决这个问题。但是我想知道为什么我会看到我看到的行为(理想情况下我想避免使用标签或分页)
@Yas,
这是一个相当有趣的问题——直到 loading/running 你的代码才完全理解它。我碰巧同意 Jimi 的观点——您可能 运行 面临内部限制,无论这种限制看起来多么奇怪。正如您所指出的,调整表单的 height/width 不应克服限制。因此,无论内部发生什么,都有点奇怪和出乎意料。
但我为您提供了一个解决方案:诚然这是一个难题,但有时这是我们唯一的选择。如果您的项目规范需要一种类似于您提供的形式——一种最终高度值远超过 100,000 的形式,那么此解决方案应该符合要求。
将以下代码添加到 Form1 初始化代码的末尾,显示在您的原始 post 中(见下文)。我所做的是以编程方式 "tweaked" 表单的高度非常轻微——重复——直到所有面板都被完全呈现。我认为这将是您最好的选择。
郑重声明,我在这上面花了很多时间。我曾在各种控件、DoEvents() 等上尝试过 Refresh() 的各种组合,但无济于事。我什至尝试不使用停靠和自动调整大小,而是手动设置顶部和高度(这也不起作用)。因此,我认为除了 Microsoft 的修复之外,下面的代码确实是解决此问题的唯一方法。
** 要使下面的代码正常工作,请在代码的 InitializeComponent() 之后立即添加此行;行:
this.Show();
然后在代码的右大括号后添加此代码:
// fix the panContents panel
long currentMaximum = 0;
while (true)
{
var preserveHeight = this.Height;
// tweak the height
this.Height += 1;
// set it back the height
this.Height = preserveHeight;
// test to see if the scroll bar max remains at its previous value
// if it does, we're done
if (currentMaximum == panContents.VerticalScroll.Maximum)
break;
// otherwise, preserve the current maximum scroll bar position
currentMaximum = panContents.VerticalScroll.Maximum;
// now scroll to the bottom of the panel
panContents.VerticalScroll.Value = panContents.VerticalScroll.Maximum;
// necessary step to ensure scroll bar value is set
panContents.PerformLayout();
}
// scroll to the top
panContents.VerticalScroll.Value = 0;
// necessary step to ensure scroll bar value is set
panContents.PerformLayout();
我一直在使用来自面板的 "cut-off" 控件时遇到问题。但是,当我手动开始调整表单大小时,每次调整大小时,丢失的控件都会重新出现。 我创建了一个测试应用程序来显示此问题。 该应用程序本身在主窗体上添加了一个面板。 在这个面板中,我添加了 10 个组框,每个组框有 100 个标签。 下面是创建测试应用程序和重现问题的步骤(到目前为止,我只在 .NET 4.6.1 和 visual studio 2017 上尝试过)
- 创建一个新的 windows 表单项目
更新默认表单的构造函数如下
public Form1() { InitializeComponent(); // My stuff var panContents = new Panel(); panContents.AutoScroll = true; panContents.AutoSize = true; panContents.AutoSizeMode = AutoSizeMode.GrowAndShrink; panContents.Dock = DockStyle.Fill; for (int g = 10; g >= 0; g--) { var groupBox = new GroupBox(); groupBox.AutoSize = true; groupBox.AutoSizeMode = AutoSizeMode.GrowOnly; groupBox.Dock = DockStyle.Top; groupBox.Text = "Group " + g; var mainPanel = new Panel(); mainPanel.Dock = DockStyle.Fill; mainPanel.AutoSize = true; mainPanel.AutoSizeMode = AutoSizeMode.GrowOnly; for (int i = 100; i >= 0; i--) { var con = new Label(); con.Text = "Label " + i; con.Height = 100; con.Dock = DockStyle.Top; mainPanel.Controls.Add(con); } groupBox.Controls.Add(mainPanel); panContents.Controls.Add(groupBox); } this.Controls.Add(panContents); }
运行 项目(不调整表格大小)
- 滚动到表单底部附近,您会注意到并没有呈现所有 10 个组框
- 手动调整表单大小,您会注意到一些缺失的标签和组框开始出现
- 继续调整表单大小,直到显示所有控件
有人知道为什么会这样吗?我想这可能与面板尺寸的限制有关。但是,如果是这种情况,我不希望调整表单大小以开始显示这些丢失的控件。
PS 我知道我可以通过使用标签或分页来解决这个问题。但是我想知道为什么我会看到我看到的行为(理想情况下我想避免使用标签或分页)
@Yas,
这是一个相当有趣的问题——直到 loading/running 你的代码才完全理解它。我碰巧同意 Jimi 的观点——您可能 运行 面临内部限制,无论这种限制看起来多么奇怪。正如您所指出的,调整表单的 height/width 不应克服限制。因此,无论内部发生什么,都有点奇怪和出乎意料。
但我为您提供了一个解决方案:诚然这是一个难题,但有时这是我们唯一的选择。如果您的项目规范需要一种类似于您提供的形式——一种最终高度值远超过 100,000 的形式,那么此解决方案应该符合要求。
将以下代码添加到 Form1 初始化代码的末尾,显示在您的原始 post 中(见下文)。我所做的是以编程方式 "tweaked" 表单的高度非常轻微——重复——直到所有面板都被完全呈现。我认为这将是您最好的选择。
郑重声明,我在这上面花了很多时间。我曾在各种控件、DoEvents() 等上尝试过 Refresh() 的各种组合,但无济于事。我什至尝试不使用停靠和自动调整大小,而是手动设置顶部和高度(这也不起作用)。因此,我认为除了 Microsoft 的修复之外,下面的代码确实是解决此问题的唯一方法。
** 要使下面的代码正常工作,请在代码的 InitializeComponent() 之后立即添加此行;行:
this.Show();
然后在代码的右大括号后添加此代码:
// fix the panContents panel
long currentMaximum = 0;
while (true)
{
var preserveHeight = this.Height;
// tweak the height
this.Height += 1;
// set it back the height
this.Height = preserveHeight;
// test to see if the scroll bar max remains at its previous value
// if it does, we're done
if (currentMaximum == panContents.VerticalScroll.Maximum)
break;
// otherwise, preserve the current maximum scroll bar position
currentMaximum = panContents.VerticalScroll.Maximum;
// now scroll to the bottom of the panel
panContents.VerticalScroll.Value = panContents.VerticalScroll.Maximum;
// necessary step to ensure scroll bar value is set
panContents.PerformLayout();
}
// scroll to the top
panContents.VerticalScroll.Value = 0;
// necessary step to ensure scroll bar value is set
panContents.PerformLayout();