【问题标题】:C# Anchor property doesn't seem to workC# Anchor 属性似乎不起作用
【发布时间】:2010-12-08 16:10:58
【问题描述】:

我在我的表单中添加了一些控件并更改了 Anchor 属性,我希望它如何工作,但是当我在运行时调整表单大小时,这些控件保持在同一个地方。

例如,我在表单的右下角有两个按钮 - 它们在表单上,​​没有容器或类似的东西。锚点 = 底部,右侧。 FormBorderStyle = 相当大。但是当我在运行时拖动调整窗体大小时,按钮不会移动。

我错过了什么吗?

c# 2005

【问题讨论】:

  • 过去它一直对我有用,所以我猜你做错了什么。您能否发布一个代码示例(签入 Designer.cs 文件) - 或可能演示该问题的屏幕截图。
  • 添加一个新表单,添加一个按钮,并将Anchor设置为Bottom, Right。如果这确实有效,则意味着以您的原始形式完成事情的方式存在问题 - 请参阅其他人的答案以找出答案。如果新表格不起作用,我不知道出了什么问题......

标签: c# winforms forms anchor formborderstyle


【解决方案1】:

另一种可能性是您不小心将按钮未直接放在表单上。相反,您将它们放在某个容器中(例如面板、tableLayoutPanel 等),而该容器没有正确设置其锚定或停靠值。

绝对确定您应该查看 Designer.cs 并检查您的按钮是通过 this.Controls.Add() 函数直接添加到表单中,还是添加到任何其他控件列表中(例如 panel.Controls.Add() )。

【讨论】:

  • 如果您想要对表单上的所有控件进行分层概览,只需打开“文档大纲”面板。在设计模式下,转到查看 -> 其他窗口 -> 文档大纲
  • 刚刚学到了一些新东西......我不知道“文档大纲”,但我提供了一个很好的层次结构概述,还支持拖放!
  • 我才刚刚开始弄清楚发生了什么以及如何解决它,但 FlowLayoutPanels 似乎真的搞砸了锚定行为。这里有一些信息,不确定它的最新情况docs.microsoft.com/en-us/dotnet/framework/winforms/controls/…
  • @Toadfish:我觉得这篇文章不错。如果您在理解停靠和锚定方面遇到问题,则不应开始在 FlowLayoutPanel 中使用它。如果您有具体问题或不符合您期望的示例,请发布一个新问题并告诉我。
【解决方案2】:

我知道这是一篇旧帖子,但我还是想尝试贡献一下。

我的问题是,当父面板的大小发生变化时,我添加到面板中的表单没有自动调整其大小。

问题是我正在这样做:

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;,一切都像魅力一样。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      Dock 属性设置为什么?这可以否定锚属性。

      【讨论】:

      • 是的,如果您不设置锚属性但设置停靠属性,则调整大小时菜单不会移动
      【解决方案5】:

      我在 VS11 Beta 中遇到了同样的问题。我使用了很多次锚点,它总是能正常工作,但现在我无法理解它们发生了什么,而且不仅 - 码头填充也不起作用! (不使用自动大小或停靠属性)

      附: (40分钟后) 现在看起来我发现了问题:我为 PictureBox 设置了 Resize 事件侦听器,并在 onResize 处理程序中为新的图片框大小创建了新图像。当我删除新图像创建时,一切正常!

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

      【讨论】:

        【解决方案6】:

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

        情况:

        TableLayoutPanel 一行设置为autosize。在这一行中,锚定右下角不起作用。 按照 user428955 的规定,删除 autoSize 并将其置于固定高度即可解决问题。

        【讨论】:

          【解决方案7】:

          我的问题很简单,
          我的所有控件锚属性都已正确设置并包含在面板中。
          但我忘记为容器面板设置锚样式,因此容器面板没有根据我想要的表单边框...在设置容器面板的锚属性后,一切都按预期工作。

          【讨论】:

            【解决方案8】:

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

            【讨论】:

              【解决方案9】:

              我也有类似的问题。我发现这是因为我在 form_load 上调整了我的表单大小。这可以通过在调整表单大小时临时停靠到顶部/左侧来绕过

                  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;
                  }
              

              【讨论】:

                猜你喜欢
                • 2011-06-08
                • 2010-10-08
                • 1970-01-01
                • 2010-11-16
                • 2013-07-31
                • 1970-01-01
                • 2015-10-05
                • 2014-02-24
                • 2021-09-12
                相关资源
                最近更新 更多