【问题标题】:Overlapping DockStyle.Top Panels重叠的 DockStyle.Top 面板
【发布时间】:2021-08-31 06:34:16
【问题描述】:

我正在尝试在每次按下按钮时向面板添加一个带有停靠样式顶部的新面板。每次我按下按钮时,面板都会创建并添加到父级,但即使将停靠样式设置为顶部,它们总是会添加到完全相同的位置。 我尝试使用 BringToFront 对其进行调整,但这没有任何区别。 在我可以使用 DockStyle 之前,我是否必须对父面板应用某种布局?

这是我的代码:

private void AddInputLine()
        {
            this.ButtonFileDialog.Add(this.CreateFileBrowserButton());
            this.TextBoxInput.Add(this.CreateInputTextBox());

            System.Drawing.Size buttonSize = new System.Drawing.Size(this.TextBoxInput[^1].Size.Height, this.TextBoxInput[^1].Size.Height);
            this.ButtonFileDialog[^1].MinimumSize = buttonSize;
            this.ButtonFileDialog[^1].MaximumSize = buttonSize;

            this.FormatPanels.Add(new Panel());

            this.FormatPanels[^1].Controls.Add(this.TextBoxInput[^1]);
            this.TextBoxInput[^1].BringToFront();

            this.FormatPanels[^1].Controls.Add(this.ButtonFileDialog[^1]);
            this.ButtonFileDialog[^1].BringToFront();

            this.PanelRightSide.Controls.Add(this.FormatPanels[^1]);
            this.FormatPanels[^1].Dock = DockStyle.Top;
        }

【问题讨论】:

  • 我建议您使用表单设计器,手动拖放面板并设置它们的属性。然后转到 Form1.designer.cs 文件并从那里复制生成的代码,并使用该代码动态填充面板。 ps ^1 是怎么回事?
  • 谢谢,我想我必须这样做...... ^1 表示索引是向后读取的,因此它获取列表的最后一个元素。
  • 不要滥用索引器,而是使用您刚刚创建的对象的实际实例,然后验证您实际带到前面的内容和对接的内容:不是同一个对象。 -- BringToFront() / SendToBack() 布局功能适用于停靠控件,而不是其子控件。 -- 我建议使用 FlowLayoutPanel 或 TableLayoutPanel 来简化/自动化这种布局。
  • 您添加的最后一个在顶部。所以你可能意味着 this.FormatPanels[^1].BringToFront() 让它附加。是的,当您使用变量来存储面板引用时,它变得更具可读性。

标签: c# .net winforms


【解决方案1】:

好的,我找到了问题...父级的 AutoScroll 属性为假。新创建的面板刚刚填充了整个父面板,因此其他面板不可见。激活 AutoScroll 和 Auto size 后它起作用了。这是格式面板的工作版本:

this.FormatPanels.Add(new Panel
            {
                BackColor = System.Drawing.Color.FromArgb((int)Ressources.AppColors.MenuBackground),
                Padding = new Padding(3),
                Dock = DockStyle.Top,
                AutoSize = true,
                AutoSizeMode = AutoSizeMode.GrowAndShrink,
                MinimumSize = new System.Drawing.Size(70, 60),
            });

【讨论】:

  • 你可以接受你自己的答案,一旦你认为它足够完整(也许你应该添加一些代码示例)。这将帮助其他面临同样问题的人。
  • 请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。
猜你喜欢
  • 2017-09-18
  • 2010-11-16
  • 1970-01-01
  • 2012-08-03
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多