Как получить событие KeyDown для запуска в пользовательском элементе управления контейнера? - PullRequest
2 голосов
/ 04 января 2010

У меня есть пользовательский контейнерный элемент управления (производный от FlowLayoutPanel), который содержит ноль или более дочерних элементов управления, перетаскиваемых туда пользователем. При нажатии дочернего элемента управления он «выбран». (Он нарисован с цветной рамкой и доступны варианты для изменения его свойств.)

Я бы хотел обработать клавишу 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);
    }
}

Ответы [ 2 ]

2 голосов
/ 04 января 2010

Событие KeyDown указано как несущественное для элемента управления FlowLayoutPanel в MSDN. Предложите в качестве альтернативы событие PreviewKeyDown .

1 голос
/ 04 января 2010

Возможно ли, что предметы, перетаскиваемые в контейнер, получают событие?

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

...