Отправьте События клавиатуры от одной Формы до другой Формы

мой вопрос довольно прост:

Наше приложение C# имеет один MainForm с меню и несколько сочетаний клавиш, связанных с записями меню.

Теперь мы должны инициировать записи меню от некоторых дочерних форм также. Но так как MainForm неактивен, когда одна из дочерних форм активна, ярлыки не работают.

Существует ли простой способ распространить все события клавиатуры от дочерней формы до формы 'Владельца'? Или только к другой форме в целом?

А-ч, и мы не можем использовать некоторый низкоуровневый материал окон, потому что мы должны запустить приложение на Моно / Linux также.

Править: Точная проблема, которую я имею, состоит в том, чтобы инициировать пункты меню с тем же ярлыком от другой формы. Конечно, не обновляя код в формах, если изменения меню новых объектов добавляются.

5
задан thalm 6 June 2010 в 18:18
поделиться

6 ответов

Свойство ToolStrip.AllowMerge «получает или устанавливает [...], будет ли несколько MenuStrip , ToolStripDropDownMenu , ToolStripMenuItem и другие типы можно комбинировать ». (MSDN).

Это означает, что вы можете:

«Использовать свойство AllowMerge, чтобы разрешить дочерним элементам многодокументного интерфейса (MDI) объединять свои соответствующие меню в родительском MDI». (Свойство AllowMerge, Remark, MSDN)

См. Также:

  1. MergeAction
  2. MergeIndex

Это, я надеюсь, поможет вам получить то, что вы хотите. Я не знаю, подходит ли это для Windows Forms или он будет работать и в Linux после сборки.

0
ответ дан 15 December 2019 в 06:17
поделиться

Я думаю, вы хотите установить для KeyPreview в родительской форме значение true

. Если для этого свойства установлено значение true, форма будет получать все события KeyPress, KeyDown и KeyUp. После того, как обработчики событий формы завершили обработку нажатия клавиши, нажатие клавиши назначается элементу управления с фокусом. Например, если для свойства KeyPreview установлено значение true и текущий выбранный элемент управления является TextBox, после того, как нажатие клавиши будет обработано обработчиками событий формы, элемент управления TextBox получит нажатую клавишу. Чтобы обрабатывать события клавиатуры только на уровне формы и не разрешать элементам управления получать события клавиатуры, установите для свойства KeyPressEventArgs.Handled в обработчике событий KeyPress вашей формы значение true.

РЕДАКТИРОВАТЬ:

ответ в этот вопрос может быть полезным:

0
ответ дан 15 December 2019 в 06:17
поделиться

Вы пробовали что-то подобное?

ParentForm : Form
{
    public NotifyKeyPress(KeyPressEventArgs e)
    {
         OnKeyPress(e);
    }
}

ChildForm : Form
{
    ParentForm _parent;
    public ChildForm(ParentForm parent)
    {
       _parent = parent;
       KeyPress += KeyPressHandler;
    }

    public KeyPressHandler(object sender, KeyPressEventArgs e)
    {
       if (_parent != null)
       {
           _parent.NotifyKeyPress(e);
       } 
    }
}
1
ответ дан 15 December 2019 в 06:17
поделиться

Я полагаю, что под словом «неактивный» вы подразумеваете, что у него нет фокуса?

Самый простой способ сделать это - сделать так, чтобы каждая форма отображала события, которые относятся к их меню, которым управляют. Когда вы создаете формы, подписывайте их друг на друга (или от дочернего к MainForm или в любом другом направлении, в котором должен идти поток). При щелчке по меню выполните дополнительное событие, и другая форма получит его.

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

Более «отстраненный от проблем» подход: нужны ли вам две формы или вы можете провести рефакторинг дизайна пользовательского интерфейса?

0
ответ дан 15 December 2019 в 06:17
поделиться

Есть гораздо более простой способ сделать это. Пункты меню должны вызывать соответствующие методы. Затем вы можете вызывать эти методы в любом месте приложения.

0
ответ дан 15 December 2019 в 06:17
поделиться

Вместо привязки сочетаний клавиш к пунктам меню на главной форме вы можете создать пользовательский метод обработки клавиш, который реагирует на сочетания клавиш. Поместите этот метод в главную форму. Затем вызывайте этот метод из всех дочерних форм по событию нажатия клавиши. Код @Adam Driscoll во многом совместим с этим подходом.

0
ответ дан 15 December 2019 в 06:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: