У меня есть пользовательский элемент управления контейнером (полученный от FlowLayoutPanel
), который содержит ноль или более дочерних элементов управления, перетаскиваемых туда пользователем. Когда щелкнут дочерний элемент управления, он «выбран». (Он нарисован с цветной рамкой и доступны опции для изменения его свойств.)Как получить событие KeyDown для запуска в пользовательском контейнере?
Я хотел бы обработать ключ Delete
так, чтобы, если пользователь в настоящее время работает в управлении контейнером (щелкнув внутри элемента управления или на например, дочерний элемент управления), текущий выбранный элемент управления (если он есть) удаляется.
У меня уже есть функция удаления, работающая с использованием контекстного меню контекстного меню для дочерних элементов. Моя проблема связана с ключом Delete
. Я не могу понять, как получить событие KeyDown для повышения в моем контейнере. Я знаю, что это имеет какое-то отношение к фокусу, так что нужно называть Control.Select()
(или его эквивалент), но каков наилучший способ сделать это? Где находится эта логика фокуса? Или есть лучший способ?
Я не хочу обрабатывать событие KeyDown
в форме, а затем вынюхивать, где находится фокус. Это повторно используемое управление контейнером, и я хочу, чтобы там находилась логика.
Что мне нужно сделать, чтобы получить событие KeyDown
для запуска пользовательского элемента управления?
public class MyContainer : FlowLayoutPanel
{
protected override void OnKeyDown(KeyEventArgs e)
{
if (e.KeyCode == Keys.Delete)
{
MessageBox.Show("How do I get here?");
e.Handled = true;
}
base.OnKeyDown(e);
}
}
Спасибо за ответ. Это привело меня к решению. Детский контроль также не смог получить фокус, поэтому не было никакого способа сказать: «Эй, сейчас у меня есть фокус!» в рамках всей моей контрольной иерархии. Я просто сделал Control.Select() в переопределении метода OnMouseDown для моих дочерних элементов управления. Тогда я мог бы обработать событие OnKeyDown прямо там. Если бы мне пришлось обрабатывать его в контейнере, я мог бы сделать то, что вы предлагаете, или переопределить метод ProcessKeyPreview, последний из которых был похож на боль. :) –