78

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

4

11 回答 11

159

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

CheckBox checkBox = new System.Windows.Forms.CheckBox(); 
checkBox.Appearance = System.Windows.Forms.Appearance.Button; 
于 2010-09-23T09:21:57.133 回答
11

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

于 2008-11-11T21:10:14.120 回答
5

这是一种创建切换按钮的简单方法。我在vs2010中测试它。这是完美的。

ToolStripButton 具有“Checked”属性和“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;

    }
于 2011-12-10T14:52:06.357 回答
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!

希望这可以帮助 ;)

于 2015-08-21T12:52:27.363 回答
5

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

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";
        }
    }
于 2017-07-22T18:13:21.167 回答
4

如果您不介意将 ToolStripButton 控件托管在 ToolStripContainer 中,您也可以考虑使用它。我认为它可以原生支持按下和未按下状态。

于 2008-11-11T21:14:01.243 回答
3

当我的按钮的 FlatStyle 设置为 system 时,它看起来是扁平的。当它设置为弹出时,它只会在鼠标悬停时弹出。要么是我想要的。我希望它在选中时看起来是凹陷的,在未选中时看起来是凸起的,并且在鼠标悬停时没有变化(按钮实际上是一个复选框,但复选框的外观属性设置为按钮)。

我最终将 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 button with solid border, like 3d sorry for double 张贴。

于 2020-05-02T15:44:37.723 回答
0

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

于 2008-11-11T21:02:24.993 回答
0

我最终覆盖了 OnPaint 和 OnBackgroundPaint 事件并完全按照我的需要手动绘制按钮。它工作得很好。

于 2009-01-06T13:36:34.050 回答
0

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

private void Protection_ON_OFF_Button_Click(object sender, EventArgs e)
        {

            if (FolderAddButton.Enabled == true)
            {
                FolderAddButton.Enabled = false;
            }
            else
            {
                FolderAddButton.Enabled = true;
            }
        }
于 2017-03-01T07:47:46.083 回答
-2

将 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。

于 2013-12-26T14:37:30.603 回答