在我的应用程序中,我遇到了以下情况:可滚动区域如何检索显示内容的大小?
我有一个带有多个选项卡的选项卡控件的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和几个带有几个控件的子面板组成。 –