C# 如何强制以超类形式放置控件?

C# 如何强制以超类形式放置控件?,c#,winforms,visual-studio,user-controls,C#,Winforms,Visual Studio,User Controls,要快速总结问题,请查看底部的图片 你好, 我创建了一个表单(名为BaseForm),作为我所有窗口的基础。 这个基本表单(为了简单起见)在底部包含类似“statusbar”(用户控件)的内容 该状态栏已锁定,因此无法在设计器中移动或调整其大小。 它还将其锚定设置为左、下、右,因此它始终保持在底部并水平调整大小 现在,当创建另一个表单并进行更改以使其继承MyProject.BaseForm而不是System.Windows.Forms.Form时,状态栏就在那里 但现在状态栏的位置和大小出现了问题

要快速总结问题,请查看底部的图片

你好,

我创建了一个
表单
(名为BaseForm),作为我所有窗口的基础。 这个基本表单(为了简单起见)在底部包含类似“statusbar”(用户控件)的内容

该状态栏已锁定,因此无法在设计器中移动或调整其大小。 它还将其锚定设置为左、下、右,因此它始终保持在底部并水平调整大小

现在,当创建另一个
表单
并进行更改以使其继承MyProject.BaseForm而不是System.Windows.Forms.Form时,状态栏就在那里

但现在状态栏的位置和大小出现了问题。 statusbars的标准位置和大小错误。VisualStudio从基表单获取位置和大小,而不是应用锚定

此外,我无法(也不想!)移动/调整状态栏的大小以解决问题

一个明显有效的解决方案是将statusbars Dock属性设置为Bottom。 但我不能用它来解决我的问题,因为我也有不应该停靠的控件。(例如,应始终位于窗体右下角的按钮)


我认为最好的方法是使用
表格布局面板,而不是显式停靠。在父窗体中创建一个2行
TableLayoutPanel
。使最下面的一行
自动调整大小
,并将状态栏放入其中。通过这种方式,派生表单可以在表示控件其余部分的另一行中自由添加内容

您有一个简单的问题,控件是私有的,因此不能在派生形式中处理。其所有属性(包括位置和大小)都不可访问。在派生形式的错误位置将其冻结。布局引擎也无法移动它。以及为什么会显示锁定图标


返回BaseForm,选择用户控件并将Modifiers属性从Private更改为Protected。重建。现在,您可以将其移动到需要移动的派生窗体上。

这是个好主意,但即使将
TableLayoutPanel
s修改器设置为“public”,在Form2中也不能将控件放入其中。@Felheart为什么不?我已经有好几年没有做过繁重的WinForms工作了,但我记得我是以这种方式设计控件的,当试图将控件拖动到继承的TableLayoutPanel中时,总是会出现“不允许”光标。即使继承的控件已锁定=false且修饰符=public。这似乎只适用于面板,并且只有当它们被标记为“公共”(我也尽量避免)时@Felheart为什么不在
TableLayoutPanel
顶行中添加一个面板,然后将特定的面板也公开呢?@Felheart注意到,您试图实现的目标并不总是可能的。WinForms设计器面向非继承控件。一旦引入了继承,就很难获得想要的体验。我花了很多时间试图解决这个问题(最终我才熟练地编写表单)。是的,这是真的,但我有许多表单继承自BaseForm,所以我的想法是,我不必每次都手动更正控件的位置(实际上是多个控件)。我真的想把它们锁上。我通过小心地使用TableLayoutPanels解决了这个问题。