Хорошо, причина, по которой переопределения не работали с ToolStripDropDownButton, заключается в том, что фокус был не у компонента. элементы в раскрывающемся списке имели фокус при отображении раскрывающегося списка, и все доступные переопределения (ProcessCmdKey, ProcessDialogKey и т. Д.) Для элементов toolBoxButton запускаются при отображении раскрывающегося списка.
ВВ конце я создал два производных класса для самого элемента 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 отмененным или нет.