我们有一个允许用户“锁定”表单的按钮。不允许用户“解锁”表单,因此当按下时,我们希望禁用按钮,以便用户收到适当的视觉反馈。
但是,客户报告说灰色的“锁定”图标向他们表明表单未锁定,因此我们希望将按钮显示为按下状态,但图标为彩色,即使按钮被禁用。
我们如何做到这一点,以绝对最小数量的覆盖绘画?
我们有一个允许用户“锁定”表单的按钮。不允许用户“解锁”表单,因此当按下时,我们希望禁用按钮,以便用户收到适当的视觉反馈。
但是,客户报告说灰色的“锁定”图标向他们表明表单未锁定,因此我们希望将按钮显示为按下状态,但图标为彩色,即使按钮被禁用。
我们如何做到这一点,以绝对最小数量的覆盖绘画?
您可以设置ToolStripButton Image
为BackgroundImage
,然后设置DiplayStyle
为None
。
无论按钮Enabled
值是多少,图片都应保持颜色。
其实我不同意这种做法。您的客户可能有一个有效的观点,但我认为他们没有正确的修复建议。您应该研究使表单显示为“锁定”的其他方法。更改边框或字体颜色,出现大挂锁图标或从打开变为关闭等。按钮看起来有一定的方式,因为这是用户所期望的。如果你有一个禁用的按钮,看起来它可能已启用,这会让用户感到困惑,他们可能不明白为什么他们不能点击它。
几周前我遇到过这种情况,这个问题没有答案,所以这是我 4 年后的解决方案:
在许多情况下,我使用此解决方案重新绘制 ToolStripButton:禁用、选中、选中
两个帮助我的好例子:
工具条类:
ToolStrip ts = new ToolStrip();
//[...]
ts.RenderMode = ToolStripRenderMode.Professional; //Professional is just an example
ts.Renderer = new CustomRenderer();
自定义渲染器类:
public class CustomRenderer: ToolStripProfessionalRenderer
{
protected override void OnRenderButtonBackground(ToolStripItemRenderEventArgs e)
{
if (!e.Item.Enabled) //in this case you will just have the image in your button, you need to add text etc in this if
{
//to draw the image
Graphics g = e.Graphics;
g.DrawImageUnscaled(e.Item.Image, new Point(2, 2)); //you need to specify the correct position
}
else //other cases
base.OnRenderButtonBackground(e);
}
}
问题是要知道 ToolStripButton 中所有元素的正确位置,这就是我在每种情况下都绘制 ToolStripButton 的原因
另一种方式:根本不设置button.Enabled = false
。只需设置button.Checked = true
或false
和当有人点击按钮测试Checked
状态并做任何你做的事情。然后,该按钮将按照您的意愿运行并保持彩色。