C#WinForms中的ToggleButton


73

是否可以在C#WinForms中创建切换按钮?我知道您可以使用CheckBox控件并将其Appearance属性设置为“ Button”,但是它看起来并不正确。我希望它在按下时看起来凹陷而不是平坦。有什么想法吗?

Answers:


149

您可以只使用aCheckBox并将其外观设置为Button

CheckBox checkBox = new System.Windows.Forms.CheckBox(); 
checkBox.Appearance = System.Windows.Forms.Appearance.Button; 


11

检查FlatStyle属性。将其设置为“系统”会使该复选框在我的环境中下沉。


1
但是,如果未选中该框,则将其放平。
杰森·唐

当未选中它时将它抬起,而在我的机器上将其选中时它会下沉(Vista看起来像Win 2000-Windows Classic主题)。
Stanislav Kniazev,

你是对的!我不小心在Popup上使用了该样式。我的错。
杰森·唐

1
如果按钮要互斥,则也可以使用RadioButton进行相同的操作。

5

thers是创建切换按钮的简单方法。我在vs2010中进行了测试。这是完美的。

ToolStripButton具有“已检查”属性和“ CheckOnClik”属性。您可以使用它作为切换按钮

tbtnCross.CheckOnClick = true;

要么

    tbtnCross.CheckOnClick = false;
    tbtnCross.Click += new EventHandler(tbtnCross_Click);
    .....

    void tbtnCross_Click(object sender, EventArgs e)
    {
        ToolStripButton target = sender as ToolStripButton;
        target.Checked = !target.Checked;
    }

另外,您可以创建切换按钮列表,如下所示:

        private void Form1_Load(object sender, EventArgs e)
    {
        arrToolView[0] = tbtnCross;
        arrToolView[1] = tbtnLongtitude;
        arrToolView[2] = tbtnTerrain;
        arrToolView[3] = tbtnResult;
        for (int i = 0; i<arrToolView.Length; i++)
        {
            arrToolView[i].CheckOnClick = false;
            arrToolView[i].Click += new EventHandler(tbtnView_Click);
        }
        InitTree();
    }

    void tbtnView_Click(object sender, EventArgs e)
    {
        ToolStripButton target = sender as ToolStripButton;
        if (target.Checked) return;
        foreach (ToolStripButton btn in arrToolView)
        {
                btn.Checked = false;
                //btn.CheckState = CheckState.Unchecked;
        }
        target.Checked = true;
        target.CheckState = CheckState.Checked;

    }

这不是控件。您如何将其嵌入GUI?
Bitterblue 2014年

您可以在工具栏中使用它。
legendJSLC 2015年

5

这个怎么样?

假设您已引用System.Windows.Forms。

var cbtnToggler = new CheckBox();
cbtnToggler.Appearance = Appearance.Button;
cbtnToggler.TextAlign = ContentAlignment.MiddleCenter;
cbtnToggler.MinimumSize = new Size(75, 25); //To prevent shrinkage!

希望这可以帮助 ;)


4

如果您不介意将其托管在ToolStripContainer中,则也可以考虑使用ToolStripButton控件。我认为它可以本地支持受压状态和不受压状态。


4

这是我的简单代码,希望对您有所帮助

private void button2_Click(object sender, EventArgs e)
    {
        if (button2.Text == "ON")
        {
            panel_light.BackColor = Color.Yellow; //symbolizes light turned on

            button2.Text = "OFF";
        }

        else if (button2.Text == "OFF")
        {
            panel_light.BackColor = Color.Black; //symbolizes light turned off

            button2.Text = "ON";
        }
    }

这不是一个坏答案,请确保复选框可以显示为按钮,但是复选框具有局限性(不能设置独立于文本大小的自定义大小),因此请赞成。
user3800527

我喜欢这个主意,但控件的视觉位置尚不清楚。玩弄符号甚至图像以获得我想要的效果。
j.hull

2

当我的按钮的FlatStyle设置为system时,它看起来很平坦。并且将其设置为弹出时,仅在鼠标悬停时才弹出。要么就是我想要的。我希望它在选中时看起来凹陷,而在未选中时凸起,并且在鼠标悬停时保持不变(该按钮实际上是一个复选框,但是该复选框的外观属性设置为button)。

我最终将FlatStyle设置为flat并编写了一个新的Paint事件处理程序。

 private void checkbox_paint(object sender, PaintEventArgs e)
        {
            CheckBox myCheckbox = (CheckBox)sender;
            Rectangle borderRectangle = myCheckbox.ClientRectangle;
            if (myCheckbox.Checked)
            {
                ControlPaint.DrawBorder3D(e.Graphics, borderRectangle,
                    Border3DStyle.Sunken);
            }
            else
            {
                ControlPaint.DrawBorder3D(e.Graphics, borderRectangle,
                    Border3DStyle.Raised);
            }
        }

对于这个问题,我给出了类似的答案: 带有纯边框的C#winforms按钮,例如3d 对不起,可能会重复发布。


0

您始终可以使用自定义图形和PictureBox对自己的按钮进行编码,尽管它不一定与用户的Windows主题匹配。



0

使用if命令检查状态并让其作为切换按钮

private void Protection_ON_OFF_Button_Click(object sender, EventArgs e)
        {

            if (FolderAddButton.Enabled == true)
            {
                FolderAddButton.Enabled = false;
            }
            else
            {
                FolderAddButton.Enabled = true;
            }
        }

-1

将CheckBox外观更改为Button将使您难以调整。您无法更改其尺寸,因为其尺寸取决于文本或图像的尺寸。

您可以尝试以下操作:(首先将count变量初始化为1 | int count = 1)

private void settingsBtn_Click(object sender, EventArgs e)
    {
        count++;

        if (count % 2 == 0)
        {
            settingsPanel.Show();
        }
        else
        {
            settingsPanel.Hide();
        }
    }

这很简单,但是有效。

警告:这将与偶尔使用的按钮(即设置)一起使用时效果很好,如果使用的int / long计数值超过其容量,而未关闭应用程序进程,则该计数值可能会过载。(检查数据类型范围:http : //msdn.microsoft.com/en-us/library/s3f49ktz.aspx

好消息:如果您运行的应用程序并非全年24/7全天候使用,那么我认为这会有所帮助。重要的是,当应用程序的进程结束并再次运行时,计数将重置为1。


2
为什么不只使用布尔标志?currentlyVisible = !currentlyVisible; if(currentlyVisible) { settingsPanel.Show(); } ...
塞巴斯蒂安·内格拉苏斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.