C# 将“表格布局”面板中的复选框居中
我试图在C# 将“表格布局”面板中的复选框居中,c#,.net,winforms,checkbox,tablelayout,C#,.net,Winforms,Checkbox,Tablelayout,我试图在表格布局面板中居中放置复选框,但由于复选框控件的性质,它们总是看起来左对齐。见下图: 我希望每行检查都左对齐,但要使其看起来更居中。如下所示: 我已经在网上查过了,我可以通过设置AnchorStyles将复选框居中。无这不是我想要的,因为这样复选框就没有对齐。我已将它们设置为Dock.Fill,以便您可以单击单元格中的任意位置以激活复选框 我目前只是在填充表格以达到类似的效果,但从长远来看,这并不是一个可接受的解决方案。此外,填充单元格将在不占用行上所有可用空间的情况下对复选框文本进
表格布局面板中居中放置复选框,但由于复选框控件的性质,它们总是看起来左对齐。见下图:
我希望每行检查都左对齐,但要使其看起来更居中。如下所示:
我已经在网上查过了,我可以通过设置AnchorStyles将复选框居中。无这不是我想要的,因为这样复选框就没有对齐。我已将它们设置为Dock.Fill
,以便您可以单击单元格中的任意位置以激活复选框
我目前只是在填充表格以达到类似的效果,但从长远来看,这并不是一个可接受的解决方案。此外,填充单元格将在不占用行上所有可用空间的情况下对复选框文本进行换行(因为某些行被填充占用)。同样的道理也适用于使用表格左侧的间隔电池,而不是理想的解决方案
有人有什么想法吗?谢谢 这可能适合您:
将表格布局面板的所有列样式设置为.SizeType=SizeType.AutoSize
设置您的TableLayoutPanel.AutoSize=true
和TableLayoutPanel.AutoSizeMode=AutoSizeMode.GrowtandShrink
将此代码添加到复选框(以及TableLayoutPanel
)的中心位置:
//SizeChanged event handler of your tableLayoutPanel1
private void tableLayoutPanel1_SizeChanged(object sender, EventArgs e){
//We just care about the horizontal position
tableLayoutPanel1.Left = (tableLayoutPanel1.Parent.Width - tableLayoutPanel1.Width)/2;
//you can adjust the vertical position if you need.
}
更新
至于你补充的问题,我认为我们必须改变一些事情:
将复选框设置为false。之前的解决方案要求它是true
添加更多代码(在上面的代码旁边):
int checkWidth=CheckBoxRenderer.GetGlyphSize(yourcheck.CreateGraphics(),System.Windows.Forms.VisualStyles.CheckBoxState.MixedNormal)宽度;
//TextChanged复选框的事件处理程序(用于所有复选框)
私有无效复选框\u text已更改(对象发送方、事件参数e){
UpdateCheckBoxSize((复选框)发送方);
}
//方法更新复选框的大小,当复选框的字体为粗体且AutoSize=true时,大小将更改。
//但是,我们设置AutoSize=false,并且必须使复选框足够宽
//包含其文本的粗体版本。
私有void UpdateCheckBoxSize(复选框c){
c、 宽度=TextRenderer.MeasureText(c.Text,新字体(c.Font,FontStyle.Bold)).Width+2*checkWidth;
}
//最初,您必须调用UpdateCheckBoxSize
//此代码可以放在表单构造函数中
foreach(tableLayoutPanel1.Controls.OfType()中的复选框c)
UpdateCheckBoxSize(c);
//添加此选项可使复选框居中,即使包含tableLayoutPanel1的表单调整了大小
//这也可以放在表单构造函数中
tableLayoutPanel1.Parent.SizeChanged+=(s,e)=>{
tableLayoutPanel1.Left=(tableLayoutPanel1.Parent.Width-tableLayoutPanel1.Width)/2;
};
与其将复选框放在单元格中,不如将每个复选框放在一个面板中,所有复选框都放在一个groupbox中,这样复选框就可以填充每个面板,并在其周围有一个可单击的区域。然后,将groupbox停靠设置为填充,面板的锚设置为顶部,底部,它们都保持居中。这是目前为止效果最好的,但我还有一个谜语要告诉你:假设用户滚动复选框时,复选框变为粗体。这会改变复选框,为新的粗体尺寸腾出空间。我怎样才能将单元格的大小强制到未来,可能的,粗体的大小,这样当用户滚动单元格时,单元格就不会“摇摆”了?这样更好,但还是向左倾斜。谢天谢地,粗体不再移动复选框。谢谢你的帮助,虽然它并不完美,但比我所拥有的要好@DTI Matt很容易修复,我发布的代码位于表格布局面板1
的中心,它要求复选框(在同一行上)具有相同的文本长度。如果您在表格布局面板1\u SizeChanged
中更改代码,您可以实现您想要的。重点不是tableLayoutPanel1.Width
,您必须获得同一行上两个复选框的总文本长度的Width
,您可以在UpdateCheckBoxSize(…)
方法中更新此Width
。。。我希望您能理解。@DTI Matt另外,如果第1列和第2列中的复选框在文本长度方面有很大差异,则该复选框不会居中,新代码必须为粗体版本腾出空间,而且文本越长,复选框需要的空间就越大。如果更正布局以便可以看到居中的复选框(使用普通字体),则当鼠标悬停在文本上方时,文本可能会被剪切掉(这意味着粗体字体文本没有足够的显示空间)。我想鼠标悬停时,您可以尝试更改颜色,而不是font-weight
。
int checkWidth = CheckBoxRenderer.GetGlyphSize(yourCheckBox.CreateGraphics(),System.Windows.Forms.VisualStyles.CheckBoxState.MixedNormal).Width;
//TextChanged event handler of your CheckBoxes (used for all the checkBoxes)
private void checkBoxes_TextChanged(object sender, EventArgs e){
UpdateCheckBoxSize((CheckBox)sender);
}
//method to update the size of CheckBox, the size is changed when the CheckBox's Font is bolded and AutoSize = true.
//However we set AutoSize = false and we have to make the CheckBox wide enough
//to contain the bold version of its Text.
private void UpdateCheckBoxSize(CheckBox c){
c.Width = TextRenderer.MeasureText(c.Text, new Font(c.Font, FontStyle.Bold)).Width + 2 * checkWidth;
}
//initially, you have to call UpdateCheckBoxSize
//this code can be placed in the form constructor
foreach(CheckBox c in tableLayoutPanel1.Controls.OfType<CheckBox>())
UpdateCheckBoxSize(c);
//add this to make your CheckBoxes centered even when the form containing tableLayoutPanel1 resizes
//This can also be placed in the form constructor
tableLayoutPanel1.Parent.SizeChanged += (s,e) => {
tableLayoutPanel1.Left = (tableLayoutPanel1.Parent.Width - tableLayoutPanel1.Width)/2;
};