Недостаток установки Form. KeyPreview = верный?

Интересно что Форма. Свойство KeyPreview на самом деле хорошо для? Почему это существует и чем я "рискую" путем установки его на истинный? Я предполагаю, что это должно иметь некоторый отрицательный эффект - иначе это не должно существовать вообще (или по крайней мере быть верно по умолчанию)?

Править: Я знаю отлично, что это делает. Я спрашиваю почему. Почему я должен установить его на истинный для создания огня событий клавиатуры? Почему события клавиатуры не всегда стреляют для формы. Что не просто что стандартное поведение?

Конкретная причина, которую я спрашиваю: Я только что установил KeyPreview = верный в основной форме моего приложения, которому наследовались все другие формы. Я нахожусь в для противного удивления?

25
задан Dan Byström 5 March 2010 в 12:56
поделиться

2 ответа

Form.KeyPreview - это своего рода анахронизм, унаследованный от объектной модели Visual Basic для проектирования форм. Еще во времена VB6 вам требовалось KeyPreview , чтобы иметь возможность реализовывать быстрые нажатия клавиш. Это больше не нужно в Windows Forms, переопределение ProcessCmdKey () является лучшим решением:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
  if (keyData == (Keys.Control | Keys.F)) {
    DoSomething();   // Implement the Ctrl+F short-cut keystroke
    return true;     // This keystroke was handled, don't pass to the control with the focus
  }
  return base.ProcessCmdKey(ref msg, keyData);
}

Но KeyPreview был поддержан, чтобы помочь легиону программистов VB6 перейти на .NET. еще в начале 2000-х. Задача KeyPreview или ProcessCmdKey () - позволить вашему пользовательскому интерфейсу реагировать на нажатия клавиш быстрого доступа. Сообщения клавиатуры обычно отправляются элементу управления, имеющему фокус.Цикл сообщений Windows Forms позволяет коду просмотреть это сообщение до того, как его увидит элемент управления. Это важно для клавиш быстрого доступа, реализация события KeyDown для каждого элемента управления , который может получить фокус для их обнаружения, очень непрактична.

Установка для KeyPreview значения True не вызывает проблем. Событие формы KeyDown будет запущено, оно повлияет только на то, если в нем есть код, который что-то делает с нажатием клавиши. Но будьте осторожны, чтобы он внимательно следил за использованием VB6, вы не можете увидеть, какие нажатия клавиш используются для навигации. Подобно клавишам курсора и Tab , Escape и Введите для диалогового окна. Нет проблем с ProcessCmdKey () .

66
ответ дан 28 November 2019 в 18:04
поделиться

Из MSDN

Если для этого свойства установлено значение true, форма будет получать все события KeyPress, KeyDown и KeyUp. После того, как обработчики событий формы завершили обработку нажатия клавиши, нажатие клавиши назначается элементу управления с фокусом. Например, если для свойства KeyPreview установлено значение true , а текущий выбранный элемент управления является TextBox, после нажатия клавиши обрабатываются обработчики событий форма элемента управления TextBox получит нажатую клавишу. Чтобы обрабатывать события клавиатуры только на уровне формы и не разрешать элементам управления получать события клавиатуры, установите свойство KeyPressEventArgs.Handled в обработчик события KeyPress вашей формы на true.

Вы можете использовать это свойство для обработки большинства нажатий клавиш в вашем приложении и либо для обработки нажатия клавиши, либо для вызова соответствующего элемента управления для обработки нажатия клавиши. Например, когда приложение использует функциональные клавиши, вы можете обрабатывать нажатия клавиш на уровне формы, а не писать код для каждого элемента управления, который может получать события нажатия клавиш.

Обычно, когда вы устанавливаете значение true, ваша форма может обрабатывать ключевые события, а также элементы управления.

Например, пользователь нажимает клавишу K, вызываются обработчики событий форм (Key Down, Key Up, Key Pressed), а затем вызываются обработчики событий текущего активного элемента управления.

РЕДАКТИРОВАТЬ : Нет никаких недостатков или неприятных сюрпризов. Единственное, о чем я могу думать, - это очень крошечное снижение производительности, так как необходимо проверять дескрипторы событий в форме для каждого KeyDown, KeyUp, KeyPressed.Кроме того, если вы не добавляете обработчики событий в форму и не делаете что-то, что может вызвать проблемы. ты в полном порядке. Если вам не нужно глобально обрабатывать ключевые события, за исключением элементов управления, я бы посоветовал вам оставить это как false, чтобы предотвратить дополнительные проверки. На современных ПК это не имело бы видимой разницы.

4
ответ дан 28 November 2019 в 18:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: