Ответ на вопрос 1
Один и тот же фрагмент кода во многих местах (ремонтопригодность)
Это не всегда применимо, но если выесли вы часто используете это поведение, вы можете унаследовать от UserControl
, чтобы создать BitmapExportUserControl
и вместо этого поместить в этот класс Image GetImage()
и override void OnMouseDown(MouseEventArgs e)
, а все пользовательские элементы управления, которым требуется это поведение, наследуются от BitmapExportUserControl
.
Другой способ - выполнить экспорт растрового изображения из самого вашего Form
, и ваш Form
подписывается на все MouseDown
события всех его дочерних Control
объектов.
Ответ на вопрос 2
Работает только тогда, когда я нажимаю на базовый элемент управления, а не на его дочерние элементы
Насколько я знаю, нет встроенного-вход "вверх" (или всплывание) в WinForms, как, например, в WPF. Решением может быть предоставление события, которое может быть вызвано всеми UserControl
в вашем приложении, когда на них есть событие MouseDown
. Ваш код будет выглядеть так:
protected override void OnMouseDown(MouseEventArgs e)
{
GlobalMouseDown.RaiseGlobalMouseDownEvent(this, e);
}
, и ваш основной Form
подпишется на этот GlobalMouseDown.GlobalMouseDownEvent
и выполнит проверки и экспорт растрового изображения.
Это функционально эквивалентно наличиюоткрытый метод HandleMouseDown
в некотором GlobalMouseDown
классе, который будет вызываться всеми вашими UserControl
MouseDownEventHandlers
. Код в каждом UserControl
будет иметь вид:
protected override void OnMouseDown(MouseEventArgs e)
{
GlobalMouseDown.HandleMouseDown(this, e);
}
, и вы будете выполнять свои проверки и экспорт растровых изображений в этом методе.