我有一个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;
}
}
答案 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();
}