【问题标题】:ToggleButton in C# WinFormsC# WinForms 中的切换按钮
【发布时间】:2010-09-21 21:06:50
【问题描述】:

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

【问题讨论】:

    标签: c# winforms button


    【解决方案1】:

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

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

    【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 然而,当未选中该框时,它会变平。
    • 在我的机器上未选中时它会升起,当在我的机器上选中时它会下沉(Vista 看起来像 Win 2000 - Windows Classic 主题)。
    • 你是对的!我不小心把它放在了 Popup 上。我的错。
    • 如果按钮是互斥的,你也可以用 RadioButton 做同样的事情。
    【解决方案3】:

    thers 是一种创建切换按钮的简单方法。我在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;
    
        }
    

    【讨论】:

    • 它不是控件。你如何将它嵌入到 GUI 中?
    • 您可以在工具条中使用它。
    【解决方案4】:

    这个怎么样?

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

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

    希望这会有所帮助;)

    【讨论】:

      【解决方案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";
              }
          }
      

      【讨论】:

      • 这不是一个糟糕的答案,确保复选框可以显示为按钮,但是复选框有限制(不能设置独立于文本大小的自定义大小),所以赞成。
      • 我喜欢这个想法,但控件的视觉位置不清楚。玩弄符号甚至图像以获得我想要的效果。
      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

        当我的按钮的 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 抱歉重复发帖。

        【讨论】:

          【解决方案8】:

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

          【讨论】:

            【解决方案9】:

            我最终覆盖了 OnPaint 和 OnBackgroundPaint 事件,并完全按照我的需要手动绘制按钮。效果很好。

            【讨论】:

            【解决方案10】:

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

            private void Protection_ON_OFF_Button_Click(object sender, EventArgs e)
                    {
            
                        if (FolderAddButton.Enabled == true)
                        {
                            FolderAddButton.Enabled = false;
                        }
                        else
                        {
                            FolderAddButton.Enabled = true;
                        }
                    }
            

            【讨论】:

              【解决方案11】:

              将 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 全天候使用,我认为这很有帮助。重要的是,当应用程序的进程结束并再次运行时,count 将重置为 1。

              【讨论】:

              • 为什么不直接使用布尔标志呢? currentlyVisible = !currentlyVisible; if(currentlyVisible) { settingsPanel.Show(); } ...
              猜你喜欢
              • 2011-06-04
              • 2016-08-06
              • 2014-04-25
              • 2021-06-17
              • 1970-01-01
              • 2017-05-21
              • 1970-01-01
              • 1970-01-01
              • 2019-12-01
              相关资源
              最近更新 更多