异类HOW TO:适时弹出指示框(四)

Author: 水如烟

指示框的实现:
MessageFormAttribute.vb
Namespace  uRemoting.MethodWatcher
    
< AttributeUsage(AttributeTargets.Class) >  _
    
Public   Class  MessageFormAttribute
        
Inherits  MethodWatcherBaseAttribute

        
Protected   Overrides   Function  GetMethodWatcherProperty()  As  MethodWatcherBaseProperty
            
Return   New  MessageFormProperty
        
End Function
    
End Class

End Namespace

MessageFormProperty.vb
Namespace  uRemoting.MethodWatcher

    
Public   Class  MessageFormProperty
        
Inherits  MethodWatcherBaseProperty

        
Protected   Overrides   Function  CreateSink( ByVal  nextSink  As  System.Runtime.Remoting.Messaging.IMessageSink)  As  System.Runtime.Remoting.Messaging.IMessageSink
            
Return   New  MessageFormSink(nextSink)
        
End Function

    
End Class

End Namespace

MessageFormSink.vb
Imports  System.Runtime.Remoting.Messaging

Namespace  uRemoting.MethodWatcher

    
Public   Class  MessageFormSink
        
Inherits  MethodWatcherBaseSink

        
Sub   New ( ByVal  nextSink  As  IMessageSink)
            
MyBase .New(nextSink)
        
End Sub


        
Protected   Overrides   Sub  After_MethodCall( ByVal  replyMsg  As  System.Runtime.Remoting.Messaging.IMethodReturnMessage,  ByVal  MethodAppendType  As  System.Type)
            
If  replyMsg  Is   Nothing   Then
                
Return
            
End   If
            MessageFormCenter.Close(replyMsg, MethodAppendType)

            
MyBase .After_MethodCall(replyMsg, MethodAppendType)
        
End Sub

        
Protected   Overrides   Sub  Before_MethodCall( ByVal  callMsg  As  System.Runtime.Remoting.Messaging.IMethodCallMessage,  ByVal  MethodAppendType  As  System.Type)
            
If  callMsg  Is   Nothing   Then
                
Return
            
End   If

            MessageFormCenter.ShowForm(callMsg, MethodAppendType)

            
MyBase .Before_MethodCall(callMsg, MethodAppendType)
        
End Sub

        
Protected   Overrides   ReadOnly   Property  MethodWatcherAppendAttributeType()  As  System.Type
            
Get
                
Return   GetType (MessageFormAppendAttribute)
            
End   Get
        
End Property
    
End Class

End Namespace

MessageFormAppendAttribute.vb
Namespace  uRemoting.MethodWatcher
    
< AttributeUsage(AttributeTargets.Class, allowmultiple: = True ) >  _
    
Public   NotInheritable   Class  MessageFormAppendAttribute
        
Inherits  MethodWatcherAppendBaseAttribute

        
Private  gMessage  As   String   =   " 处理中 "
        
Private  gTitle  As   String   =   " 请稍候 "
        
Private  gFormType  As  ApplicationBase.MessageFormType  =  ApplicationBase.MessageFormType.Message

        
Sub   New ( ByVal  methodName  As   String )
            
MyBase .New(methodName)
        
End Sub

        
Public   Property  Message()  As   String
            
Get
                
Return  gMessage
            
End   Get
            
Set ( ByVal  value  As   String )
                gMessage 
=  value
            
End   Set
        
End Property

        
Public   Property  Title()  As   String
            
Get
                
Return  gTitle
            
End   Get
            
Set ( ByVal  value  As   String )
                gTitle 
=  value
            
End   Set
        
End Property

        
Public   Property  FormType()  As  ApplicationBase.MessageFormType
            
Get
                
Return  gFormType
            
End   Get
            
Set ( ByVal  value  As  ApplicationBase.MessageFormType)
                gFormType 
=  value
            
End   Set
        
End Property
    
End Class

End Namespace

MessageFormCenter.vb
Imports  System.Runtime.Remoting.Messaging

Namespace  uRemoting.MethodWatcher

    
Public   Class  MessageFormCenter

        
Private   Shared  gWaitingFormCollection  As   New  Dictionary(Of  String , ApplicationBase.WaitingForm)

        
Private   Sub   New ()
        
End Sub


        
Public   Shared   Sub  ShowForm( ByVal  callMsg  As  IMethodCallMessage,  ByVal  MethodAppendType  As  System.Type)

            NowMethodName 
=  MethodWatcherCommon.GetFullMethodName(callMsg, MethodAppendType)
            IsClose.Add(NowMethodName, 
False )
            
Dim  td  As   New  Threading.Thread( New  Threading.ThreadStart( AddressOf  Show))
            td.Start()
        
End Sub

        
Public   Shared   Sub  Close( ByVal  replyMsg  As  IMethodReturnMessage,  ByVal  MethodAppendType  As  System.Type)

            NowMethodName 
=  MethodWatcherCommon.GetFullMethodName(replyMsg, MethodAppendType)
            IsClose(MethodWatcherCommon.GetFullMethodName(replyMsg, 
GetType (MessageFormAppendAttribute)))  =   True
            
While  IsClose.ContainsKey(NowMethodName)
                Windows.Forms.Application.DoEvents()
            
End   While
            gWaitingFormCollection.Remove(MethodWatcherCommon.GetFullMethodName(replyMsg, MethodAppendType))
        
End Sub

        
Private   Shared   Function  WaitingForm( ByVal  methodName  As   String As  ApplicationBase.WaitingForm

            
If   Not  gWaitingFormCollection.ContainsKey(methodName)  Then

                
Dim  a  As  MessageFormAppendAttribute  =   CType (MethodCollection.DefaultInstance(methodName), MessageFormAppendAttribute)
                
Dim  f  As   New  ApplicationBase.WaitingForm(a.FormType)
                
With  f
                    .ReceiveMessage(a.Title, 
True )
                    .ReceiveMessage(a.Message)
                
End   With
                gWaitingFormCollection.Add(methodName, f)
            
End   If
            
Return  gWaitingFormCollection(methodName)
        
End Function

        
Private   Shared  IsClose  As   New  Dictionary(Of  String Boolean )
        
Private   Shared  NowMethodName  As   String

        
Private   Shared   Sub  Show()
            WaitingForm(NowMethodName).Show()

            
Do   While   Not  IsClose(NowMethodName)
                Windows.Forms.Application.DoEvents()
            
Loop

            IsClose.Remove(NowMethodName)
        
End Sub
    
End Class

End Namespace

你可能感兴趣的:(类)