Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Фокус над контролом / 6 сообщений из 6, страница 1 из 1
25.07.2013, 13:27
    #38343619
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фокус над контролом
Подскажите, пожалуйста, как сделать таким образом:

UserControl содержит несколько контролов. Требуется подписаться на событие MouseEnter и MouseLeave этого контрола. Но он считает, что MouseLeave происходит каждый раз, когда мышка заходит на кнопку.
Как сделать так, чтобы MouseEnter срабатывал всегда, когда указатель над UserControl, и MouseLeave, когда указатель уходит из UserControl?
...
Рейтинг: 0 / 0
25.07.2013, 14:36
    #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
25.07.2013, 14:40
    #38343752
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фокус над контролом
Проблема немного другая:
Я создал свой контрол (унаследовал от UserControl), на него покидал элементы управления какие-нибудь.

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

Соответственно, в случае, если дочерние контролы растянуты на всю родительскую форму, то MouseEnter и MouseLeave вообще не срабатывают.
...
Рейтинг: 0 / 0
25.07.2013, 17:25
    #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
25.07.2013, 17:39
    #38344088
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фокус над контролом
Ответ близок к гениальному, но не будет ли срабатывать события Leave и Enter подряд при каждом пересечении границы компонентов в пределах UserControl?
...
Рейтинг: 0 / 0
26.07.2013, 06:59
    #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
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Фокус над контролом / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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