Пользовательские элементы управления в C # Windows Forms вопрос о событиях мыши - PullRequest
4 голосов
/ 07 декабря 2008

У меня есть событие mouseenter и mouseleave для элемента управления Panel, который изменяет задний цвет, когда мышь входит, и возвращается к белому, когда она уходит.

У меня также есть элемент управления Label на этой панели, но когда мышь входит в элемент управления Label, запускается событие mouseleave для панели.

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

Ответы [ 4 ]

6 голосов
/ 10 декабря 2008

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

private void panel1_MouseLeave(object sender, EventArgs e)
{
    if (panel1.GetChildAtPoint(panel1.PointToClient(MousePosition)) == null)
    {
        panel1.BackColor = Color.Gray;
    }
}

Если элемент управления на самом деле не является дочерним, вы все равно можете использовать MousePosition и PointToScreen, чтобы определить, находится ли мышь по-прежнему в границах элемента управления.

private void panel1_MouseLeave(object sender, EventArgs e)
{
    Rectangle screenBounds = new Rectangle(this.PointToScreen(panel1.Location), panel1.Size);
    if (!screenBounds.Contains(MousePosition))
    {
        panel1.BackColor = Color.Gray;
    }
}
1 голос
/ 07 декабря 2008

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

Добавление события для родительского элемента управления означает, что как только вы захотите использовать панель где-то еще, вы должны сделать то же самое для нового родительского элемента управления. И когда требования к панели меняются, вы должны помнить о том, чтобы исключить обработку из события родительского элемента управления.

Все потенциально грязно чуть дальше.

Я был бы склонен включить некоторую проверку координат в событие отпускания мыши для панели и сбросить цвет панели только в том случае, если мышь действительно вышла за границы панели.

Таким образом, ваш код для обработки панели остается только на соответствующей панели.

1 голос
/ 07 декабря 2008

Я нашел простое решение. Я просто установил для свойства enabled значение false на этикетке, и это нормально.

0 голосов
/ 07 декабря 2008

Вы можете добавить событие MouseEnter для метки, которая также устанавливает цвет задней панели. Вам не нужно событие MouseLeave для метки.

Или:

  1. Установите событие MouseEnter для Panel, чтобы установить цвет задней панели.
  2. Установите событие MouseEnter родительского элемента управления Panel (например, Form), чтобы сбросить задний цвет Panel.

Если вы хотите выполнить пункт 2 выше, не касаясь кода родительского элемента управления (согласно комментарию другого пользователя), вы можете сделать что-то подобное в событии ParentChanged панели:

    private void panel1_ParentChanged(object sender, EventArgs e)
    {
        Panel thisPanel = sender as Panel;

        if(thisPanel != null && thisPanel.Parent != null)
        {
            thisPanel.Parent.MouseEnter += delegate(object senderObj, EventArgs eArgs) { thisPanel.BackColor = SystemColors.Control; };
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...