C# WinForms 面板子定位非常不稳定?
Posted
技术标签:
【中文标题】C# WinForms 面板子定位非常不稳定?【英文标题】:C# WinForms Panel Child Positioning Being Very Wonky? 【发布时间】:2021-03-03 22:26:11 【问题描述】:这就是问题所在。如果您在面板中动态放置控件,它可以正常工作,但仅在出现垂直滚动条之前。一旦有足够的内容发生这种情况,它就会开始无意义地定位控件。
在我的窗口中,您可以单击一个按钮以在面板中添加另一行控件,这些控件代表列表中某个项目的选项。如果您将面板上的垂直滚动条一直向下滚动并再次单击该按钮,则新的控件行将位于面板底部边缘的下方,看不见。如果向下滚动,则新行与前一行控件之间存在巨大差距。这不应该发生。正如调试输出所证明的那样,定位代码运行良好。据我所知,问题在于愚蠢的锚定系统,但是禁用这些控件上的锚定并不能像人们预期的那样解决问题。相反,它只是让它以不同的方式将它们定位错误。这根本没有意义,而且超级烦人!
在将控件添加到面板之前,我尝试在代码中禁用自动滚动。不用找了。所以我修改了该代码以禁用垂直滚动条和自动滚动,并在添加控件之前将滚动条设置为不可见。没有任何变化,除了现在禁用的垂直滚动条在面板中有足够的内容时仍然设法显示可用,尽管它被禁用并设置为不可见!?当我禁用并使其不可见时,这不应该发生!在添加到面板的控件上禁用锚定并且一旦出现垂直滚动条,单击按钮以添加更多几行控件现在会导致它们无缘无故地缩进一点,并且垂直定位彼此重叠!就好像面板中的坐标系以某种方式任意改变了,因为存在垂直滚动条并且在控件上禁用了锚定?调试代码显示控件都被放置在正确的坐标上,但它们的位置似乎非常错误。所以我的代码运行良好,因此这里还有其他问题。
在垂直滚动条出现之前,一切都与预期完全一样。这太奇怪了。有谁知道这些东西到底是怎么回事?显然,让它做一些愚蠢的事情比让它正常工作要容易得多。
【问题讨论】:
所以我的代码运行良好,因此这里存在其他问题。 尝试创建可以向我们展示重现问题的代码。很可能您需要添加滚动位置.. 您将控件放置在与 不可变 ClientRectangle 布局相关的位置(您认为它只会向下扩展,无论如何都保持固定的原点)。您应该考虑当前的DisplayRectangle
,因为这是一个 ScrollableControl,一个 moving,而不是 plain 表面。或者在容器内放置一个锚定的 TableLayoutPanel 并为其添加控件。
【参考方案1】:
再次感谢!我让它工作了。我首先选择了 TaW 的解决方案,因为它似乎是最简单的解决方案。顺便说一句,我前几天在和TaW打架的时候已经尝试过TaW的方法,但是我自然是减去了AutoScrollPosition的值而不是加上它,因为我没想到它是一个负值!
控件定位相对于当前 AutoScrollPosition 似乎很奇怪,因为绝对坐标似乎比使用负数更自然、更直观。我想这会使在当前可见区域中放置控件稍微困难一些,但我认为这没什么大不了的,因为大多数可滚动界面可能会提前初始化,并且无论如何都不需要这样做。
【讨论】:
以上是关于C# WinForms 面板子定位非常不稳定?的主要内容,如果未能解决你的问题,请参考以下文章
winforms - 表单加载期间带有dockstyle填充的用户控件大小不正确