2

我试图将我的复选框居中TableLayoutPanel,但由于复选框控件的性质,它们最终总是看起来左对齐。见下图:

表格布局图片

我希望每行检查都是左对齐的,但它看起来更居中。类似于以下内容:

表格布局居中

我在网上查了一下,我可以通过设置AnchorStyles.None这不是我想要的来使复选框居中,因为这样复选框就没有对齐。我将它们设置为,Dock.Fill因此您可以单击单元格中的任意位置以激活复选框。

我目前只是填充我的桌子以达到类似的效果,但从长远来看,这不是一个可接受的解决方案。此外,填充单元格将换行复选框文本,而不会占用行上的所有可用空间(因为某些行正在被填充占用)。使用表格左侧的间隔单元也是如此,这不是理想的解决方案。

有没有人有任何想法?谢谢!

4

2 回答 2

1

这可能对您有用:

  1. ColumnStyles您的所有设置TableLayoutPanel.SizeType = SizeType.AutoSize.

  2. 设置你的TableLayoutPanel.AutoSize = trueTableLayoutPanel.AutoSizeMode = AutoSizeMode.GrowAndShrink;

  3. 添加此代码以动态居中您的复选框(以及您的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.
    }
    

更新

至于您添加的问题,我认为我们必须更改一些内容:

  1. 将你的设置CheckBox AutoSize为假。之前的解决方案要求它是true.

  2. 添加更多代码(在上面的代码旁边):

     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;
     };
    
于 2013-08-05T22:27:32.613 回答
0

不是在单元格中放置复选框,而是将面板中的每个复选框都放在组框内,这将允许复选框填充每个面板并在它们周围有一个可点击的区域。然后将组框停靠设置为填充,并将面板的锚设置为顶部,底部它们都保持居中。

于 2013-08-05T23:04:52.343 回答