在我的應用程序中,我遇到了以下情況:可滾動區域如何檢索顯示內容的大小?
我有一個帶有多個選項卡的選項卡控件的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和幾個帶有幾個控件的子面板組成。 –