C#:更改按钮BackColor无效

时间:2011-08-19 22:11:30

标签: c# winforms button backcolor

我在Windows窗体中遇到C#按钮问题。

我以编程方式创建了许多按钮,然后将它们添加到表单中。

有趣的是,除了修改BackColor之外,对这些按钮(位置和大小)的每次修改都很容易执行。只有按钮的颜色保持不变。

代码看起来像这样:

public class SimpleSortAlgDisplayer : ISortAlgDisplayer
{

    #region ISortAlgDisplayer Member

    void ISortAlgDisplayer.Init(int[] Data)
    {
        this.DataLength = Data.Length;
        this.DispWin = new CurrentSortStateWin();
        this.DispWin.Show();
        this.DispWin.Size = new Size(60 + (10 * this.DataLength), 120);

        this.myArrayElements = new Button[this.DataLength];
        for (int i = 0; i < this.DataLength; i++)
        {
            this.myArrayElements[i] = new Button();
            //begin of series of invoked actions

            this.myArrayElements[i].Size=new Size(5,(int)(((80)*(double)Data[i])/1000));
            this.myArrayElements[i].Location = new Point(30 + (i * 10), 90-(this.myArrayElements[i].Size.Height));
            this.myArrayElements[i].Enabled = true;
            this.myArrayElements[i].BackColor = Color.MidnightBlue;
            this.myArrayElements[i].UseVisualStyleBackColor = true;
            this.DispWin.Controls.Add(this.myArrayElements[i]);
            this.myArrayElements[i].Refresh();

        }
    }

任何人的想法?

提出了一个类似的问题here,但答案并不是很有帮助:

  • 尝试使用Invoke为我提供了尚未创建DispWin的运行时错误。
  • UseVisualStyleBackColor设置为false不会改变任何内容。
  • 仅在添加和格式化按钮后设置BackColorForeColor或显示DispWin也无效。

我哪里错了?

4 个答案:

答案 0 :(得分:8)

您正在尝试设置颜色,但是然后您将其覆盖为UseVisualStyleBackColor = true

如果您想使用自定义颜色,则需要将UseVisualStyleBackColor设置为false,否则只有在鼠标悬停时才会将颜色应用于按钮。

一个简单的测试uploaded to GitHub

public partial class mainForm : Form
{
    Random randonGen = new Random();

    public mainForm()
    {
        InitializeComponent();
    }

    private void mainForm_Load(object sender, EventArgs e)
    {
        populate();
    }

    private void populate()
    {
        Control[] buttonsLeft = createButtons().ToArray();
        Control[] buttonsRight = createButtons().ToArray();

        pRight.Controls.AddRange(buttonsRight);
        pLeft.Controls.AddRange(buttonsLeft);
    }

    private List<Button> createButtons()
    {
        List<Button> buttons = new List<Button>();

        for (int i = 1; i <= 5; i++)
        {

            buttons.Add(
                new Button()
                {
                    Size = new Size(200, 35),
                    Enabled = true,
                    BackColor = GetColor(),
                    ForeColor = GetColor(),
                    UseVisualStyleBackColor = false,
                    Left = 20,
                    Top = (i * 40),
                    Text = String.Concat("Button ", i)
                });
        }

        return buttons;
    }

    private Color GetColor()
    {
        return Color.FromArgb(randonGen.Next(255), randonGen.Next(255), randonGen.Next(255));
    }
}

结果

enter image description here

答案 1 :(得分:2)

如果按钮的FlatStyle设置为System,则不会显示任何背景颜色,而是使用系统颜色模板中的背景颜色。

答案 2 :(得分:1)

确保没有设置BackgroundImage。这会覆盖BackColor。

答案 3 :(得分:0)

在Button的属性窗口中。查找“ FlatStyle”属性并将其从“系统”更改为“平面”,“标准”或“弹出”,您将能够看到按钮颜色的变化。我刚刚解决了这个问题。