C# ComboBox 文本居中设置

  • 在原生的ComboBox功能中没有属性是设置文本位置,默认位置为左对齐;想要把其中的文本设置为居中但是没有直接方法;

  • 方案一:网上流传比较多方法:
    第一步:先将combobox的DrawMode属性设置为OwnerDrawFixed; C# ComboBox 文本居中设置_第1张图片
    第二步:在comboBox的DrawItem事件方法中重新绘制item选项的位置;这里不做细说,附网址https://zhidao.baidu.com/question/143123179.html
    C# ComboBox 文本居中设置_第2张图片
    但是这种方法有一个弊端:居中的只是下拉项;而显示区域的文本不会居中;
    So作者又进行了第三步:给显示区域的文本进行居中;方法是
    //字符所占空间大小方法,用于求空格宽度和选项字符串宽度; Font是字符串的样式
    Graphics graphics = CreateGraphics();
    SizeF size_item = graphics.MeasureString(“ ”, Font);

    剩余宽度=(控件宽(可知)-文本宽(可知))/2;
    空格个数=剩余宽度/空格宽度;
    显示项=(空格个数*n )拼接+原文本.Trim();

问题:1、不能正确居中,把空格换成“-”就行,想不通;
2、在选择其他选项后显示文本又变成左对齐(自动把添加的空格去掉了);
3、在SelectIndex事件中给Items重新复制会导致 死循环!!!!

  • 方案二:踏过前面的坑,想直接在初始化时候就根据宽度给每个选择项都添加空格设置居中;
    上代码
	        float w1 = comboBox1.Width;
            comboBox1.SelectedIndex=0;
            Graphics graphics = CreateGraphics();
            SizeF sizeF_sp = graphics.MeasureString(" ", comboBox1.Font);						//空格宽度
            for (int i = 0; i < comboBox1.Items.Count; i++)
            {
                SizeF sizeF_1 = graphics.MeasureString(comboBox1.Items[i].ToString().Trim(), comboBox1.Font);      // 选中字宽度
                int spmun = (int)(((w1 - sizeF_1.Width) / 2) / sizeF_sp.Width);
                StringBuilder sb = new StringBuilder();
                for (int j = 0; j < spmun; j++)
                {
                    sb.Append(" ");
                }
                sb.Append(comboBox1.Items[i].ToString());
                comboBox1.Items[i] = sb.ToString();
            }  
  • 还有就是直接重绘,每次选择项之后,在SelectIndex_Changed 或者SelectValue_Changed中重新绘制我没 有进行尝试,有试过的朋友可以进行留言;

你可能感兴趣的:(C# ComboBox 文本居中设置)