我不明白如何在WinForms(Windows窗体)应用程序中使用Margin属性

iklwldmw  于 2023-02-05  发布在  Windows
关注(0)|答案(2)|浏览(302)

有人能帮助我理解Margin属性的用处吗?使用下面的简单场景,我看不出它有什么用处

设置

我创建了一个简单的应用程序来测试这一点:
1.从模板创建新的WinForms应用程序
1.已在设计器中打开Form 1
1.从工具箱向Form 1添加了一个“Panel”(称为Panel 1),其中:
Dock =灌装;大小。宽度= 800 px;大小。高度= 450 px ';
1.在Panel 1上添加了两个子“面板”
面板2具有Dock =左侧
面板3具有Dock =右侧
Panel 2和Panel 3的大小.宽度为400 px,大小.高度为450 px(因此Panel 2和Panel 3有效地将Panel 1从中间分割为2)

为什么填充属性对我有意义:

“填充”的用处在设计器中是显而易见的-它在父级(Panel 1)的边框与其内容(Panel 2和Panel 3)之间强制留出空间。
因此,如果我设置Panel1.Padding.All = 10,那么Panel 2和Panel 3的大小和高度都将被强制减少(减少20 px)到430 px,它们的大小和宽度保持不变(它们只是变得重叠)。
然后Winforms阻止Panel 2/Panel 3的大小和高度增加到430 px以上,因为这会侵占Panel 1的填充空间。
这一切对我来说都有意义

为什么MARGIN属性对我没有意义

边距是元素边框周围的空间-它可以防止其他元素过于靠近您正在设置边距的元素。
所以我想,如果我将(Panel 2上的)Margin.Right设置为10 px,这将迫使Panel 3的Size.Width减小(这样它就不会侵占Panel 2的边距)。
相反,设置右边距似乎对表单没有明显的影响?

6ie5vjzr

6ie5vjzr1#

Margin属性主要由可视化设计器使用,并在设计图面上定位控件时通过“对线”反映。
请参阅Microsoft提供的walkthrough

v1l68za4

v1l68za42#

一种思考方式(通常)是Margin是发生在控件 * 外部 * 的事情,而Padding是发生在控件 * 内部 * 的事情。此外,“总体”效果可能是父控件的填充添加到子控件的边距的结果。

  • MainForm填充为25(显示为蓝色),并包含设置为Dock.FillFlowLayoutPanel。* 为避免混淆,流布局面板的填充和边距设置为0。*
  • 流布局面板的6个子控件将其各自的左上角边距设置为10,下角边距设置为40。* 在每个子控件的左上角和底部,BackColorLightSalmon会显示出来。从一个子控件的底部到下面下一个子控件的顶部总共有50个边距。* 每个子控件还设置其填充值设置为15,这将应用于它所包含的按钮的所有四个侧面。
  • Button的padding和margin也设置为0。按钮自动调整大小并居中,因为它在所有边都固定。
public partial class MainForm : Form
{
    public MainForm()
    {
        InitializeComponent();

        // Main form Padding in light blue
        BackColor = Color.LightSkyBlue;
        Padding = new Padding(25);

        flowLayoutPanel.BackColor = Color.LightSalmon;
        // Set these to 0 and let the individual controls
        // manage the padding and margins.
        flowLayoutPanel.Margin = new Padding(all: 0);
        flowLayoutPanel.Padding = new Padding(all: 0);

        for (int i = 1; i <= 6; i++)
        {
            var panel = new TableLayoutPanel
            {
                Name = $"panel{i}",
                Size = new Size(200, 100),

                // Margin 'outside' the panel will show in Light Salmon.
                // This will space the panels inside the FlowLayoutPanel
                Margin = new Padding(left: 10, top: 10, right: 0, bottom: 40),

                // The button inside this panel will have Padding around it.
                Padding = new Padding(all: 15),

                BackColor = Color.LightGreen,
                BackgroundImage = new Bitmap(
                    Path.Combine(
                        AppDomain.CurrentDomain.BaseDirectory,
                        "Images",
                        "back-image.png"
                    )),
                BackgroundImageLayout = ImageLayout.Stretch,
            };
            // Add button to internal panel
            var button = new Button
            {
                Name = $"button{i}",
                Text = $"Button {(char)(64 + i)}",
                BackColor = Color.DarkSeaGreen,
                ForeColor = Color.WhiteSmoke,
                // By anchoring the button, it will autosize
                // respecting the Padding of its parent.
                Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Bottom,
                Margin = new Padding(all: 0),
                Padding = new Padding(all: 0),
            };
            panel.Controls.Add(button);

            flowLayoutPanel.Controls.Add(panel);
        }
    }
}

相关问题