C#所有复选框外观

时间:2016-03-23 07:04:52

标签: c# checkbox custom-controls

在我的WinForms Visual Studio应用程序中,我有一个复选框样式为带有此C#代码的平面按钮:

 private void checkBox1_CheckedChanged(object sender, EventArgs e)
    {
        if (TestBox.Checked == true)
        {
            TestBox.Image = Image.FromFile("M:\\CheckBox_52x.png");
            TestBox.ImageAlign = ContentAlignment.MiddleCenter;
            TestBox.FlatAppearance.BorderSize = 0;
            // make all four (!) BackColors transparent!
            TestBox.BackColor = System.Drawing.Color.Transparent;
            TestBox.FlatAppearance.CheckedBackColor = Color.Transparent;
            TestBox.FlatAppearance.MouseDownBackColor = Color.Transparent;

        }
        else
        {
            TestBox.Image = Image.FromFile("M:\\CheckBoxUncheck_52x.png");
            TestBox.ImageAlign = ContentAlignment.MiddleCenter;
            TestBox.FlatAppearance.BorderSize = 0;
            // make all four (!) BackColors transparent!
            TestBox.BackColor = System.Drawing.Color.Cyan;
            TestBox.FlatAppearance.CheckedBackColor = Color.Cyan;
            TestBox.FlatAppearance.MouseDownBackColor = Color.Cyan;
        }
    }

我想知道,如果不是对我的应用程序中的每个复选框执行此操作,我可以制作" UNCHECKED"版本我编写了此应用程序的默认复选框样式 - 例如 - 每次我创建一个新的复选框样式时,它都会显示这些属性。

请记住,我是C#编码的新手。

3 个答案:

答案 0 :(得分:3)

如果您希望多个控件使用相同的事件处理程序,那很容易 - 只需使用相同的事件处理程序。将您的代码更改为:

private void HandleCheckBoxCheckedChanged(object sender, EventArgs e)
{
    CheckBox checkBox = (CheckBox) sender;
    string imageFile;
    Color color;
    if (checkBox.Checked == true)
    {
        // TODO: Use resources embedded within your app
        imageFile = "M:\\CheckBox_52x.png";
        color = Color.Transparent;
    }
    else
    {
        imageFile = "M:\\CheckBoxUncheck_52x.png";
        color = Color.Cyan;
    }
    // TODO: Load each file once and reuse the bitmap, I suspect.
    checkBox.Image = Image.FromFile(imageFile);
    checkBox.ImageAlign = ContentAlignment.MiddleCenter;
    checkBox.FlatAppearance.BorderSize = 0;
    checkBox.BackColor = color;
    checkBox.FlatAppearance.CheckedBackColor = color;
    checkBox.FlatAppearance.MouseDownBackColor = color;
}

然后,您可以将相同的处理程序附加到所有复选框。

如果您有多个类,则可以将其设为公共静态方法。此时,您可能需要在代码中添加事件处理程序而不是让设计者执行此操作 - 我不知道设计者是否知道如何将静态方法用于事件处理程序。但它只是像:

TestBox.CheckedChanged += CheckBoxUtilities.HandleCheckBoxCheckedChanged;

如果您真的只想将相同的代码用于事件处理程序。其他需要考虑的事项是:

  • 按照rakatherock的建议构建CheckBox的子类。我自己在Windows窗体中创建自定义控件的经验并不是很好,但从OO的角度来看,感觉很好。初始实现可以从CheckBox派生,并隐式添加一个事件处理程序,它完全符合您当前的代码。
  • 如果要在某个时刻找到表单中的所有CheckBox控件,可以使用Controls属性,然后通过任何控件本身进行容器处理。我现在不会详细介绍它,因为听起来你并不是真的想要这个 - 除非你只是为了找到所有CheckBox控件并向所有控件添加相同的事件处理程序

答案 1 :(得分:1)

这可以通过创建自定义复选框控件来完成。

答案 2 :(得分:1)

从问题中你要做的是从一个复选框中操作应用程序中的所有复选框,所以这里的逻辑如下:

在设置

中保存全部复选框值(选中或取消选中)

创建设置值

Right Click Project>Properties>Settings>Give Name as someBoolValue,type as bool,Scope as User

所以在这个复选框的CheckChanged事件中保存我们刚刚创建的Settings变量中的值。在主Check的CheckChangedEvent中,All Check框代码如下:

Properties.Settings.Default.someBoolValue=cbCheckBox.Checked;
Properties.Settings.Default.Save();

现在,每个表单加载都是适合的事件,如

foreach(Control c in this.Controls)
{
   if(c is CheckBox)
   {
     c.Checked=Properties.Settings.Default.someBoolValue
   }
}

注意:您可以替换我使用自定义控件实现的所有复选框。我已经告诉您如何操作。