C # WinForms UserControl Mouse Event Справка - PullRequest
3 голосов
/ 08 октября 2008

У меня есть пользовательский элемент управления, который я создал для своего проекта. В этом элементе управления есть несколько дочерних элементов управления, таких как Label, PictureBox и LinkLabel. Кроме LinkLabel, я хочу, чтобы событие указателя мыши в данный момент находилось на родительском элементе управления, и чтобы элемент управления реагировал на указатель мыши. Цвет фона изменяется при наведении курсора на элемент управления, но цвет фона не меняется при использовании дочернего элемента управления; Это связано с тем, что в дочернем элементе управления нет событий MouseEnter и MouseLeave. Я решил эту проблему, добавив методы делегирования родительских элементов управления в дочерние элементы управления. Проблема остается в том, что событие click также игнорируется для дочерних элементов управления, когда я подписываюсь на событие click на родительском элементе управления. Я могу подписаться на каждый отдельный дочерний элемент управления, но как заставить событие click родительского элемента управления? Поиском, который я нашел при поиске, является Event Bubbling, но, похоже, это относится только к технологиям и инфраструктурам ASP.NET. Есть предложения?

Ответы [ 4 ]

2 голосов
/ 08 октября 2008

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

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

1 голос
/ 09 ноября 2010

У меня была похожая проблема с обработкой события Click во всех дочерних элементах управления. Код VB.NET, но он должен быть легко настраиваемым.

Public Shared Sub RelayEvents(ByVal usrcon As Windows.Forms.Control, ByVal del As System.EventHandler, Optional ByVal includeChildren As Boolean = True)
    For Each con As Windows.Forms.Control In usrcon.Controls
        AddHandler con.Click, del
        If includeChildren Then
            RelayEvents(con, del)
        End If
    Next
End Sub

Всякий раз, когда необходим требуемый каскад, можно добавить следующую строку в конструктор класса.

CustomMethods.RelayEvents(Me, New EventHandler(AddressOf Me_Click))
1 голос
/ 08 октября 2008

Кажется, кто-то другой решил это за меня. Друг объяснил, что элементы управления C # поддерживают метод InvokeOnClick (Control, EventArgs);

Я добавил свои методы делегата события для каждого дочернего элемента управления, и для события click я создал один метод для использования каждым дочерним элементом управления. Это в свою очередь вызывает InvokeOnClick (this, new EventArgs ());


private void Control_Click(object sender, EventArgs e)
{
    // this is the parent control.
    InvokeOnClick(this, new EventArgs());
}

private void IFLVControl_MouseEnter(object sender, EventArgs e)
{
    this.BackColor = Color.DarkGray;
}

private void IFLVControl_MouseLeave(object sender, EventArgs e)
{
    this.BackColor = Color.White;
}
0 голосов
/ 25 ноября 2008

У Питера Риллинга (Code Rilling) в CodeProject есть простой и эффективный код для создания событий и трансляции событий в winforms (и C #). Это действительно удобно.

http://www.codeproject.com/KB/cs/event_broadcast.aspx

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