禁用/启用表单时,ToolStripButton仍会突出显示

时间:2016-11-28 18:47:29

标签: c# forms winforms toolstrip toolstripbutton

我有一个WinForms应用程序,其中包含带有ToolStripButtons的ToolStrip。某些按钮操作会在按钮操作发生时禁用主窗体,并在完成时重新启用它。这样做是为了确保用户在操作发生时不会点击其他位置,并且还显示WaitCursor,但这与问题无关。

如果用户单击按钮并在禁用表单时将鼠标光标移动到其边界之外,则即使在稍后重新启用表单时,该按钮仍会突出显示(透明蓝色)。如果鼠标在之后进入/离开按钮,则会再次正确显示。

我可以通过使用以下代码显示MessageBox来人工复制问题(实际操作不显示消息框,但打开新表单并填充网格,但净效果相同)。

以下是复制问题的代码段:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void toolStripButton1_Click(object sender, EventArgs e)
    {
        // Disable the form
        Enabled = false; 

        // Some action where the user moved the mouse cursor to a different location
        MessageBox.Show(this, "Message");

        // Re-enable the form
        Enabled= true; 
    }
}

1 个答案:

答案 0 :(得分:3)

我终于找到了解决方案。

我创建了这个扩展方法,它使用反射来调用父工具条上的私有方法“ClearAllSelections”:

    public static void ClearAllSelections(this ToolStrip toolStrip)
    {
        // Call private method using reflection
        MethodInfo method = typeof(ToolStrip).GetMethod("ClearAllSelections", BindingFlags.NonPublic | BindingFlags.Instance);
        method.Invoke(toolStrip, null);
    }

并在重新启用表单后调用它:

private void toolStripButton1_Click(object sender, EventArgs e)
{
    // Disable the form
    Enabled = false; 

    // Some action where the user moved the mouse cursor to a different location
    MessageBox.Show(this, "Message");

    // Re-enable the form
    Enabled= true;

    // Hack to clear the button highlight
    toolStrip1.ClearAllSelections();
}