winforms 如何一次选中多个单选按钮

iecba09b  于 2023-01-05  发布在  其他
关注(0)|答案(2)|浏览(210)

我是新的编码,我目前正在采取的课程。我试图使一个颜色混合器,你选择两个单选按钮从两个不同的类别。但当我运行程序,我只能选择一个单选按钮在同一时间。以下是我使用的代码:

private void btnMix_Click(object sender, EventArgs e)
{
    if (radRedFirst.Checked && radRedSecond.Checked)
        this.BackColor = System.Drawing.Color.Red;
    else if (radBlueFirst.Checked && radBlueSecond.Checked)
        this.BackColor = System.Drawing.Color.Blue;
    else if (radYellowFirst.Checked && radYellowSecond.Checked)
        this.BackColor = System.Drawing.Color.Yellow;
    else if ((radRedFirst.Checked && radBlueSecond.Checked) ||
            (radBlueFirst.Checked && radRedSecond.Checked))
        this.BackColor = System.Drawing.Color.Purple;
    else if ((radRedFirst.Checked && radYellowSecond.Checked) ||
            (radYellowFirst.Checked && radRedSecond.Checked))
        this.BackColor = System.Drawing.Color.Orange;
    else if ((radBlueFirst.Checked && radYellowSecond.Checked) ||
        (radYellowFirst.Checked && radBlueSecond.Checked))
        this.BackColor = System.Drawing.Color.Green;
}

我可以做些什么来解决这个问题?
我试过使用Panel,但我不太了解它们的工作原理。

8xiog9wr

8xiog9wr1#

Winforms的好处是,你几乎总是可以继承一个标准控件来制作一个具有你想要的功能的自定义版本。诀窍是尝试用一种不会颠覆预期行为的方式来做,以免用户在UI不符合他们的心理模型1时感到沮丧。
也就是说,如果你"确定“你想这样做,我不会妨碍你,但必须“坚持”按住**[Control]修饰键进行单击,以符合在多选可用时访问多选的约定。
有了这个免责声明,这个RadioButtonMulti类就可以在设计器文件中被换出。
x1c 0d1x Control +单击可多选。
查看文档here中RadioButton的默认行为。
通过在容器(如Panel控件、GroupBox控件或窗体)中绘制单选按钮,可以对它们进行分组。直接添加到窗体中的所有单选按钮都将成为一个组。
这告诉了我们需要做什么!
我们需要暂时让被单击的按钮“认为”它不属于任何组。
下面是一种方法,当tested切换Checked状态时,它会从Parent.Controls集合中移除该控件。

class RadioButtonMulti : RadioButton
{
    protected override void OnMouseDown(MouseEventArgs mevent)
    {
        if(ModifierKeys.Equals(Keys.Control))
        {
            var parentB4 = Parent;
            try
            {
                parentB4.Controls.Remove(this);
                Checked = !Checked;
            }
            finally
            {
                parentB4.Controls.Add(this);
            }
        }
        else
        {
            var others =
                Parent.Controls
                .Cast<Control>()
                .Where(_ => _ is RadioButtonMulti)
                .Where(_ => !ReferenceEquals(_, this));
            foreach (RadioButtonMulti other in others)
            {
                other.Checked = false;
            }
            base.OnMouseDown(mevent);
        }
    }

在主窗体标题栏中显示选定内容,仅用于演示目的。

protected override void OnMouseUp(MouseEventArgs mevent)
    {
        base.OnMouseUp(mevent);
        if(Form.ActiveForm != null)
        {
            var group =
                Parent.Controls
                .Cast<Control>()
                .Where(_ => _ is RadioButtonMulti)
                .Where(_ => ((RadioButtonMulti)_).Checked);
            Form.ActiveForm.Text = string.Join(", ", group.Select(_ => _.Text));
        }
    }
}

1.另请参见Mental Models and Computer Models第11-12页。

mbjcgjjk

mbjcgjjk2#

不应选择多个单选按钮。只应选择一个。
您应该考虑使用复选框代替,因为这将解决您的问题。:)

相关问题