aho*_*101 3 c# designer windows-forms-designer winforms
在我正在编写的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):

这是你关闭并重新打开后的样子(现在按钮的位置是104,175):

我希望这个例子可以帮助任何人重现这个问题.
向右侧SplitPanel添加一个按钮,并将其锚点设置为Bottom and Left.
不,这应该是从底部和右边得到一个repro为此.它是由SplitterWidth分配引起的.例如,将其设置为6可使按钮移动2个像素.
这是由自动布局计算中不可避免的缺陷引起的,顺序很重要,并且它与ISupportInitialize接口的交互很差,如SplitContainer所实现的.首先计算面板的布局,但它仍然具有基于默认SplitterWidth的大小.接下来是SplitContainer,现在它注意到面板太宽并且缩小了它.其中,因为按钮已经固定在右侧,导致按钮的移动量与面板过宽的量相同.
这种布局计算顺序依赖性是常见的,并且在设计方式上是固有的.对于继承的表单类特别有问题,其中派生表单具有与基本表单类不同的大小.位置取决于该大小的控件(锚定在底部或右侧)将最终位于错误的位置.
许多可能的解决方法,包括不锚定到右边,不改变默认的分割器宽度和自己计算按钮位置.