I am developing an extension to ArcMap and trying to listen to the SelectionChanged event. There are several classes in my code that want to be notified when the selection changes so I was trying to write a simple wrapper to handle setting up the event handlers. The code works when ArcMap starts up and for the NewDocument event, but as soon as the OpenDocument event occurs, nothing works until the application is restarted. No exceptions (that I can tell) are thrown through the entire process. Any help would be greatly appreciated.
Update: I also noticed that after the OpenDocument event occurs, All of the IDocumentEvents stop working.
Update: I also noticed that after the OpenDocument event occurs, All of the IDocumentEvents stop working.
Code:
Imports ESRI.ArcGIS.ArcMapUI
Imports ESRI.ArcGIS.Carto
Imports ESRI.ArcGIS.Framework
Imports System.Windows.Forms
Public Class MapEvents
Implements IDisposable
Private Property _application As IApplication
Private Property _activeViewListening As Boolean
Public Event ActiveViewSelectionChanged()
Public Event ActiveViewItemDeleted(ByRef Item As Object)
Public Sub New(ByRef application As IApplication)
_application = application
Dim mxDocument As IMxDocument = application.Document
StartListening(mxDocument)
_activeViewListening = False
End Sub
Public Sub Dispose() Implements IDisposable.Dispose
Dim mxDocument As IMxDocument = _application.Document
StopListening(mxDocument)
StopListening(mxDocument.ActiveView)
_application = Nothing
End Sub
Private Sub StartListening(ByRef mxDocument As IMxDocument)
If (mxDocument Is Nothing) Then
Return
End If
Dim documentEvents As IDocumentEvents_Event = mxDocument
AddHandler documentEvents.NewDocument, AddressOf OnNewDocument
AddHandler documentEvents.OpenDocument, AddressOf OnOpenDocument
AddHandler documentEvents.BeforeCloseDocument, AddressOf OnBeforeCloseDocument
End Sub
Private Sub StopListening(ByRef mxDocument As IMxDocument)
If (mxDocument Is Nothing) Then
Return
End If
Dim documentEvents As IDocumentEvents_Event = mxDocument
RemoveHandler documentEvents.NewDocument, AddressOf OnNewDocument
RemoveHandler documentEvents.OpenDocument, AddressOf OnOpenDocument
RemoveHandler documentEvents.BeforeCloseDocument, AddressOf OnBeforeCloseDocument
End Sub
Private Sub StartListening(ByRef activeView As IActiveView)
If (_activeViewListening) Then
Return
End If
If (activeView Is Nothing) Then
Return
End If
Dim activeViewEvents As IActiveViewEvents_Event = activeView
AddHandler activeViewEvents.SelectionChanged, AddressOf OnActiveViewSelectionChanged
AddHandler activeViewEvents.ItemDeleted, AddressOf OnActiveViewItemDeleted
_activeViewListening = True
MessageBox.Show("Active View Listening = True")
End Sub
Private Sub StopListening(ByRef activeView As IActiveView)
If (activeView Is Nothing) Then
Return
End If
Dim activeViewEvents As IActiveViewEvents_Event = activeView
RemoveHandler activeViewEvents.SelectionChanged, AddressOf OnActiveViewSelectionChanged
RemoveHandler activeViewEvents.ItemDeleted, AddressOf OnActiveViewItemDeleted
_activeViewListening = False
MessageBox.Show("Active View Listening = False")
End Sub
Private Sub StartActiveViewListening()
Dim mxDocument As IMxDocument = _application.Document
StartListening(mxDocument.ActiveView)
End Sub
Private Sub OnNewDocument()
Try
StartActiveViewListening()
Catch ex As Exception
Dim errorForm As ErrorForm = New ErrorForm(ex)
errorForm.Show()
End Try
End Sub
Private Sub OnOpenDocument()
Try
StartActiveViewListening()
Catch ex As Exception
Dim errorForm As ErrorForm = New ErrorForm(ex)
errorForm.Show()
End Try
End Sub
Private Sub OnActiveViewSelectionChanged()
Try
MessageBox.Show("Active View Selection Changed.")
RaiseEvent ActiveViewSelectionChanged()
Catch ex As Exception
Dim errorForm As ErrorForm = New ErrorForm(ex)
errorForm.Show()
End Try
End Sub
Private Sub OnActiveViewItemDeleted(Item As Object)
Try
MessageBox.Show("Active View Item Deleted.")
RaiseEvent ActiveViewItemDeleted(Item)
Catch ex As Exception
Dim errorForm As ErrorForm = New ErrorForm(ex)
errorForm.Show()
End Try
End Sub
Private Function OnBeforeCloseDocument() As Boolean
Try
Dim mxDocument As IMxDocument = _application.Document
StopListening(mxDocument.ActiveView)
Catch ex As Exception
Dim errorForm As ErrorForm = New ErrorForm(ex)
errorForm.Show()
End Try
Return False
End Function
End Class