2009-02-13 17 views
5

Załóżmy, że dla każdego formularza w aplikacji WinForms chcesz zmienić kursor na wskaźnik WaitCursor. Oczywistym sposobem na to byłoby dodanie kodu do każdego miejsca, w którym forma jest tworzony/pokazanej:VB.NET 2005 - "Global" Event Handler?

Try 
    Me.Cursor = Cursors.WaitCursor 

    Dim f As New frmMyForm 
    f.Show() 

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

Jednak, zastanawiałem się, czy istnieje sposób, aby opowiedzieć swoją aplikację „Gdy jakaś forma obciążenia Zdarzenie zostanie uruchomione, pokaż program WaitCursor Po zakończeniu pokazanego zdarzenia, ustaw ponownie kursor na wartość domyślną. " W ten sposób kod Me.Cursor może być tylko w jednym miejscu i nie jest rozproszony w aplikacji - i nie zapomniano go umieścić w każdej instancji postaci.

Przypuszczam, że można podklasować zwykłą klasę formularzy i dodać ustawienia kursora w nadpisanym zdarzeniu, ale uważam, że tracisz możliwości projektanta wizualnego podczas podklasy obiektu Form.

+0

Mam nadzieję, że wiesz, że część Catch jest zupełnie bezcelowa? (I powinienem zostać pominięty) –

+0

Mam inny kod w moich blokach Catch. To jest uproszczony przykład. – HardCode

Odpowiedz

2

Aby odpowiedzieć na twoje pytanie - nie ma żadnych globalnych zdarzeń .Net, aby osiągnąć to, co chcesz. Nie ma w tym żadnego czystego rozwiązania .net. Możesz przyjrzeć się programowaniu zorientowanemu na aspekt i zagadnieniom przekierowania - może to być rozwiązanie AOP (niektóre google'y pozwolą ci zacząć, a następnie opublikuj tutaj szczegóły).

Poniżej znajduje się raczej pomysł, a nie kompletne rozwiązanie tego, w jaki sposób można to osiągnąć za pomocą komunikatora win32.

  1. Musisz ustalić, które wiadomości win32 odpowiadają zdarzeniu Load i czy istnieje komunikat win32, który zawsze pojawia się po zdarzeniu load. Jednym z kandydatów do zdarzenia obciążenia może być WM_SHOWWINDOW, ale nie jestem pewien.
  2. Napisz klasę filtru komunikatów (tzn. Implementuj IMessageFilter).
  3. W metodzie PreMessageFilter klasy filtru komunikatów sprawdź typ komunikatu i jeśli jest to komunikat WM_SHOWWINDOW (lub cokolwiek innego) z poprawnymi parametrami, możesz ustawić/zresetować kursor (używając Cursor.Current = Cursors.WaitCursor - znowu potrzebujesz przetestować to)
+0

Brzmi jak pomysł. Dzięki! Zajrzę w to. – HardCode

3

Podklasowanie jest opcją, nie tracisz projektanta, o ile nie ustawisz nadklasy jako mustinherit, tak naprawdę to nie smakuje.

1

Inną opcją, która nie wymaga podklasy, jest dodanie metody rozszerzenia do typu formularza. Następnie możesz po prostu wywołać metodę rozszerzenia (coś jak ShowAndWait()) zamiast show. Możesz nawet zadzwonić, to Show, jeśli przeładujesz go innym sygnaturą.

+0

Mogę mylić moją terminologię, ale czy nie są to nowe metody rozszerzania VS.NET 2008? Używam 2005. Jeśli nie, to wypróbuję to. – HardCode

+0

Masz rację. Są nowe w 2008 roku –