如何在FlowLayoutPanel中居中对齐多个单选按钮?

时间:2016-09-21 09:57:42

标签: c# winforms flowlayoutpanel

我正在使用Windows窗体并尝试在FlowLayoutPanel上添加多个单选按钮。我可以动态添加10-12个单选按钮,可能会删除它们,但它们始终位于FlowLayoutPanel的中心。目前它们的添加方式如下图所示: enter image description here

1 个答案:

答案 0 :(得分:3)

要微调其容器中控件的位置,您可以修改其Margin属性。

假设您有控件以列表为中心:

List<Control> ctls = new List<Control>();
foreach (Control c in flowLayoutPanel1.Controls) ctls.Add(c);

您可以调用函数来对齐它们:

void centerControls(List<Control> ctls, Control container)
{
    int w = container.ClientSize.Width;
    int marge = (w - ctls.Sum(x => x.Width)) / 2;
    Padding oldM = ctls[0].Margin;
    ctls.First().Margin = new Padding(marge, oldM.Top, oldM.Right, oldM.Bottom);
    ctls.Last().Margin = new Padding(oldM.Left, oldM.Top, oldM.Right, marge);
}

enter image description here

enter image description here

无论何时添加或删除控件,都要调用该函数:

centerControls(ctls, flowLayoutPanel1);

添加新按钮时,您需要重置 Margins ..

请注意,我只更改外部Margins,而不是更改之间的空格。要执行后者,您可以计算空间并更改所有控件的Margins

enter image description here

void spaceControls(List<Control> ctls, Control container)
{
    int w = container.ClientSize.Width;
    int marge = (w - ctls.Sum(x => x.Width)) / (ctls.Count * 2 );
    Padding oldM = ctls[0].Margin;
    Padding newM = new Padding(marge, oldM.Top, marge, oldM.Bottom);
    foreach (Control c in ctls) c.Margin = newM;
}

还要考虑当RadioButtons多行时会发生什么!你可能想在maintinang列出更多的努力..

另请注意,用户不喜欢他们的控件跳转很多!

更新:请查看Reza的帖子herehere,了解如何以无代码的方式实现第一个布局!