C # препятствует тому, чтобы клавиша Delete на пользовательском виджете вызывала ярлык в меню - PullRequest
0 голосов
/ 20 июня 2009

В настольном приложении C # у меня есть виджет клиента, который содержит текстовое поле. У меня также есть пункт меню в полосе меню, в качестве клавиши быстрого доступа которого используется клавиша Delete. Поведение, которое я обнаружил, заключается в том, что нажатие на кнопку «Удалить» в текстовом поле, которое пользователь ожидает удалить символ, фактически вызывает пункт меню и удаляет весь объект, над которым он работает.

Можно ли как-нибудь разрешить текстовому полю "первый треск" при обработке нажатия клавиши, а не пункта меню?

Спасибо.

Ответы [ 4 ]

1 голос
/ 26 июня 2009

Что мы сделали

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

Это решило проблему, когда нажатие кнопки «Удалить» в несвязанном текстовом поле удаляет выбранный элемент в главном виджете. Однако это создает проблему, заключающуюся в том, что пользователь должен щелкнуть основной виджет, чтобы получить доступ к этим пунктам меню. Чтобы немного противостоять этому, я сделал так, чтобы основной виджет снова фокусировался, когда панель со скрываемыми виджетами скрыта.

Я не защищаю это решение, просто включаю его для полноты.

Что бы мне понравилось

Мое окончательное решение - выполнять действие только в том случае, если:

  1. основной виджет имеет фокус, ИЛИ
  2. четное срабатывание при нажатии на пункт меню

но, похоже, нет способа определить, была ли активирована четная клавиша в рамке.

1 голос
/ 20 июня 2009

Вы обрабатываете ключ удаления на уровне формы? В любом случае, вы можете проверить, что виджет имеет фокус, а затем не обрабатывать событие. Еще лучше было бы не использовать delete как глобальный ярлык, это похоже на переназначение функций ctrl + c, alt + f4 или tab.

1 голос
/ 20 июня 2009

Я бы поменял комбинацию клавиш вашего пункта меню «Удалить все» на Shift-Del или Ctrl-Del ... или что-то, что заставляет пользователя немного больше удалять весь объект.

Если это не вариант, вы можете проверить ActiveControl формы в коде удаления MenuStrip и, если это ваш TextBox, проверить значение Textbox.SelectionStart, чтобы получить позицию курсора в тексте и вручную удалить символ:

if (myTextBox.Text.Length() >0) {
  int pos = myTextBox.SelectionStart;
  string txt = myTextBox.Text;
  if (pos < txt.Length()) {
     myTextBox.Text = txt.Substring(0,txt.Substring(0, pos-1) + txt.substring(pos+1);
  }
}
0 голосов
/ 20 июня 2009

Установите для KeyPreview значение False в форме.

Виджет клиента может включать его, поэтому вам может потребоваться отключить KeyPreview в форме, когда текстовое поле получает фокус (и повторно включить его, когда оно теряет фокус).

В противном случае отключение его из конструктора должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...