C#所有复选框外观

C#所有复选框外观,c#,checkbox,custom-controls,C#,Checkbox,Custom Controls,在我的WinForms Visual Studio应用程序中,我有一个复选框,样式为平面按钮,代码如下: 我想知道,我是否可以不对应用程序中的每个复选框执行此操作,而是将“未选中”版本设置为该应用程序的默认复选框样式?例如,每次创建新复选框时,它都会显示这些属性 请记住,我对C#中的编码是全新的。这可以通过创建自定义复选框控件来完成。这可以通过创建自定义复选框控件来完成。如果希望多个控件使用同一个事件处理程序,这很简单-只需使用同一个事件处理程序即可。将代码更改为类似以下内容: private

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

我想知道,我是否可以不对应用程序中的每个复选框执行此操作,而是将“未选中”版本设置为该应用程序的默认复选框样式?例如,每次创建新复选框时,它都会显示这些属性


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

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

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

如果希望多个控件使用同一个事件处理程序,这很简单-只需使用同一个事件处理程序即可。将代码更改为类似以下内容:

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;
然后,可以将相同的处理程序附加到所有复选框

如果有多个类,可以将其作为公共静态方法。在这一点上,您可能需要在代码中添加事件处理程序,而不是让设计器来做——我不知道设计器是否知道如何为事件处理程序使用静态方法。但它会是这样的:

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;
如果您真的希望事件处理程序使用相同的代码,那么就是这样。其他需要考虑的是:

  • 按照Rakastrock的建议构造
    CheckBox
    的子类。我自己在Windows窗体中创建自定义控件的经验不是很好,但从OO的角度来看,感觉不错。初始实现可以从
    CheckBox
    派生,并隐式地添加一个事件处理程序,该事件处理程序与当前代码完全相同
  • 如果您想在某个时刻找到表单中的所有
    复选框
    控件,可以使用
    控件
    属性,然后通过任何本身是容器的控件递归。不过,我现在不想详细讨论这个问题,因为听起来你并不真的想要这样做——除非你这样做只是为了找到所有的
    复选框
    控件,并向所有控件添加相同的事件处理程序

如果希望多个控件使用同一个事件处理程序,这很简单-只需使用同一个事件处理程序即可。将代码更改为类似以下内容:

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;
然后,可以将相同的处理程序附加到所有复选框

如果有多个类,可以将其作为公共静态方法。在这一点上,您可能需要在代码中添加事件处理程序,而不是让设计器来做——我不知道设计器是否知道如何为事件处理程序使用静态方法。但它会是这样的:

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;
如果您真的希望事件处理程序使用相同的代码,那么就是这样。其他需要考虑的是:

  • 按照Rakastrock的建议构造
    CheckBox
    的子类。我自己在Windows窗体中创建自定义控件的经验不是很好,但从OO的角度来看,感觉不错。初始实现可以从
    CheckBox
    派生,并隐式地添加一个事件处理程序,该事件处理程序与当前代码完全相同
  • 如果您想在某个时刻找到表单中的所有
    复选框
    控件,可以使用
    控件
    属性,然后通过任何本身是容器的控件递归。不过,我现在不想详细讨论这个问题,因为听起来你并不真的想要这样做——除非你这样做只是为了找到所有的
    复选框
    控件,并向所有控件添加相同的事件处理程序

从问题中可以看出,您试图做的是从单个复选框操纵应用程序中的所有复选框,因此这里的逻辑如下所示:

Properties.Settings.Default.someBoolValue=cbCheckBox.Checked;
Properties.Settings.Default.Save();
在设置中保存所有复选框值(选中或未选中)

创建设置值的步骤

Right Click Project>Properties>Settings>Give Name as someBoolValue,type as bool,Scope as User
因此,在该复选框的CheckChanged事件中,保存我们刚才创建的设置变量中的值。在main的CheckChangedEvent中,所有复选框代码如下所示:

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
   }
}

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

从问题中可以看出,您试图做的是从一个复选框操作应用程序中的所有复选框,因此这里的逻辑如下所示:

Properties.Settings.Default.someBoolValue=cbCheckBox.Checked;
Properties.Settings.Default.Save();
在设置中保存所有复选框值(选中或未选中)

创建设置值的步骤

Right Click Project>Properties>Settings>Give Name as someBoolValue,type as bool,Scope as User
因此,在该复选框的CheckChanged事件中,保存我们刚才创建的设置变量中的值。在main的CheckChangedEvent中,所有复选框代码如下所示:

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
   }
}

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

这是Windows窗体吗?你有多种表格吗?你是在问你是否需要像这样的多种方法吗?(如果您将代码更改为使用
sender
而不是将其硬编码为
TestBox
,您可以对所有复选框使用相同的事件处理程序-这是您的意思吗?)是的,应用程序中有多个表单。我想说的是,我希望带有未选中图像的平面按钮无边框复选框在每个表单上以相同的方式显示。检查过的版本也是如此。所以我不必一遍又一遍地编写这段代码。这就是Windows窗体吗?你有多种表格吗?你是在问你是否需要像这样的多种方法吗?(如果您将代码更改为使用
sender
而不是将其硬编码为
TestBox
,您可以对所有复选框使用相同的事件处理程序-这是您的意思吗?)是的,应用程序中有多个表单。我想说的是,我希望带有未选中图像的平面按钮无边框复选框在每个表单上以相同的方式显示。检查过的版本也是如此。所以我不必一遍又一遍地编写这段代码,请记住,因为我对这一切都是全新的