VB.NET 2005 - «Глобальный» обработчик событий? - PullRequest
5 голосов
/ 13 февраля 2009

Предположим, что для каждой формы в приложении WinForms вы хотите изменить курсор на WaitCursor. Очевидный способ сделать это - добавить код в каждое место, где создается / показывается форма:

Try
    Me.Cursor = Cursors.WaitCursor

    Dim f As New frmMyForm
    f.Show()

Catch ex As Exception
    Throw
Finally
    Me.Cursor = Cursors.Default
End Try

Однако мне было интересно, есть ли способ сообщить вашему приложению: «Всякий раз, когда происходит событие загрузки любой формы, показывайте WaitCursor. Когда событие формы Показано завершено, установите курсор обратно в значение по умолчанию». Таким образом, код Me.Cursor может быть только в одном месте и не разбросан по всему приложению - и не забыть вставить его в каждый экземпляр формы.

Полагаю, вы могли бы создать подкласс обычного класса Form и добавить настройки курсора в переопределенное событие, но я полагаю, что вы потеряете возможность визуального конструктора, когда создадите подкласс объекта Form.

Ответы [ 3 ]

3 голосов
/ 13 февраля 2009

Подклассирование - это опция, вы не потеряете конструктор, если не установите суперкласс как mustinherit, ему это не очень нравится.

2 голосов
/ 13 февраля 2009

Чтобы ответить на ваш вопрос - не существует глобальных событий .Net для достижения того, что вы хотите. Нет чистого решения .net для этого. Вы можете взглянуть на Аспектно-ориентированное программирование и сквозные проблемы - для этого может быть решение AOP (некоторые поиски помогут вам начать, а затем отправьте сюда подробности).

Однако, ниже следует скорее идея, а не полное решение о том, как вы могли бы добиться этого с помощью обмена сообщениями win32.

  1. Вам необходимо выяснить, какие сообщения win32 соответствуют событию Load и существует ли сообщение win32, которое всегда происходит после события загрузки. Один из кандидатов на событие загрузки может быть WM_SHOWWINDOW , но я не уверен.
  2. Написать класс фильтра сообщений (т.е. внедрить IMessageFilter ).
  3. В методе PreMessageFilter класса фильтра сообщений проверьте тип сообщения и, если это сообщение WM_SHOWWINDOW (или что-то еще) с правильными параметрами, вы можете установить / сбросить курсор (используя Cursor.Current = Cursors.WaitCursor - снова вам нужно чтобы проверить это)
1 голос
/ 13 февраля 2009

Другой вариант, который не включает в себя создание подклассов, - добавить метод расширения к типу формы. Тогда вы можете просто вызвать свой метод расширения (что-то вроде ShowAndWait ()) вместо show. Возможно, вы даже захотите позвонить в Show, если перегрузите его другой подписью.

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