C# 自动调整包含TabControl的表单大小

C# 自动调整包含TabControl的表单大小,c#,winforms,tabcontrol,C#,Winforms,Tabcontrol,我有一个Windows窗体和一堆控件,它工作得很好。所有控件都包含在TableLayoutPanel中,该面板根据控件的基本大小自动调整大小,窗体根据面板自动调整大小,因此我不必担心不同平台和计算机中的大小,因为所有控件都应根据当前配置的设置调整大小 例如,这里有一个简单的例子,它看起来是怎样的。 有关守则如下: //...code defining all the other Commands and .Add()'ing them to the Panel form.Controls.Add

我有一个Windows窗体和一堆控件,它工作得很好。所有控件都包含在TableLayoutPanel中,该面板根据控件的基本大小自动调整大小,窗体根据面板自动调整大小,因此我不必担心不同平台和计算机中的大小,因为所有控件都应根据当前配置的设置调整大小

例如,这里有一个简单的例子,它看起来是怎样的。 有关守则如下:

//...code defining all the other Commands and .Add()'ing them to the Panel
form.Controls.Add(Panel);
form.AutoSize = true;
form.FormBorderStyle = FormBorderStyle.FixedDialog;
form.ShowDialog();
我现在想要得到整个面板,并将其放置在TabControl中,这样它就只是众多选项卡中的一个选项卡。我是这样做的:

//...code defining all the other Commands and .Add()'ing them to the Panel
TabControl tabControl = new TabControl();
tabControl.Dock = DockStyle.Fill;
TabPage tabPage = new TabPage("C1");
tabPage.Controls.Add(Panel);
tabControl.TabPages.Add(tabPage);
form.Controls.Add(tabControl);
form.AutoSize = true;
form.FormBorderStyle = FormBorderStyle.FixedDialog;
form.ShowDialog();
因此,基本上,我没有将面板添加到表单中,而是将其添加到TabPage中,TabPage被添加到TabControl中,TabControl被添加到表单中。然而,这导致:

文档中指出,TabControl和TabPage的AutoSize属性仅仅是一个与之无关的基础结构。我发现的大多数解决方案都建议使用.Dock=DockStyles.Fill,这有助于TabControl现在填充表单,如上图所示,而不是只占据表单的一小部分。然而,形式本身保持不变

我曾想过使用面板的大小,并使TabControl的大小等于或是其函数,但我注意到,大小参数显然只在绘制面板时改变,因为添加控件根本不会改变它,所以我必须等待面板绘制,然后再调整其大小,这听起来很马虎。有更好的解决办法吗

更新 使用锚定和设置

Panel.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top;
tabControl.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top;
简单地说就是:


与其设置尺寸,为什么不利用?如果将面板锚定到TabPage/TabControl的顶部|左|右|底部,则TabControl将以同样的方式固定到表单上,这只是您需要担心的表单大小。它将指定锚定到它的所有其他项目的大小。

与其设置大小,为什么不利用它呢?如果将面板锚定到TabPage/TabControl的顶部|左|右|底部,则TabControl将以同样的方式固定到表单上,这只是您需要担心的表单大小。它将指定锚定到它的所有其他项目的大小。

在面板的设计器中使用.AutoScaleMode=None作为用户控件。 在我的例子中,TabControl TabPage myPage可以工作。

在面板的设计器中使用.AutoScaleMode=None作为用户控件。
在我的例子中,TabControl TabPage myPage它可以工作。

那么,面板在默认情况下不是锚定到它的宿主对象吗?默认值为.Anchor=Top | Left,我没有修改它。同样,我的想法正好相反,让表单的内容通过.Autosize来决定自己的大小,然后表单自动调整其内容大小。我不想担心不同显示器或不同版本的Windows上可能出现的字体大小的不同,也不想担心整个表单的大小。默认情况下,所有内容都定位在左上方。我的建议是,我将编辑答案,以便更好地表达。我的建议是,你锚定顶部|左侧|右侧|底部。将它们全部锁定到表单的大小,然后只需根据表单的内容设置表单的大小。谢谢,但奇怪的是,这实际上让事情变得更糟。添加:Panel.Anchor=AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top;tabControl.Anchor=AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top;刚刚让TabControl表现得好像。Dock!=填好了,现在连表格都填不上了。很遗憾,显然没有办法让TabControl像一个带面板的简单表单那样运行良好,我不必担心任何东西的大小。那么,默认情况下,面板不是锚定在它的宿主对象上吗?默认值为.Anchor=Top | Left,我没有修改它。同样,我的想法正好相反,让表单的内容通过.Autosize来决定自己的大小,然后表单自动调整其内容大小。我不想担心不同显示器或不同版本的Windows上可能出现的字体大小的不同,也不想担心整个表单的大小。默认情况下,所有内容都定位在左上方。我的建议是,我将编辑答案,以便更好地表达。我的建议是,你锚定顶部|左侧|右侧|底部。将它们全部锁定到表单的大小,然后只需根据表单的内容设置表单的大小。谢谢,但奇怪的是,这实际上让事情变得更糟。添加:Panel.Anchor=AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top;tabControl.Anchor=AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top;刚刚让TabControl表现得好像。Dock!=填好了,现在连表格都填不上了。显然,没有一种方法可以让TabControl像一个带面板的简单表单那样表现得那么好,而我不必担心任何东西的大小,这真是一件令人沮丧的事
nrelated comment:您的GUI似乎是某种平面图或图表设计器应用程序。我强烈建议您为此使用当前相关的UI技术,而不要使用winforms。是一个在WPF+MVVM中做的类似事情的例子,支持动画、鼠标拖动、动画和其他非常有趣的视觉和交互功能。更不用说这里的问题了,winforms缺乏分辨率独立性在新技术中绝对不存在。是的,我查看了该链接并。。。看起来很酷。谢谢你让我用剩下的时间学习WPF。而且我可以看出,您对WPF非常感兴趣。无关评论:您的GUI似乎是某种计划绘图或图表设计器应用程序。我强烈建议您为此使用当前相关的UI技术,而不要使用winforms。是一个在WPF+MVVM中做的类似事情的例子,支持动画、鼠标拖动、动画和其他非常有趣的视觉和交互功能。更不用说这里的问题了,winforms缺乏分辨率独立性在新技术中绝对不存在。是的,我查看了该链接并。。。看起来很酷。谢谢你让我用剩下的时间学习WPF。而且我敢说,你对WPF非常感兴趣。