ToolStripDropDownButton - изменение поведения выпадающего меню с помощью клавиши Esc - PullRequest
0 голосов
/ 20 декабря 2011

У меня есть пользовательский элемент управления с ToolStripDropDownButton.ToolStripDropDownButton имеет несколько элементов панели инструментов (в частности, настраиваемые элементы панели инструментов, которые являются флажками).Пользователь может выбрать, какие элементы флажков они хотят, и я обрабатываю событие DropDownClosed, а затем использую эти отмеченные элементы.

Цель состоит в том, чтобы пользователь отменил свой выбор, нажав клавишу выхода.Проблема в том, что событие DropDownClosed также запускается при нажатии клавиши Escape.Поэтому, когда пользователь выбирает параметры и хочет нажать Escape, чтобы отменить выбор, событие DropDownClosed запускается, и я в конечном итоге «применяю» эти настройки.

Я попытался поиграться со следующими переопределениями в элементе управленияразмещение ToolStripDropDownButton:

protected override bool ProcessCmdKey
protected override bool ProcessKeyPreview
protected override void WndProc

без особого успеха, так как раскрывающийся список скрывается до обработки любого из этих событий.Каков наилучший способ изменить это поведение?

Ответы [ 3 ]

2 голосов
/ 20 декабря 2011

Попробуйте использовать эту версию ToolStripDropDown, где она перехватывает клавишу Esc от закрытия выпадающего меню:

public class ToolStripDropDownEx : ToolStripDropDown {

  protected override bool ProcessDialogKey(Keys keyData) {
    if (keyData == Keys.Escape)
      return true;
    else
      return base.ProcessDialogKey(keyData);
  }
}
0 голосов
/ 28 декабря 2011

Хорошо, причина, по которой переопределения не работали с 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 отмененным или нет.

0 голосов
/ 20 декабря 2011

А как насчет событий KeyDown или KeyPressed? Надеемся, что по крайней мере один из них должен сработать до события DropDownClosed, а затем вы можете проверить, была ли нажата Escape, и установить флаг для обработчика DropDownClosed.

Редактировать: Если ProcessCmdKey или ProcessKeyPreview запущены после события DropDownClosed, вы можете создать задержку с таймером. DropDownClosed запускает таймер, а затем ProcessCmdKey или ProcessKeyPreview могут установить флаг, если нажата Escape. Когда таймер тикает, вы можете отменить или применить проверки, выполненные пользователем.

...