【发布时间】:2014-12-31 18:59:59
【问题描述】:
在我的应用程序中,我遇到了以下情况:
我有一个带有多个选项卡的选项卡控件的 Windows 窗体。每个选项卡都包含其他类在启动或运行时添加的任意内容。
我想设置选项卡,一旦表单太小,选项卡的面板无法显示所有内容,滚动条就会自动出现。
到目前为止,我尝试的是设置标签页的AutoScroll = true 并将AutoScrollMinSize 属性设置为面板的大小。
这没有按预期工作,因为面板的 Size 似乎总是 (200, 100) 独立于其内容。
我创建了一个小示例应用程序(下面的代码)来演示该问题。如果您调整表单的大小,您会看到只有当表单小于面板(默认大小为 (200, 100))而不是面板中的文本框(大小为 300, 150)时才会出现滚动条。如果您手动设置AutoScrollMinSize(取消注释第 34 行),它的行为与预期一样。
问题是:标签页如何获取其中显示的实际大小?
我可能会递归所有控件并尝试自己计算大小 - 但这感觉真的很糟糕。
PS:请不要建议将面板的大小设置为标签的大小,因为实际的面板比这要复杂得多。 ;-)
代码:
只需在 Visual Studio 中创建一个应用程序并使用以下代码覆盖 Program.cs:
using System;
using System.Windows.Forms;
namespace ScrollbarTest
{
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var sampleForm = CreateSampleForm();
Application.Run(sampleForm);
}
private static Form CreateSampleForm()
{
var sampleForm = new Form() { };
var tabControl = new TabControl() { Dock = DockStyle.Fill };
var tabPage = new TabPage("Test") { AutoScroll = true };
sampleForm.Controls.Add(tabControl);
tabControl.TabPages.Add(tabPage);
var samplePanel = CreateSamplePanel();
tabPage.Controls.Add(samplePanel);
// this does not provide the right size
tabPage.AutoScrollMinSize = samplePanel.Size;
// uncomment this to make it work
//tabPage.AutoScrollMinSize = new System.Drawing.Size(300, 150);
return sampleForm;
}
private static Control CreateSamplePanel()
{
// As an example, create a panel with a text box with a fixed size.
var samplePanel = new Panel() { Dock = DockStyle.Fill };
var sampleSize = new System.Drawing.Size(300, 150);
var textBox = new TextBox()
{
Dock = DockStyle.Fill,
MinimumSize = sampleSize,
MaximumSize = sampleSize,
Size = sampleSize
};
samplePanel.Controls.Add(textBox);
return samplePanel;
}
}
}
【问题讨论】:
-
标签页不知道面板包含。你为什么不在面板上设置滚动条呢。
-
在这种情况下,我会在面板上遇到同样的问题。面板通常由一个 TableLayoutPanel 和几个子面板和几个控件组成。