首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#所有复选框外观

C#所有复选框外观
EN

Stack Overflow用户
提问于 2016-03-23 07:04:51
回答 3查看 4.2K关注 0票数 1

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

代码语言:javascript
复制
 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;
        }
    }

我想知道,如果不是对我的应用程序中的每个复选框都这样做,我是否可以为这个应用程序编写“未选中”版本的默认复选框样式--例如,每当我创建一个新的复选框时,它就会出现在这些属性中。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-23 07:16:57

如果希望多个控件使用相同的均衡器,这很容易--只需使用相同的事件处理程序即可。将代码更改为如下所示:

代码语言:javascript
复制
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;
}

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

如果有多个类,则可以使其成为一个公共静态方法。此时,您可能需要在代码中添加事件处理程序,而不是让设计人员执行--我不知道设计器是否知道如何为事件处理程序使用静态方法。但就像:

代码语言:javascript
复制
TestBox.CheckedChanged += CheckBoxUtilities.HandleCheckBoxCheckedChanged;

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

  • 构造一个CheckBox的子类,这是由rakatherock提出的。我自己在Windows窗体中创建自定义控件的经验并不是很好,但从面向对象的角度来看,感觉还不错。初始实现可以从CheckBox派生,并隐式地添加一个事件处理程序,该处理程序与当前代码完全相同。
  • 如果希望在某个时候在窗体中找到所有CheckBox控件,则可以使用Controls属性,然后通过任何本身为容器的控件进行递归。不过,我现在不打算详细介绍这方面的内容,因为听起来您似乎并不想这样做--除非您这样做只是为了找到所有的CheckBox控件,并向所有这些控件添加相同的事件处理程序。
票数 3
EN

Stack Overflow用户

发布于 2016-03-23 07:15:56

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

票数 1
EN

Stack Overflow用户

发布于 2016-03-23 07:27:34

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

将所有复选框值(选中或未选中)保存在设置中。

创建设置值

代码语言:javascript
复制
Right Click Project>Properties>Settings>Give Name as someBoolValue,type as bool,Scope as User

因此,在此复选框的CheckChanged事件上,保存我们创建的设置变量中的值--只有now.In CheckChangedEvent of main --所有复选框代码如下:

代码语言:javascript
复制
Properties.Settings.Default.someBoolValue=cbCheckBox.Checked;
Properties.Settings.Default.Save();

现在,在每个表单上,加载都是事件合适的地方,请做如下所示

代码语言:javascript
复制
foreach(Control c in this.Controls)
{
   if(c is CheckBox)
   {
     c.Checked=Properties.Settings.Default.someBoolValue
   }
}

注意:您可以用您的自定义控件替换我实现的所有复选框,我只是给了您一个方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36171724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档