C# WinForms 中的切换按钮
Posted
技术标签:
【中文标题】C# WinForms 中的切换按钮【英文标题】:ToggleButton in C# WinForms 【发布时间】:2010-09-21 21:06:50 【问题描述】:是否可以在 C# WinForms 中创建切换按钮?我知道您可以使用 CheckBox 控件并将其 Appearance 属性设置为“Button”,但它看起来不正确。我希望它在按下时看起来是凹陷的,而不是平坦的。有什么想法吗?
【问题讨论】:
【参考方案1】:您可以只使用CheckBox
并将其外观设置为Button
:
CheckBox checkBox = new System.Windows.Forms.CheckBox();
checkBox.Appearance = System.Windows.Forms.Appearance.Button;
【讨论】:
使用archive.org link【参考方案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 事件,并完全按照我的需要手动绘制按钮。效果很好。
【讨论】:
codeproject.com/Tips/794577/Windows-Forms-ToggleButton 这是这样的代码.. 主题可能存在问题。虽然这可能比使用 Win32 互操作调用更安全。【参考方案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(); ...
以上是关于C# WinForms 中的切换按钮的主要内容,如果未能解决你的问题,请参考以下文章
C# Winforms 按钮到 Windows 中的特定屏幕
可能是一个愚蠢的问题,但是如何设置 c# 按钮的标签? (winforms)
带有按钮、组合框和文本框的 C# WinForms (.NET Framework) DataGridView:使用按钮添加新行以添加组合框项时出错