我有两个类,一个是frmMain一个windows表单,另一个是vb.NET 2003中的类。
frmMain包含一个启动按钮,用于执行另一个类中的监视功能。我的问题是,我手动添加事件处理程序 - 当事件执行时如何让它们在“主线程”上执行。因为当托盘图标弹出工具提示气球时,它会显示第二个托盘图标,而不是弹出现有的托盘图标。我可以确认这是因为事件在新线程上触发,因为如果我尝试从frmMain显示气球工具提示,它将显示在现有托盘图标上。
这是第二类(不是整个)的一部分:
Friend Class monitorFolders
Private _watchFolder As System.IO.FileSystemWatcher = New System.IO.FileSystemWatcher
Private _eType As evtType
Private Enum evtType
changed
created
deleted
renamed
End Enum
Friend Sub monitor(ByVal path As String)
_watchFolder.Path = path
'Add a list of Filter to specify
_watchFolder.NotifyFilter = IO.NotifyFilters.DirectoryName
_watchFolder.NotifyFilter = _watchFolder.NotifyFilter Or IO.NotifyFilters.FileName
_watchFolder.NotifyFilter = _watchFolder.NotifyFilter Or IO.NotifyFilters.Attributes
'Add event handlers for each type of event that can occur
AddHandler _watchFolder.Changed, AddressOf change
AddHandler _watchFolder.Created, AddressOf change
AddHandler _watchFolder.Deleted, AddressOf change
AddHandler _watchFolder.Renamed, AddressOf Rename
'Start watching for events
_watchFolder.EnableRaisingEvents = True
End Sub
Private Sub change(ByVal source As Object, ByVal e As System.IO.FileSystemEventArgs)
If e.ChangeType = IO.WatcherChangeTypes.Changed Then
_eType = evtType.changed
notification()
End If
If e.ChangeType = IO.WatcherChangeTypes.Created Then
_eType = evtType.created
notification()
End If
If e.ChangeType = IO.WatcherChangeTypes.Deleted Then
_eType = evtType.deleted
notification()
End If
End Sub
Private Sub notification()
_mainForm.NotifyIcon1.ShowBalloonTip(500, "Folder Monitor", "A file has been " + [Enum].GetName(GetType(evtType), _eType), ToolTipIcon.Info)
End Sub
End Class
答案 0 :(得分:1)
您需要使用Control.Invoke,这不会在UI线程上运行委托(事件),但是当事件触发时,您可以使用Control.Invoke在UI线程上执行一段代码,在您的情况下,此代码将是一个显示工具提示的函数。
答案 1 :(得分:0)
谢谢,我通过在frmMain中执行以下操作并在另一个类中调用frmMain中的一个名为dispalyToolTip的新方法来解决这个问题。
在FrmMain这里是我做的:
添加了一名代表
Private Delegate Sub displayTooltipDelegate(ByVal tooltipText As String)
添加了我从其他类
调用的新方法Friend Sub displayTooltip(ByVal tooltipText As String)
If Me.InvokeRequired Then
Dim delegate1 As New displayTooltipDelegate(AddressOf displayTooltip)
Me.Invoke(delegate1, tooltipText)
Else
NotifyIcon1.ShowBalloonTip(500, "Folder Monitor", tooltipText, ToolTipIcon.Info)
End If
End Sub