C# ToolStripButton";重置外观";/&引用;解雇假事件“;

C# ToolStripButton";重置外观";/&引用;解雇假事件“;,c#,.net,toolstrip,C#,.net,Toolstrip,我有一个执行操作的ToolStripButton。用户单击该按钮,该按钮将被禁用,以防止该操作被执行两次。操作完成后,按钮将重新启用。除了: 由于按钮被禁用,因此不会触发“MouseLeave”事件,因此按钮的外观不会更新。要绝对清楚,当鼠标进入ToolStripButton时,按钮以橙色高亮显示(默认情况下),周围有一个黑色框。当我重新启用按钮时,不会删除此突出显示。此时,鼠标光标早已离开控件。将鼠标悬停在按钮上,可以通过重新绘制按钮来自然修复按钮 我想做的是在ToolStripButton上

我有一个执行操作的ToolStripButton。用户单击该按钮,该按钮将被禁用,以防止该操作被执行两次。操作完成后,按钮将重新启用。除了:

由于按钮被禁用,因此不会触发“MouseLeave”事件,因此按钮的外观不会更新。要绝对清楚,当鼠标进入ToolStripButton时,按钮以橙色高亮显示(默认情况下),周围有一个黑色框。当我重新启用按钮时,不会删除此突出显示。此时,鼠标光标早已离开控件。将鼠标悬停在按钮上,可以通过重新绘制按钮来自然修复按钮

我想做的是在ToolStripButton上使用某种方法“重置”其外观。这样的方法甚至可能存在于ToolStrip上,但尽管搜索了一下,我还是找不到类似的东西

作为替代,我可以直接在按钮上触发“鼠标离开”事件。据我所知,在C#NET中没有容易做到这一点的方法

如果您能及时提供任何建议,我将不胜感激。当然,我不想撕毁我的应用程序并更换工具条。

更新: 我复制了你的问题,试图找出答案

除了在单击事件中重置样式之外,我没有其他更好的方法

    private void toolStripButton1_Click(object sender, EventArgs e)
    {
        toolStripButton1.BackColor = Color.FromKnownColor(KnownColor.Control);
        toolStripButton1.Enabled = false;
    }

    private void toolStripButton1_MouseEnter(object sender, EventArgs e)
    {
        toolStripButton1.BackColor = Color.Red;
    }

    private void toolStripButton1_MouseLeave(object sender, EventArgs e)
    {
        toolStripButton1.BackColor = Color.FromKnownColor(KnownColor.Control);
    }
希望这有帮助


您尝试过Control.Invalidate()吗

来自MSDN:使控件的整个表面无效,并导致控件重新绘制


我也有同样的问题。任务完成后,我通过隐藏ToolStrip按钮,然后使用Visible属性显示ToolStrip按钮来“修复”它。

禁用ToolStrip或ToolStripItem之前:

private void RemoveHighlightFromToolStrip(ToolStrip toolStrip)
        {
            foreach (ToolStripItem item in toolStrip.Items)
            {
                if (item.Pressed || item.Selected)
                {
                    item.Visible = false;
                    item.Visible = true;
                }
            }
        }

您也可以只隐藏和显示整个ToolStrip,但这可能会影响表单中的其他控件(即,如果您有一些停靠的DataGridView,它将被重新绘制)

我确实尝试了Control.Invalidate(),但重新绘制只是在“鼠标悬停”状态下重新绘制控件。具体的“操作”是什么?它会冻结用户界面吗?你真的看到按钮变成灰色了吗?