2010-01-04 4 views
2

У меня есть пользовательский элемент управления контейнером (полученный от 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); 
    } 
} 

ответ

1

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

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

+0

Спасибо за ответ. Это привело меня к решению. Детский контроль также не смог получить фокус, поэтому не было никакого способа сказать: «Эй, сейчас у меня есть фокус!» в рамках всей моей контрольной иерархии. Я просто сделал Control.Select() в переопределении метода OnMouseDown для моих дочерних элементов управления. Тогда я мог бы обработать событие OnKeyDown прямо там. Если бы мне пришлось обрабатывать его в контейнере, я мог бы сделать то, что вы предлагаете, или переопределить метод ProcessKeyPreview, последний из которых был похож на боль. :) –

2

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

+0

Спасибо за предложение. Событие PreviewKeyDown также не срабатывало в моем сценарии. Поскольку я продолжал играть с этим, я понял, что мой вопрос выше, возможно, был слишком упрощенным. Мой контейнерный контроль размещен в UserControl, и это, похоже, еще более усложняет жизнь. –