Передача KeyEventHandler в дочернюю форму
Цитата: Alex от 24.03.2023, 13:06Всем привет.
Подскажите такую штуку...
В основной форме(MainForm) есть панель. В ней открывается дочерняя форма(ChildForm) со своими событиями(события повешаны на таймер и на PictureBox, а также присутствуют события обработки нажатия и отпускания кнопки KeyUp и KeyDown).
При клике на кнопку, что расположена на MainForm - открывается ChildForm и располагается в панели. Все обработчики событий работают, кроме KeyUp и KeyDown. Как можно их активировать?
Возможно мой подход совсем не правильный, но я делал так:ChildForm cf = new ChildForm() { Dock = DockStile.Fill, TopLevel = false, Autoscroll = true }; PanelMainForm.Controls.Add(cf); cf.Show();И все бы хорошо, но события KeyUp и KeyDown не срабатывают. Теоретически я понимаю, что эти события нужно перехватывать в MainForm и транслировать их в события ChildForm, но никак не могу понять как это сделать, или в какую сторону копать. Подскажите кто чем может, или направьте в нужном направлении пожалуйста, возможно мой подход в корне не верен и нужно всю логику контролов ChildForm создавать в основном коде а обработчики событий создавать динамически. Заранее Благодарен.
Всем привет.
Подскажите такую штуку...
В основной форме(MainForm) есть панель. В ней открывается дочерняя форма(ChildForm) со своими событиями(события повешаны на таймер и на PictureBox, а также присутствуют события обработки нажатия и отпускания кнопки KeyUp и KeyDown).
При клике на кнопку, что расположена на MainForm - открывается ChildForm и располагается в панели. Все обработчики событий работают, кроме KeyUp и KeyDown. Как можно их активировать?
Возможно мой подход совсем не правильный, но я делал так:
ChildForm cf = new ChildForm()
{
Dock = DockStile.Fill,
TopLevel = false,
Autoscroll = true
};
PanelMainForm.Controls.Add(cf);
cf.Show();
И все бы хорошо, но события KeyUp и KeyDown не срабатывают. Теоретически я понимаю, что эти события нужно перехватывать в MainForm и транслировать их в события ChildForm, но никак не могу понять как это сделать, или в какую сторону копать. Подскажите кто чем может, или направьте в нужном направлении пожалуйста, возможно мой подход в корне не верен и нужно всю логику контролов ChildForm создавать в основном коде а обработчики событий создавать динамически. Заранее Благодарен.
Цитата: Alex от 24.03.2023, 14:02Оно должно быть включено в дочерней, или в главной форме?
Оно должно быть включено в дочерней, или в главной форме?
Цитата: Aleksey от 24.03.2023, 14:04В основной форме, где у Вас обработчики (KeyUp и KeyDown)
В основной форме, где у Вас обработчики (KeyUp и KeyDown)
Цитата: Alex от 24.03.2023, 14:06Обработчики у меня в дочерней форме.
Обработчики у меня в дочерней форме.
Цитата: Aleksey от 24.03.2023, 14:14Значит пробуйте в дочерней форме, или в коде в лоад формы прописать KeyPreview = true;
или на самой форме, зайти в свойства и найти KeyPreview и поставить у нее true
Значит пробуйте в дочерней форме, или в коде в лоад формы прописать KeyPreview = true;
или на самой форме, зайти в свойства и найти KeyPreview и поставить у нее true
Цитата: Alex от 24.03.2023, 16:50Спасибо большое. Копнул в этом направлении и выяснил, что я пытаюсь обрабатывать стрелки и как оказалось по умолчанию стрелками переключаются фокусы контролов на форме, не смотря на KeyPreview = true. Для того чтоб это обойти в событии PreviewKeyDown менял свойство IsInputKey = true.
Может кому пригодится, шаги следующие...
1)Создать метод для PreviewKeyDown//Этот метод находится в Главной форме private void control_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) { switch (e.KeyCode) { case Keys.Down: case Keys.Up: case Keys.Left: case Keys.Right: e.IsInputKey = true; break; default: break; } }2)В обработке на Главной форме, для показа дочерней формы делаю вызов следующим образом
private void Button_MouseClick(object sender, MouseEventArgs e) { ChildForm cf = new ChildForm() { Dock = DockStyle.Fill, TopLevel = false, AutoScroll = true, KeyPreview = true //На всякий случай добавил и это свойство }; cf.PreviewKeyDown += control_PreviewKeyDown; pnlMain.Controls.Add(cf); cf.Show(); cf.Focus(); }Вся остальная логика поведения дочерней форме осталась в дочерней форме.
Еще раз всем спасибо за направление.
Спасибо большое. Копнул в этом направлении и выяснил, что я пытаюсь обрабатывать стрелки и как оказалось по умолчанию стрелками переключаются фокусы контролов на форме, не смотря на KeyPreview = true. Для того чтоб это обойти в событии PreviewKeyDown менял свойство IsInputKey = true.
Может кому пригодится, шаги следующие...
1)Создать метод для PreviewKeyDown
//Этот метод находится в Главной форме
private void control_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
switch (e.KeyCode)
{
case Keys.Down:
case Keys.Up:
case Keys.Left:
case Keys.Right:
e.IsInputKey = true;
break;
default:
break;
}
}
2)В обработке на Главной форме, для показа дочерней формы делаю вызов следующим образом
private void Button_MouseClick(object sender, MouseEventArgs e)
{
ChildForm cf = new ChildForm()
{
Dock = DockStyle.Fill,
TopLevel = false,
AutoScroll = true,
KeyPreview = true //На всякий случай добавил и это свойство
};
cf.PreviewKeyDown += control_PreviewKeyDown;
pnlMain.Controls.Add(cf);
cf.Show();
cf.Focus();
}
Вся остальная логика поведения дочерней форме осталась в дочерней форме.
Еще раз всем спасибо за направление.
Цитата: Aleksey от 24.03.2023, 17:03Вы сделали вызов по нажатию MouseClick.
Можно ещё сделать, что бы не только мышкой, а на кнопке событие Click, но и при нажатии на кнопку Enter на клавиатуре, тоже работало
[spoiler title="можно в инициализацию код закинуть"]KeyPreview = true; KeyDown += (a, e) => { if (e.KeyValue == (char)Keys.Enter) { button1_Click(button1, null); } };
[/spoiler]
Вы сделали вызов по нажатию MouseClick.
Можно ещё сделать, что бы не только мышкой, а на кнопке событие Click, но и при нажатии на кнопку Enter на клавиатуре, тоже работало
KeyPreview = true;
KeyDown += (a, e) => { if (e.KeyValue == (char)Keys.Enter) { button1_Click(button1, null); } };