C# WinForms 面板子定位非常不稳定?

C# WinForms Panel Child Positioning Being Very Wonky?

问题来了。如果您在面板中动态放置控件,它可以正常工作,但只能在垂直滚动条出现之前。一旦有足够的内容发生这种情况,它就会开始毫无意义地定位控件。

在我的 window 中,您可以单击一个按钮在面板内添加另一行控件,这些控件代表列表中项目的选项。如果将面板上的垂直滚动条一直向下滚动并再次单击该按钮,则新的控件行将位于面板底部边缘下方,看不见。如果向下滚动,新行和上一行控件之间会有巨大的差距。这不应该发生。定位代码运行完美,调试输出证明了这一点。据我所知,问题出在愚蠢的锚定系统上,但是禁用这些控件上的锚定并不能像人们预期的那样解决问题。相反,它只是使它们以不同的方式定位错误。这根本没有意义,而且超级烦人!

我尝试在将控件添加到面板之前在代码中禁用自动滚动。没变化。所以我修改了该代码以禁用垂直滚动条和自动滚动,并在添加控件之前将滚动条设置为不可见。再次没有变化,除了现在禁用的垂直滚动条在面板中有足够的内容时仍然设法显示可用,尽管它被禁用并设置为不可见!?当我禁用并使其不可见时,这不应该发生!在添加到面板的控件上禁用锚定并且出现垂直滚动条后,单击按钮添加更多行控件现在会导致它们无缘无故地缩进一点并且彼此垂直重叠!就好像面板中的坐标系以某种方式任意改变,因为控件上存在垂直滚动条和锚定被禁用?调试代码显示控件都被放置在正确的坐标上,但它们的位置看起来非常错误。所以我的代码运行良好,因此这里有其他问题。

在出现垂直滚动条之前,一切都完全符合预期。这太奇怪了。有谁知道这些东西到底是怎么回事?显然让它做蠢事比让它正常工作要容易得多。

再次感谢!我让它工作了。我首先选择了 TaW 的解决方案,因为它看起来是最简单的解决方案。顺带一提,我前几天在和TaW打架的时候已经尝试过TaW的做法,但是我自然而然地减去了AutoScrollPosition的值而不是加上它,因为我没想到它是一个负值!

控件定位相对于当前的 AutoScrollPosition 似乎很奇怪,因为绝对坐标似乎比负数更自然、更直观。我想这会使在当前可见区域中放置控件变得稍微困难​​一些,但我认为这没什么大不了的,因为大多数可滚动界面可能会提前初始化并且无论如何都不需要这样做。