C# 所有复选框的单个事件处理程序

C# 所有复选框的单个事件处理程序,c#,winforms,event-handling,controls,C#,Winforms,Event Handling,Controls,我正在尝试轻松地制作自定义复选框。我想在每个复选框的顶部按其选中状态绘制一个图像。如何为所有复选框创建单个事件处理程序?我有很多复选框,我不想为它编写每个事件处理程序: private void checkbox1_Paint(object sender, PaintEventArgs e) { Rectangle rect = new Rectangle(0, 0, 16, 16); if (checkbox1.Checked)

我正在尝试轻松地制作自定义复选框。我想在每个复选框的顶部按其选中状态绘制一个图像。如何为所有复选框创建单个事件处理程序?我有很多复选框,我不想为它编写每个事件处理程序:

    private void checkbox1_Paint(object sender, PaintEventArgs e)
    {
        Rectangle rect = new Rectangle(0, 0, 16, 16);
        if (checkbox1.Checked)
        {
            e.Graphics.DrawImage(Properties.Resources.checkbox_checked, rect);
        }
        else
        {
            e.Graphics.DrawImage(Properties.Resources.checkbox_unchecked, rect);
        }
    }
    private void checkbox2_Paint(object sender, PaintEventArgs e)
    {
        Rectangle rect = new Rectangle(0, 0, 16, 16);
        if (checkbox2.Checked)
        {
            e.Graphics.DrawImage(Properties.Resources.checkbox_checked, rect);
        }
        else
        {
            e.Graphics.DrawImage(Properties.Resources.checkbox_unchecked, rect);
        }
    }
    // etc...

您可以多次使用相同的方法,只需通过设计器或代码在Paint Event中指定它即可

若要获取当前复选框,请将发件人强制转换为复选框

private void checkbox1_Paint(object sender, PaintEventArgs e)
{
CheckBox chk = sender as CheckBox;
..
}

您可以多次使用相同的方法,只需通过设计器或代码在Paint Event中指定它即可

若要获取当前复选框,请将发件人强制转换为复选框

private void checkbox1_Paint(object sender, PaintEventArgs e)
{
CheckBox chk = sender as CheckBox;
..
}

我假设这是基于上下文的Windows窗体

您可以在窗体设计器上选中每个可以多选的复选框,单击“属性”面板中的闪电,找到绘制事件并将方法名称设置为:checkbox1_Paint
,在那里。

我假设这是基于上下文的Windows窗体

您可以在窗体设计器上选中每个可以多选的复选框,单击“属性”面板中的闪电,找到绘制事件并将方法名称设置为:checkbox1_Paint
,在那里。

将此处理程序分配给所有复选框。请注意,我是如何将sender强制转换为复选框以获取触发事件的控件的

private void checkbox_Paint(object sender, PaintEventArgs e)
{
    var checkbox = sender as CheckBox // Here you get the current checkbox
    Rectangle rect = new Rectangle(0, 0, 16, 16);
    if (checkbox.Checked)
    {
        e.Graphics.DrawImage(Properties.Resources.checkbox_checked, rect);
    }
    else
    {
        e.Graphics.DrawImage(Properties.Resources.checkbox_unchecked, rect);
    }
}

将此处理程序分配给所有复选框。请注意,我是如何将sender强制转换为复选框以获取触发事件的控件的

private void checkbox_Paint(object sender, PaintEventArgs e)
{
    var checkbox = sender as CheckBox // Here you get the current checkbox
    Rectangle rect = new Rectangle(0, 0, 16, 16);
    if (checkbox.Checked)
    {
        e.Graphics.DrawImage(Properties.Resources.checkbox_checked, rect);
    }
    else
    {
        e.Graphics.DrawImage(Properties.Resources.checkbox_unchecked, rect);
    }
}

事实上,我自己找到了答案。这比手动将绘制事件分配给每个复选框更容易,因为它是以编程方式完成的

public void SetAllCheckboxes(Control where)
{
    foreach (Control control in where.Controls)
    {
        if (control.GetType().Name == "CheckBox")
            control.Paint += new PaintEventHandler(this.checkbox_Paint);
        else if (control.Controls.Count > 0)
            SetAllCheckboxes(control);
    }
}
然后再打电话给它:

SetAllCheckboxes(this);

事实上,我自己找到了答案。这比手动将绘制事件分配给每个复选框更容易,因为它是以编程方式完成的

public void SetAllCheckboxes(Control where)
{
    foreach (Control control in where.Controls)
    {
        if (control.GetType().Name == "CheckBox")
            control.Paint += new PaintEventHandler(this.checkbox_Paint);
        else if (control.Controls.Count > 0)
            SetAllCheckboxes(control);
    }
}
然后再打电话给它:

SetAllCheckboxes(this);

如果这是WPF,您可以使用事件冒泡机制在父级的已检查或未检查处理程序中处理它,P161@David哦,刚刚注意到。不,这不是WPF,而是windows窗体。如果这是WPF,您可以使用事件冒泡机制在父级的已检查或未检查处理程序中处理它。请参阅《WPF已释放》,P161@David哦,刚刚注意到。不,不是WPF,是windows窗体。