VB.NET 2005 - “全球”事件处理程序?

时间:2009-02-13 15:26:47

标签: vb.net winforms

假设对于WinForms应用程序中的每个Form,您希望将光标更改为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

但是,我想知道是否有办法告诉你的应用程序,“每当任何表单Load事件触发时,显示一个WaitCursor。当表单事件显示完成时,将光标设置回Default。”这样,Me.Cursor代码可能只在一个地方而不是分散在整个应用程序中 - 并且不会忘记将它放入每个表单实例化中。

我想您可以继承常规Form类并在重写事件中添加游标设置,但我相信当您继承Form对象时,您将失去可视化设计器功能。

3 个答案:

答案 0 :(得分:3)

子类化是一个选项,只要你没有将超类设置为mustinherit就不会丢失设计器,它实际上并不喜欢它。

答案 1 :(得分:2)

要回答您的问题 - 没有全球.Net活动可以实现您的目标。没有任何纯粹的.net解决方案。你可以看看面向方面的编程和交叉问题 - 可能有一个AOP解决方案(一些谷歌搜索将让你开始然后回到这里详细信息)。

然而,接下来的内容更多的是一个想法,而不是一个完整的解决方案,关于如何使用win32消息传递来实现这一点。

  1. 您需要确定哪些win32消息对应于Load事件,以及是否在load事件之后始终发生win32消息。加载事件的一个候选者可能是WM_SHOWWINDOW,但我不确定。
  2. 编写邮件过滤器类(即实现IMessageFilter)。
  3. 在消息过滤器类的PreMessageFilter方法中检查消息类型,如果它是带有正确参数的WM_SHOWWINDOW(或其他)消息,则可以设置/重置光标(使用Cursor.Current = Cursors.WaitCursor - 再次需要测试这个)

答案 2 :(得分:1)

另一个不涉及子类化的选项是向Form类型添加扩展方法。然后你可以调用你的扩展方法(类似于ShowAndWait())而不是show。如果你用不同的签名重载它,你甚至可能打电话给Show。