【问题标题】:Why are Anchor properties not being honored within dynamically created nested components?为什么在动态创建的嵌套组件中不支持 Anchor 属性?
【发布时间】:2013-12-30 10:59:04
【问题描述】:

首先我要说我没有做过很多 Windows 窗体开发——如果我可能犯了明显的错误,请不要犹豫,指出它。

重现我的问题的步骤:

  • 使用 VS 2010 或 VS 2012 创建新的 C# Windows 窗体项目
  • 使用 VS 表单设计器,将三个 FlowLayoutPanel 组件添加到表单中
  • 将每个 FlowLayoutPanel 设置为与表单高度相同,宽度约为表单宽度的 1/3
  • 调整每个 FlowLayoutPanel 的位置,使它们不会在水平方向上相互重叠,并共同占用表单的大约整个区域。

  • 最左边的 FlowLayoutPanel 被配置为具有 Top、Bottom、Left 的 Anchor

  • 中间的 FlowLayoutPanel 被配置为具有 Top, Bottom 的 Anchor
  • 最右边的 FlowLayoutPanel 配置为具有 Top、Bottom、Right 的 Anchor

为 Form_Shown 添加一个事件:

private void Form1_Shown(object sender, EventArgs e)
{
  Panel p = new Panel();
  p.BorderStyle = BorderStyle.FixedSingle;
  p.Width = 200;
  p.Height = 100;

  Label label1 = new Label();
  label1.BorderStyle = BorderStyle.FixedSingle;
  label1.Text = "Hello";
  label1.Anchor = AnchorStyles.Top;

  Label label2 = new Label();
  label2.BorderStyle = BorderStyle.FixedSingle;
  label2.Text = "World!";
  label2.Anchor = AnchorStyles.Bottom;

  p.Controls.Add(label1);
  p.Controls.Add(label2);

  middleFlow.Controls.Add(p); // add to the center most FlowLayoutPanel on Form1
}

结果似乎是 label1 被放置在 label2 之上,尽管 label2 被添加到第二个。此外,锚值似乎被忽略了(因为当我打算将它们分别锚定到 Panel 组件的顶部和底部时,label1 覆盖了 label2)

如果我使用 Dock 属性而不是 Anchor 属性,则行为符合预期。为什么 Anchor 属性在这种情况下不起作用?

另外,有没有办法将组件锚定到其他组件?我注意到,当我在运行时增加表单的大小时,面板之间会出现水平“间隙”。理想情况下,我希望面板一起增长,防止它们之间的任何水平间隙/空白?

提前感谢您的任何建议或提示。

【问题讨论】:

    标签: c# winforms user-interface


    【解决方案1】:

    我仍在开始学习 c# 和 winforms,因此以下内容可能不是最佳的,但它可以满足您的要求。

    使用 Dock=Top 处理标签。请注意,标签被切换,以便 label1 在 label2 的顶部,即最后注册 label1 会下推已经注册的 label2。

    三个面板的定位是在没有锚点的情况下完成的,并且使用事件处理程序来调整大小。之后设置表单的大小会引发调整大小事件。着色以查看组件。

    using System;
    using System.Drawing;
    using System.Windows.Forms;
    
    
    public class ThreePanel : Form {
    
      FlowLayoutPanel  leftFlow;
      FlowLayoutPanel  middleFlow;
      FlowLayoutPanel  rightFlow;
    
      public ThreePanel(){
    
    
        leftFlow = new FlowLayoutPanel() {
          BackColor = Color.Yellow
        };
    
        middleFlow = new FlowLayoutPanel() {
          BackColor = Color.LightGreen
        };
    
        rightFlow = new FlowLayoutPanel() {
          BackColor = Color.LightBlue
        };
    
        this.Controls.Add(rightFlow);
        this.Controls.Add(middleFlow);
        this.Controls.Add(leftFlow);
    
        this.Load += (s,e)=>Form1_Shown(s,e);
        this.Resize += (s,e)=>{ 
          int w=this.Width/3; 
          leftFlow.Width=middleFlow.Width
              =rightFlow.Width=w;
          leftFlow.Height=middleFlow.Height
              =rightFlow.Height=this.Height;
          leftFlow.Location=new Point(0,0);
          middleFlow.Location=new Point(w,0);
          rightFlow.Location=new Point(2*w,0);
        };
    
        this.Size = new Size(750,450);
    
      }
    
      private void Form1_Shown(object sender, EventArgs e)
      {
        Panel p = new Panel() {
          BorderStyle = BorderStyle.FixedSingle,
          Width = 200,
          Height = 100,
          BackColor = Color.Fuchsia,
        };
    
        Label label1 = new Label() {
          BorderStyle = BorderStyle.FixedSingle,
          Text = "Hello",
          Dock = DockStyle.Top
        };
    
        Label label2 = new Label() {
          BorderStyle = BorderStyle.FixedSingle,
          Text = "World!",
          Dock = DockStyle.Top
        };
    
        p.Controls.Add(label2);
        p.Controls.Add(label1);
    
        // add to the center most FlowLayoutPanel on Form1
        middleFlow.Controls.Add(p); 
      }
    
      public static void Main()
      {
        Application.Run(new ThreePanel());
      }
    }
    

    【讨论】:

      【解决方案2】:

      我希望你提到的行为完全正确。

      Anchor 属性只告诉父容器标签应该被粘贴 给父母。在您的情况下,AnchorStyles.Top 意味着将标签粘贴到顶部并在父级移动或调整大小时将其留在那里。

      您没有为标签指定尺寸或位置,因此两者都重叠。 控件的 z 顺序是从添加到 middleFlow.Controls 时的顺序隐式创建的。您可以使用 VS 表单设计器进行检查。选择“放在前面”或“放在后面”,然后观察 x.designer.cs 的变化。
      为什么它是相反的顺序是 .net 的小秘密之一。解决方法是更改​​顺序。有时手动操作比在设计器中更容易。

      【讨论】:

        猜你喜欢
        • 2014-04-29
        • 2021-03-31
        • 1970-01-01
        • 1970-01-01
        • 2018-05-06
        • 1970-01-01
        • 1970-01-01
        • 2011-08-29
        • 1970-01-01
        相关资源
        最近更新 更多