为什么WinForms设计器中的控件会自行调整大小?

时间:2013-08-30 23:42:02

标签: c# winforms designer windows-forms-designer

在我正在编写的Windows窗体应用程序的主窗体上,我有一个带有左右面板的SplitContainer。右侧面板中的锚点设置为右侧(或左侧和右侧)的控件不会留在我将它们放入设计器的位置。控件会定期向左移动一个像素(在设计器中,而不是在运行时)。对于左右两侧锚定的控件,控件将缩小,但对于刚刚固定的控件,整个控件向左移动,同时保持相同的大小。有谁知道为什么会发生这种情况或如何避免它?现在,我唯一能做的就是定期将它们移回去。

注意:我的Windows窗体设计器当前设置为LayoutMode = SnapToGrid,Snap to Grid = true,网格大小为5 x 5.

编辑:我终于找到了在Visual Studio 2012中重现此问题的方法。使用我正在使用的相同设计器设置创建一个新的Windows窗体项目,并在表单中添加一个SplitContainer。将其停靠以填充(或使用锚点到所有侧面)。现在,将SplitterDistance设置为100,将SplitterWidth设置为5.向右侧SplitPanel添加一个按钮,并将其锚点设置为Bottom and Right。移动按钮使其右边缘与SplitPanel侧面齐平,然后关闭并打开表格。奇迹般地,按钮向左移动了一个像素。

这是关闭它之前的样子(在这种情况下按钮的位置是105,175): The form set up correctly

关闭并重新打开它之后的样子(现在按钮的位置是104,175): The form after being closed and reopened

我希望这个例子可以帮助任何人重现这个问题。

1 个答案:

答案 0 :(得分:6)

  

向右侧SplitPanel添加一个按钮,并将其锚点设置为Bottom and Left。

不,那应该是Bottom和 Right 来获得这个的repro。它是由SplitterWidth分配引起的。例如,将其设置为6可使按钮移动2个像素。

这是由自动布局计算中不可避免的缺陷引起的, order 非常重要,并且它与ISupportInitialize接口交互不良,如SplitContainer所实现的。首先计算面板的布局,但它仍然具有基于默认SplitterWidth的大小。接下来是SplitContainer,现在它注意到面板太宽并且缩小了它。其中,因为按钮已经固定在右侧,导致按钮的移动量与面板太宽相同。

这种布局计算顺序依赖关系是常见的,并且在设计方式上是固有的。对于继承的表单类特别有问题,其中派生表单具有与基本表单类不同的大小。位置取决于该大小的控件(锚定在底部或右侧)将最终处于错误的位置。

许多可能的解决方法,包括不固定到右边,不改变默认的分割器宽度和自己计算按钮位置。