如何在 FlowLayoutPanel 中居中对齐多个单选按钮?
How to center align multiple radio buttons in FlowLayoutPanel?
我正在使用 windows 表单并尝试在 FlowLayoutPanel
上添加多个单选按钮。我可能会动态添加 10-12 个单选按钮,也可能会删除它们,但它们始终位于 FlowLayoutPanel
的中心。目前正在添加它们,如下图所示:
要微调控件在容器中的位置,您可以修改它们的 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);
}
每当添加或删除控件时调用该函数:
centerControls(ctls, flowLayoutPanel1);
添加新按钮时,您需要重置 Margins
..
请注意,我只更改了外部 Margins
,而不是中间的 space。要执行后者,您可以计算 space 并更改所有控件的 Margins
:
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
超过一行时会发生什么!您可能需要更加努力地维护列表..
另请注意,用户不喜欢他们的控件跳来跳去!
更新: 看看 ar Reza 的 post and 以无代码方式实现类似于第一个布局的方法!
我正在使用 windows 表单并尝试在 FlowLayoutPanel
上添加多个单选按钮。我可能会动态添加 10-12 个单选按钮,也可能会删除它们,但它们始终位于 FlowLayoutPanel
的中心。目前正在添加它们,如下图所示:
要微调控件在容器中的位置,您可以修改它们的 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);
}
每当添加或删除控件时调用该函数:
centerControls(ctls, flowLayoutPanel1);
添加新按钮时,您需要重置 Margins
..
请注意,我只更改了外部 Margins
,而不是中间的 space。要执行后者,您可以计算 space 并更改所有控件的 Margins
:
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
超过一行时会发生什么!您可能需要更加努力地维护列表..
另请注意,用户不喜欢他们的控件跳来跳去!
更新: 看看 ar Reza 的 post