powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Фокус над контролом
6 сообщений из 6, страница 1 из 1
Фокус над контролом
    #38343619
Charles Weyland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите, пожалуйста, как сделать таким образом:

UserControl содержит несколько контролов. Требуется подписаться на событие MouseEnter и MouseLeave этого контрола. Но он считает, что MouseLeave происходит каждый раз, когда мышка заходит на кнопку.
Как сделать так, чтобы MouseEnter срабатывал всегда, когда указатель над UserControl, и MouseLeave, когда указатель уходит из UserControl?
...
Рейтинг: 0 / 0
Фокус над контролом
    #38343747
sanekoffice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так понял, что все контролья на одно и тоже событие подписаны? Тогда нужно что-то вроде этого

Код: c#
1.
2.
3.
4.
5.
6.
7.
 private void Controls_MouseLeave(object sender, EventArgs e)
        {
           if (sender is UserControl)
             // реагирует контрол
           else
           return;
       }



Вообще на картинке этой кнопки нет. Хоть бы какой кусочек кода выложи чтоб ситуация прояснилась... Учитесь формировать вопрос грамотно, тогда и ответ не заставит себя ждать :)
...
Рейтинг: 0 / 0
Фокус над контролом
    #38343752
Charles Weyland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема немного другая:
Я создал свой контрол (унаследовал от UserControl), на него покидал элементы управления какие-нибудь.

Потом я использую свой контрол: хочу узнать, находится ли указатель мышки над ним, или нет. Подписываюсь на события MouseEnter и MouseLeave моего компонента. Но они срабатывают криво:
когда навожу мышь на свободное место в пределах компонента UserControl, срабатывает MouseEnter. Но когда я с фона UserControl навожу на контрол, лежащий на нём (скажем, на textbox), то срабатывает MouseLeave.

Соответственно, в случае, если дочерние контролы растянуты на всю родительскую форму, то MouseEnter и MouseLeave вообще не срабатывают.
...
Рейтинг: 0 / 0
Фокус над контролом
    #38344063
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Charles Weyland,
Только как то так.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();
            MouseEnter += UserControl1_MouseEnter;
            MouseLeave += UserControl1_MouseLeave;
        }

        private void UserControl1_Load(object sender, EventArgs e)
        {
            InitEvents(this);
        }
        void InitEvents(Control ctr)
        {
            if (ctr != this)
            {
                ctr.MouseLeave += UserControl1_MouseLeave;
                ctr.MouseEnter += UserControl1_MouseEnter;
            }
            var ctrl = ctr.Controls.Cast<Control>();
            foreach (var c in ctrl)
                InitEvents(c);
        }

        private void UserControl1_MouseLeave(object sender, EventArgs e)
        {
            string dd = "dddd";
        }

        private void UserControl1_MouseEnter(object sender, EventArgs e)
        {
            string dd = "dddd";
        }

      
    }
...
Рейтинг: 0 / 0
Фокус над контролом
    #38344088
Charles Weyland
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ответ близок к гениальному, но не будет ли срабатывать события Leave и Enter подряд при каждом пересечении границы компонентов в пределах UserControl?
...
Рейтинг: 0 / 0
Фокус над контролом
    #38344572
LameUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Charles WeylandОтвет близок к гениальному, но не будет ли срабатывать события Leave и Enter подряд при каждом пересечении границы компонентов в пределах UserControl?

По теме Предлагают использовать для этих целей WPF чтобы избежать аггрегирования событий как ответил предыдущий человек.

По поводу срабатывания событий внутри вашего контрола при переводе курсора от одного вложенного контрола к другому:

Можно попробовать что-нибудь вроде этого (не проверял).
Затык может быть, если не сработает MouseLeave вашего основного контрола, если на нем в притык к границе расположен другой вложенный контрол. В общем пробуйте :) Самому интересно как разрулить такую ситуацию...

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
   public class UserControl1 : UserControl
        {
            private bool _isMouseEntered;

            public UserControl1()
            {
                InitializeComponent();

                MouseEnter += UserControl1_MouseEnter;
                MouseLeave += (sender, e) =>
                                  {
                                      _isMouseEntered = false;
                                      SomeLeaveAction();
                                  };
            }

            private void UserControl1_Load(object sender, EventArgs e)
            {
                InitEvents(Controls);
            }

            private void InitEvents(ControlCollection controls)
            {
                List<Control> controlList = controls.Cast<Control>().ToList();

                controlList.ForEach(control =>
                                 {
                                     control.MouseEnter += UserControl1_MouseEnter;
                                     InitEvents(control.Controls);
                                 }
                    );
            }

            private void UserControl1_MouseEnter(object sender, EventArgs e)
            {
                if (!_isMouseEntered)
                {
                    _isMouseEntered = true;
                    SomeEnterAction();
                }
            }

            private void SomeEnterAction()
            {
            }

            private void SomeLeaveAction()
            {
            }
        }
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Фокус над контролом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]