Как вызвать событие уровня формы, когда пользовательский элемент управления имеет фокус? - PullRequest
1 голос
/ 27 марта 2019

У меня есть проект Windows Form C # / .Net.На нем есть форма с несколькими пользовательскими элементами управления.Каждый пользовательский элемент управления закреплен так, что он занимает всю форму.Когда нажата кнопка на одном пользовательском элементе управления, этот пользовательский элемент управления скрывается, и появляется другой.Это было сделано коллегой и находится в производстве и не может быть изменено (то есть я абсолютно не могу избавиться от пользовательских элементов управления и не могу изменить их, если в этом нет особой необходимости).Мне нужна панель (или, может быть, другой пользовательский элемент управления) в форме, которая может быть вызвана при каком-либо событии (например, при нажатии определенной комбинации клавиш, например, CTRL-Q).Однако, если я помещу событие KeyDown в форму, оно никогда не сработает, потому что один из пользовательских элементов управления всегда имеет фокус.Я мог бы разместить свою новую панель на каждом пользовательском элементе управления и иметь события KeyDown на каждом из них, но на самом деле я не должен менять существующие пользовательские элементы управления, и я не хочу, чтобы несколько экземпляров этой панели и несколько событий.Как вызвать событие уровня формы, когда фокус находится у одного из пользовательских элементов управления?

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

----------------------------------------------------------------------
| form1                                                              |
|                                                                    |
| ---------------------------------------------------------------    |
| | userControl1                                                |    |
| |                                                             |    |
| |                                                             |    |
| | --------------------------------------------------------    |    |
| | | userControl2                                         |    |    |
| | |                                                      |    |    |
| | |                                                      |    |    |
| | | --------------------------------------------------   |    |    |
| | | | userControl3                                    |  |    |    |
| | | |                                                 |  |    |    |
| | | ---------------------------------------------------  |    |    |
| | |                                                      |    |    |
| | --------------------------------------------------------    |    |
| |                                                             |    |
| ---------------------------------------------------------------    |
|                                                                    |
|                                                                    |
| ------------------------------------------------------------------ |
| | panel or user control on top of everything, visible on demand  | |
| ------------------------------------------------------------------ |
|                                                                    |
----------------------------------------------------------------------

Я хочу, чтобы это событие из формы Form1 запускалось независимо от того, какой пользовательский элемент управления активен:

    private void form1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Control && e.KeyCode == Keys.Q)
        {
            panel1.Visible = true;
        }
    }

1 Ответ

1 голос
/ 27 марта 2019

Если вы хотите использовать в форме события KeyDown или KeyUp, всегда убедитесь, что для свойства KeyPreview в форме установлено значение TRUE

.сначала убедитесь, что форма получает нажатие клавиши, прежде чем элементы управления сделают

См. также this

EDIT
Другой способ - прекратить использованиеKeyDown/KeyUp событие для этого и переопределите ProcessCmdKey в форме, как @Jimi предложил в своем комментарии

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    bool Result = true;

    if (keyData == Keys.Control | Keys.Q)
    {
         panel1.Visible = true;
    }
    else
    {
        Result = base.ProcessCmdKey(ref msg, keyData);
    }

    return Result;
}
...