C #, пожарное событие контейнера - PullRequest
6 голосов
/ 22 марта 2011

У меня есть класс MyButton, который наследуется от Button. В этом классе я разместил несколько других элементов управления (Labels, Progessbar). Проблема заключается в том, что элементы управления на кнопке делают невозможным запуск события Button.Click или Button.MouseHover. Как можно добиться того, чтобы элементы управления на кнопке отображались только, но были «прозрачными для событий»: щелчок / наведение на ярлык и панель progessbar - это то же самое, что если бы я нажал / наведите курсор на кнопку непосредственно (включая отправителя и все остальное). Что-то вроде «наследования событий от родителя».

class MyButton : Button
{
    Label foo = new Label();
    ProgressBar bar = new ProgessBar();
}

Ответы [ 5 ]

4 голосов
/ 22 марта 2011

Вы должны наследовать UserControl, затем иметь кнопку в качестве дочернего элемента управления и всплывать событие дочернего элемента кнопки при нажатии.

Эта ссылка , вероятно, больше, чем вам нужно, но это хорошая отправная точка.

UPDATE Как уже отмечалось, вы не можете использовать ASP.NET. Итак, здесь - это еще один пост, в котором говорится о различных пользовательских элементах управления, в частности, то, что вы ищете, это Composite Control. Это для Windows Forms.

3 голосов
/ 22 марта 2011

Обработчики событий Write Click для метки и PB, пусть они вызывают PerformClick ().

Создание прозрачных для мыши элементов управления возможно, но уродливо.Вам нужно переопределить WndProc (), чтобы перехватить WM_NCHITTEST и вернуть HTTRANSPARENT.Все лучшее решение - не использовать элементы управления.Метка - это просто TextRenderer.DrawText () в событии Paint кнопки.ProgressBar тоже не сложный, e.Graphics.FillRectangle ().

1 голос
/ 22 марта 2011

Наличие дочерних элементов управления в качестве реальных элементов управления перед кнопкой (в классе, унаследованном от Button или от UserControl) может затруднить правильное функционирование событий, специфичных для кнопки, как вы уже обнаружили. (Редактировать: хотя это сложно, это не невозможно - см. Ответ Ханса Пассанта)

В качестве обходного пути, вместо использования дочерних элементов управления, вы можете нарисовать их на поверхности кнопки,так как вам не нужна большая часть функциональности элементов управления (события, фокусировка и т. д.), только их отображение.

Вы можете сделать дополнительное рисование в методе OnPaint вашего класса.Что-то вроде:

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);
    e.Graphics.DrawString("My fake label", Font, 
                          SystemBrushes.ControlText, new Point(10, 10))
    // draw progressbar
}

Чтобы обновить отображение, вам нужно вызвать перерисовку кнопки, используя Invalidate().

Взгляните на Пользовательская кнопка растрового изображения с использованием C #на CodeProject для более полного примера.

0 голосов
/ 22 марта 2011

Если вы используете WPF, я думаю, что вы ищете что-то под названием Bubbled Events . Это функция в WPF, с помощью которой события всплывают от элемента управления к его родительскому элементу (в вашем случае это будут элементы из вашего ProgressBar и Label для вашей кнопки). Я нашел эту статью по этому вопросу , которая, я думаю, будет вам полезна.

Надеюсь, это поможет:)

0 голосов
/ 22 марта 2011

Этот ответ был здесь только что, но был удален:

Можете ли вы наследовать от UserControl вместо этого? Это позволит вам разместить другие элементы управления на панели управления, включая вашу кнопку, и подписаться на их события.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...