2009-02-13 40 views
5

Giả sử rằng đối với mọi Biểu mẫu trong một ứng dụng WinForms, bạn muốn thay đổi con trỏ thành WaitCursor. Các cách rõ ràng để làm được điều này sẽ có thêm mã để mỗi nơi một hình thức được khởi tạo/hiển thị:VB.NET 2005 - Trình xử lý sự kiện "Toàn cầu"?

Try 
    Me.Cursor = Cursors.WaitCursor 

    Dim f As New frmMyForm 
    f.Show() 

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

Tuy nhiên, tôi đã tự hỏi nếu có một cách để nói với ứng dụng của bạn, "Bất cứ khi nào bất kỳ hình thức tải sự kiện cháy, hiển thị một WaitCursor. Khi sự kiện biểu mẫu Hiển thị hoàn tất, đặt con trỏ trở về mặc định. " Bằng cách này, mã Me.Cursor chỉ có thể ở một nơi và không nằm rải rác trong toàn bộ ứng dụng - và không quên đặt nó vào từng biểu mẫu.

Tôi cho rằng bạn có thể phân lớp lớp biểu mẫu thông thường và thêm cài đặt con trỏ vào sự kiện bị ghi đè, nhưng tôi tin rằng bạn mất khả năng thiết kế trực quan khi bạn phân lớp đối tượng Biểu mẫu.

+0

Tôi hy vọng bạn biết rằng phần Catch hoàn toàn vô nghĩa? (Và nên được bỏ qua) –

+0

Tôi có mã khác trong khối Catch của mình. Đây là một ví dụ đơn giản. – HardCode

Trả lời

2

Để trả lời câu hỏi của bạn - không có sự kiện .Net toàn cầu nào để đạt được những gì bạn muốn. Không có bất kỳ giải pháp thuần túy nào. Bạn có thể xem Aspect Orientated Programming và Cross Cutting Concerns - có thể có một giải pháp AOP cho điều này (một số googling sẽ giúp bạn bắt đầu sau đó đăng lại ở đây để biết chi tiết).

Tuy nhiên, những gì sau đây là một ý tưởng hơn là một giải pháp hoàn chỉnh về cách bạn có thể đạt được điều này bằng cách sử dụng tin nhắn win32.

  1. Bạn cần tìm ra thông điệp win32 nào tương ứng với sự kiện Tải và nếu có thông báo win32 luôn xảy ra sau sự kiện tải. Một ứng cử viên cho sự kiện tải có thể là WM_SHOWWINDOW nhưng tôi không chắc chắn.
  2. Viết một lớp lọc thư (ví dụ: triển khai IMessageFilter).
  3. Trong phương thức PreMessageFilter của lớp lọc thư kiểm tra kiểu thông báo và nếu đó là thông báo WM_SHOWWINDOW (hoặc bất kỳ) nào với các tham số chính xác thì bạn có thể đặt/đặt lại con trỏ (sử dụng Cursor.Current = Cursors.WaitCursor - một lần nữa bạn cần để kiểm tra điều này)
+0

Âm thanh như một ý tưởng. Cảm ơn! Tôi sẽ xem xét điều này. – HardCode

3

Phân lớp là một tùy chọn, bạn không mất thiết kế miễn là bạn không đặt siêu lớp là mustinherit, nó không thực sự như vậy.

1

Một tùy chọn khác sẽ không liên quan đến phân lớp là thêm phương thức tiện ích mở rộng vào loại Biểu mẫu. Sau đó, bạn chỉ có thể gọi phương thức mở rộng của bạn (một cái gì đó như ShowAndWait()) thay vì hiển thị. Bạn thậm chí có thể sắp gọi là Hiển thị nếu bạn quá tải nó với một chữ ký khác.

+0

Tôi có thể gây nhầm lẫn với thuật ngữ của mình, nhưng không phải là phương pháp mở rộng mới đối với VS.NET 2008? Tôi đang sử dụng năm 2005. Nếu không, thì tôi sẽ thử cái này. – HardCode

+0

Bạn chính xác. Họ mới đến năm 2008 –

Các vấn đề liên quan