Как предотвратить Enter нажмите от закрытия меню - PullRequest
2 голосов
/ 26 января 2011

Я встраиваю палитру цветов в контекстное меню, используя класс Windows.Forms.ToolStripControlHost. Средство выбора отображается нормально и правильно обрабатывает все события мыши:

enter image description here

Проблема возникает при двойном щелчке одного из ползунков каналов. Это заставляет элемент управления добавлять Windows.Forms.TextBox в родительский элемент управления с теми же размерами, что и ползунок, чтобы пользователи могли вводить числовые значения. Когда клавиша Enter нажата, когда текстовое поле имеет фокус, оно должно присвоить значение и скрыть текстовое поле (что оно и делает), но оно также закрывает всю структуру меню. Итак, как мне сохранить меню живым?

enter image description here

Там очень много кода, но я опубликую его, если нужно.

1 Ответ

1 голос
/ 26 января 2011

Так или иначе, вам нужно съесть нажатия Enter , прежде чем они достигнут вашего контекстного меню.Очевидно, что по умолчанию используется «выбор» выделенного в данный момент элемента, когда пользователь нажимает Enter , как и любой другой элемент управления меню, известный man.

Это можно сделать, создав подкласс ContextMenuStrip control (если вы этого еще не сделали) и переопределите его ProcessCmdKey метод .Следите за значением keyData, соответствующим Keys.Enter, и, когда вы обнаружите это значение, верните True, чтобы указать, что символ уже был обработан элементом управления, и предотвратите его передачу для дальнейшей обработки.Все остальное, конечно, вы позволите базовому классу обрабатывать, поэтому поведение других клавиш (например, клавиш со стрелками) не изменится.

Например (я только что проверил это, и он работает нормально):

public class CrazyContextMenuStrip : ContextMenuStrip
{
    protected override bool ProcessCmdKey(ref Message m, Keys keyData)
    {
        if (keyData == Keys.Enter)
        {
            // Eat it when the user presses Enter to
            // prevent the context menu from closing
            return true;
        }

        // Let the base class handle everything else
        return base.ProcessCmdKey(m, keyData);
    }
}

И, конечно, вы можете добавить дополнительные проверки к приведенному выше коду, чтобы нажатия клавиш Enter употреблялись только тогда, когда ваш палитра цветов виден, что позволяет всем работать должным образом.остальное время,

...