好的,覆盖在 ToolStripDropDownButton 上不起作用的原因是它不是具有焦点的组件。显示下拉菜单时,下拉菜单上的项目具有焦点,并且在显示下拉菜单时会触发 toolBoxButton 项目上的所有可用覆盖(ProcessCmdKey、ProcessDialogKey 等)。
最后,我为 ToolStrip 项本身(在本例中为复选框)和适应 ToolStripDropDownButton 创建了两个派生类。
public class EscapingToolStripCheckBox : CustomControls.ToolStripCheckBox
{
private EscapingToolStripDropDownButton _parent;
public EscapingToolStripCheckBox(EscapingToolStripDropDownButton parent)
: base()
{
_parent = parent;
}
protected override bool ProcessCmdKey(ref Message m, Keys keyData)
{
if (keyData == Keys.Enter)
{
_parent.HandleSelection(false);
return true;
}
else if (keyData == Keys.Escape)
{
_parent.HandleSelection(true);
return true;
}
// Dont need to execute HandleSelection under any other condition.
return base.ProcessCmdKey(ref m, keyData);
}
}
...其中 HandleSelection 采用布尔值来确定是否取消选择。
public void HandleSelection(bool selectionCancelled)
{
_selectionCancelled = selectionCancelled;
this.HideDropDown();
}
从那里,我可以轻松地检查属性(无论是在控件本身上还是作为事件参数的一部分),以确定 DropDownClosed 事件是否被视为已取消。