мой вопрос довольно прост:
Наше приложение C# имеет один MainForm с меню и несколько сочетаний клавиш, связанных с записями меню.
Теперь мы должны инициировать записи меню от некоторых дочерних форм также. Но так как MainForm неактивен, когда одна из дочерних форм активна, ярлыки не работают.
Существует ли простой способ распространить все события клавиатуры от дочерней формы до формы 'Владельца'? Или только к другой форме в целом?
А-ч, и мы не можем использовать некоторый низкоуровневый материал окон, потому что мы должны запустить приложение на Моно / Linux также.
Править: Точная проблема, которую я имею, состоит в том, чтобы инициировать пункты меню с тем же ярлыком от другой формы. Конечно, не обновляя код в формах, если изменения меню новых объектов добавляются.
Свойство ToolStrip.AllowMerge
«получает или устанавливает [...], будет ли несколько MenuStrip , ToolStripDropDownMenu , ToolStripMenuItem и другие типы можно комбинировать ». (MSDN).
Это означает, что вы можете:
«Использовать свойство AllowMerge, чтобы разрешить дочерним элементам многодокументного интерфейса (MDI) объединять свои соответствующие меню в родительском MDI». (Свойство AllowMerge, Remark, MSDN)
См. Также:
Это, я надеюсь, поможет вам получить то, что вы хотите. Я не знаю, подходит ли это для Windows Forms или он будет работать и в Linux после сборки.
Я думаю, вы хотите установить для KeyPreview в родительской форме значение true
. Если для этого свойства установлено значение true, форма будет получать все события KeyPress, KeyDown и KeyUp. После того, как обработчики событий формы завершили обработку нажатия клавиши, нажатие клавиши назначается элементу управления с фокусом. Например, если для свойства KeyPreview установлено значение true и текущий выбранный элемент управления является TextBox, после того, как нажатие клавиши будет обработано обработчиками событий формы, элемент управления TextBox получит нажатую клавишу. Чтобы обрабатывать события клавиатуры только на уровне формы и не разрешать элементам управления получать события клавиатуры, установите для свойства KeyPressEventArgs.Handled в обработчике событий KeyPress вашей формы значение true.
РЕДАКТИРОВАТЬ:
ответ в этот вопрос может быть полезным:
Вы пробовали что-то подобное?
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);
}
}
}
Я полагаю, что под словом «неактивный» вы подразумеваете, что у него нет фокуса?
Самый простой способ сделать это - сделать так, чтобы каждая форма отображала события, которые относятся к их меню, которым управляют. Когда вы создаете формы, подписывайте их друг на друга (или от дочернего к MainForm или в любом другом направлении, в котором должен идти поток). При щелчке по меню выполните дополнительное событие, и другая форма получит его.
Это поможет? Я считаю, что это лучше, чем пытаться форсировать сообщение вручную, поскольку это будет самодокументирующийся код, который формы должны реагировать друг на друга.
Более «отстраненный от проблем» подход: нужны ли вам две формы или вы можете провести рефакторинг дизайна пользовательского интерфейса?
Есть гораздо более простой способ сделать это. Пункты меню должны вызывать соответствующие методы. Затем вы можете вызывать эти методы в любом месте приложения.
Вместо привязки сочетаний клавиш к пунктам меню на главной форме вы можете создать пользовательский метод обработки клавиш, который реагирует на сочетания клавиш. Поместите этот метод в главную форму. Затем вызывайте этот метод из всех дочерних форм по событию нажатия клавиши. Код @Adam Driscoll во многом совместим с этим подходом.