Я не пробовал это, и я думаю, что это тяжело, зависит от всех дочерних элементов управления, которые находятся в вашем UserControl.Но обычно нажатие клавиши дается фактическому контролю, который имеет фокус.Если он не обрабатывает это нажатие клавиши (установка e.Handled = true
), он будет пузыриться до своего родителя, а если он не обрабатывает его, он будет идти дальше, пока не достигнет формы и, наконец, лимба.
Так что, если ваши дочерние элементы управления написаны правильно, и они не могут обрабатывать данное нажатие клавиши (например, Control + C ), должно быть легко добавить обработчик в ваш UserControl кKeyDown
событие и делайте все, что вам нравится.
Обновление
После прочтения ваших комментариев я все же думаю, что путь, показанный Энрико и мной, должен быть правильным,Поэтому я думаю, что проблема заключается в том, что если один из ваших сторонних элементов управления имеет фокус, он не может обработать ярлык копирования, но он устанавливает e.Handled = true
, что приводит к отсутствию дополнительной информации родительских элементов управления о ярлыке.
Итак, сначала вы должны связаться со своим контрольным поставщиком и отправить ему сообщение об ошибке об этом неправильном поведении.
Альтернативно существует другой хакерский способ:
В вашей форме вы можетеустановите KeyPreview
в true и перехватите входящий ключ.Теперь вы можете проверить, является ли в ActiveControl
что-то, что правильно обрабатывает ярлык (может быть, проверка на Dictionary<Type, bool>
или HashSet<Type> lackingControls
), и просто выйти из функции или сделать то, что вы хотите, и установитьe.Handled = true
самостоятельно.
Обновление 2
Небольшой фрагмент, чтобы проиллюстрировать, что я имел в виду:
this.KeyPreview = true;
HashSet<Type> scrappyControls = new HashSet<Type>();
//ToDo: Add all controls that say it handles Ctrl-C
// but doesn't it the right way.
scrappyControls.Add(typeof(TextBox));
this.KeyDown += (sender, e) =>
{
if (e.KeyData == (Keys.Control | Keys.C))
{
if (scrappyControls.Contains(this.ActiveControl.GetType()))
{
//ToDo: Do copy to clipboard on yourself
e.Handled = true;
}
}
};
Недостаток этой функции в том, что она должна бытьпомещается в вашу форму, а не в самописанный UserControl.Но таким образом вы будете проинформированы, когда TextBox имеет фокус и внутри него нажата Control + C .