4

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

注意:我的 Windows 窗体设计器当前设置为 LayoutMode = SnapToGrid,对齐网格 = true,网格大小为 5 x 5。

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

这是关闭它之前的样子(在本例中,按钮的位置是 105、175): 表格设置正确

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

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

4

1 回答 1

6

在右侧 SplitPanel 添加一个按钮,并将其锚点设置为底部和左侧。

不,这应该是底部和右侧以获得复制。它是由 SplitterWidth 分配引起的。例如,将其设置为 6 以使按钮移动 2 个像素。

这是由于自动布局计算中不可避免的缺陷造成的,顺序很重要,并且它与 SplitContainer 实现的 ISupportInitialize 接口的交互很差。首先计算面板的布局,但它的大小仍然基于默认的 SplitterWidth。SplitContainer 是下一个,现在它注意到面板太宽并缩小它。哪个,因为按钮已经锚定在右侧,导致按钮移动的量与面板太宽的量相同。

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

许多可能的解决方法,包括不锚定到右侧、不更改默认拆分器宽度和自己计算按钮位置。

于 2013-09-01T14:33:16.953 回答