Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么WinForms designer中的控件会自行调整大小?_C#_Winforms_Designer_Windows Forms Designer - Fatal编程技术网

C# 为什么WinForms designer中的控件会自行调整大小?

C# 为什么WinForms designer中的控件会自行调整大小?,c#,winforms,designer,windows-forms-designer,C#,Winforms,Designer,Windows Forms Designer,在我正在编写的Windows窗体应用程序的主窗体上,我有一个带有左右面板的SplitContainer。右面板中锚定设置为右(或右和左)的控件不会停留在我在设计器中放置它们的位置。控件将定期向左移动一个像素(在设计器中,而不是在运行时)。对于同时锚定在左侧和右侧的控件,控件将收缩,但对于仅锚定在右侧的控件,整个控件将向左移动,同时保持相同的大小。有人知道为什么会发生这种情况或如何避免吗?现在,我唯一能做的就是定期把它们移回去 注意:我的Windows窗体设计器当前设置为LayoutMode=Sn

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

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

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

以下是关闭按钮之前的外观(在本例中,按钮的位置是105175):

以下是关闭并重新打开后的外观(现在按钮的位置是104175):

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

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

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

这是由自动布局计算中不可避免的缺陷造成的,订单非常重要,并且它与由SplitContainer实现的ISupportInitialize接口的交互很差。首先计算面板的布局,但其大小仍然基于默认的SplitterWidth。接下来是SplitContainer,现在它注意到面板太宽并将其收缩。这是因为按钮已定位到右侧,导致按钮移动的幅度与面板过宽的幅度相同

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


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

我现在找到了一种方法让您重现问题,并相应地更新了问题。希望这能让我走出“程序员不会记录他们的问题”的领域。好吧,这很尴尬,我输入了最重要的步骤(现在已经解决了)。不管怎样,这很有道理,谢谢。我认为我将使用它的解决方案只是将拆分器宽度保留为默认值(如果我真的需要,我可以在以后的代码中更改它,我只是将它设置为5,因为我认为如果它与我的应用程序的其余部分具有相同的间距会更好,其中所有控件的间距为5像素)。