C#的锚定属性似乎无法正常工作

9
我在表单中添加了一些控件并更改了锚定属性,但是当我在运行时调整表单大小时,这些控件仍然停留在原地。
例如,我在表单的右下角有两个按钮 - 它们在表单上,没有容器或其他任何东西。Anchor = Bottom, Right. FormBorderStyle = Sizable。但是当我在运行时拖动调整表单大小时,按钮不会移动。
我是否漏掉了什么?
c# 2005

它过去一直对我有效,所以我猜想你可能做错了什么。你能否发布一个代码示例(检查designer.cs文件)-或者可能是一个屏幕截图来演示这个问题。 - Simon P Stevens
添加一个新表单,添加一个按钮,并将“Anchor”设置为“Bottom, Right”。如果这实际上起作用了,那么这意味着您原始表单的操作方式存在问题 - 请参考其他人的答案来找出解决方法。如果新表单不起作用,我就不知道出了什么问题... - awe
10个回答

12

另一个可能性是您意外地将按钮放置在表单之外。相反,您将它们放在某个容器中(例如panel、tableLayoutPanel等),而该容器没有正确设置其锚定或停靠值。

为了绝对确定,请查看designer.cs并检查您的按钮是否通过this.Controls.Add()函数直接添加到表单中,或者它们是否添加到任何其他Controls-List中(例如panel.Controls.Add())。


15
如果您想要一个层次结构概述您表单上的所有控件,只需打开“文档大纲”面板。 在设计模式下,转到“视图”->“其他窗口”->“文档大纲”。 - Mez
1
刚刚学到了新东西...我不知道“文档大纲”,但它提供了很好的层次概述,并支持拖放! - Oliver
我才刚开始弄清楚发生了什么以及如何解决,但是FlowLayoutPanels似乎会真正破坏锚定行为。这里有一些信息可供参考,不确定它的时效性 https://learn.microsoft.com/en-us/dotnet/framework/winforms/controls/how-to-anchor-and-dock-child-controls-in-a-flowlayoutpanel-control - Toadfish
@Toadfish:文章看起来不错。如果您在理解停靠和锚定方面有问题,那么您不应该在FlowLayoutPanel中开始使用它。如果您有具体的问题或示例未达到您的期望,请发布一个新问题并让我知道。 - Oliver

6

我知道这是一篇老帖子,但我还是想尝试做出贡献。

我的问题在于,当父面板的大小改变时,我添加到面板中的表单并没有自动调整其大小。

问题在于我这样做:

form.WindowState = FormWindowState.Maximized; // <-- source of the problem
form.AutoSize = true; //this causes the form to grow only. Don't set it if you want to resize automatically using AnchorStyles, as I did below.
form.FormBorderStyle = FormBorderStyle.Sizable; //I think this is not necessary to solve the problem, but I have left it there just in case :-)
panel1.Controls.Add(form);
form.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
                    | System.Windows.Forms.AnchorStyles.Left)
                    | System.Windows.Forms.AnchorStyles.Right)));
form.Dock = DockStyle.Fill; //this provides the initial size adjust to parent' size.
form.Visible = true;

为了解决这个问题,我只需注释掉第一行代码://form.WindowState = FormWindowState.Maximized; 然后一切都可以完美工作了。

5

如果您设置了自动大小属性,也会造成麻烦。


3
Dock属性设置为什么?这可能会使锚点属性失效。

是的,如果您没有设置锚定属性但设置了停靠属性,则菜单在调整大小时不会移动。 - Commonaught

1

我在VS11 Beta中遇到了同样的问题。我经常使用锚点,它们总是正常工作,但现在我无法理解它们发生了什么事情,而且不仅如此-填充停止工作了!(没有使用自动大小或停靠属性)

P.S.(40分钟后) 现在看起来我已经找到了问题:我为PictureBox创建了Resize事件监听器,并在onResize处理程序中为新的picturebox大小创建新图像。当我删除新图像创建时,一切都正常工作!

现在我使用SizeChanged事件,在此事件处理程序中创建新图像。因此,我认为在调整大小完成之前不应更改发送方对象。


0
如果您的表单是可本地化的,请检查是否在其他语言上进行了任何锚定/停靠更改。

0

我的问题非常简单,
所有控件的锚定属性都设置正确并包含在一个面板中。
但我忘记了将容器面板的锚定样式设置为所需的形式边框大小,因此容器面板没有按照我想要的方式扩展...在设置容器面板的锚定属性后,一切都按预期工作。


0

我也遇到了这个问题。顺便提一下,检查一下所有子窗体控件是否设置为自动调整大小。


0

我遇到了完全相同的问题。

情况:

TableLayoutPanel 中有一行设置为 autosize。在这一行中,右对齐和底部对齐的锚定没有起作用。 取消 autoSize 并将其设置为固定高度解决了问题,正如 user428955 所建议的那样。


0

我也遇到了类似的问题。我发现这是因为我在窗体加载时调整了窗体大小。可以通过在调整窗体大小时临时停靠到顶部/左侧来绕过此问题。

    private void ResizeFromDesigntimeToRunTime()
    {
        var volatileControls = this.Controls.Cast<Control>().Where(control => (control.Anchor | AnchorStyles.Bottom | AnchorStyles.Right) != AnchorStyles.None).ToList();

        var anchorPairing = volatileControls.ToDictionary(control => control, control => control.Anchor);

        foreach (var control in volatileControls)
            control.Anchor = AnchorStyles.Left | AnchorStyles.Top; //Temporarily reset all controls with an anchor including right or bottom, so that these aren't automatically resized when we adjust form dimensions.

        this.Height = SomeHeight;
        this.Width = SomeWidth;

        foreach (var pair in anchorPairing)
            pair.Key.Anchor = pair.Value;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接